【问题标题】:OpenGL Texture Combiner - gradient textureOpenGL Texture Combiner - 渐变纹理
【发布时间】:2010-11-29 01:24:23
【问题描述】:

我有 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。

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    我可能不在,但你确定这是纹理坐标问题吗?在调用glTexCoordPointer 之前,您似乎没有在做glClientActiveTexture...

    【讨论】:

      【解决方案2】:

      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);
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          相关资源
          最近更新 更多