0

我有 2 个 RGBA8 纹理:

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

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

使用 OpenGLES 1.1 纹理组合器,我希望生成的纹素从纹理#A 复制 RGB,并使用从两个纹理调制的 alpha(来自纹理 A 的 alpha * 来自纹理 B 的 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。

4

3 回答 3

2

我可能会离开,但你确定这是纹理坐标问题吗?你似乎没有glClientActiveTexture在打电话之前做glTexCoordPointer...

于 2009-09-18T22:59:06.867 回答
1

BindTexture、TexEnv、glEnable(GL_TEXTURE_2D) 和 Texture Matrix 受 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);

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

于 2009-09-19T16:09:51.337 回答
0

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

于 2009-09-19T20:35:59.803 回答