OpenGL纹理合并器 - 渐变纹理

时间:2009-09-17 07:03:59

标签: opengl textures

我有2个RGBA8纹理:

A)“主”纹理,包含在所有通道中显示的数据

B)“渐变”纹理,只有alpha中有意义的数据(当然这应该只是一个A8纹理)

使用OpenGLES 1.1纹理组合器,我希望生成的纹理元素从纹理#A复制RGB,并使用从两种纹理调制的alpha(来自纹理B的纹理A * alpha的alpha)。

我的纹理合并器代码遇到了问题(我已经尝试过用它来修改),并且想知道是否有人能发现问题:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, geometryP->texName);
glTexCoordPointer(2, GL_BYTE, 0, geometryP->texCoordsP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, mGradientTextureName);
glTexCoordPointer(2, GL_BYTE, 0, geometryP->texCoordsP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

我得到的结果基本上看起来就像纹理#A(主纹理)中的RGBA。

3 个答案:

答案 0 :(得分:2)

我可能会离开,但您确定它会注意到纹理坐标问题吗?在调用glClientActiveTexture ...

之前,您似乎没有glTexCoordPointer

答案 1 :(得分:1)

BindTexture,TexEnv,glEnable(GL_TEXTURE_2D)和纹理矩阵受ActiveTexture影响,但TexCoordPointer不受影响。实际上,第二个TexCoordPointer是不必要的,第一次调用可以按任何顺序完成。我一直在捣蛋,我最近的代码是:

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, geometryP->texName);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mGradientTextureName);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);  
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

我觉得这个新代码是正确的,但我的渐变纹理可能是错误的,所以我还在努力:)

答案 2 :(得分:0)

Bahbar,抱歉你对glClientActiveTexture完全正确 - 我以前没有听说过那个(并且在我上一次回复中它与glActiveTexture混淆)。但是在使用那个并为TEXTURE1设置glEnableClientState和glTexCoordPointer后,它可以工作!