OpenGL ES:如何用颜色着色纹理

时间:2011-12-19 09:36:56

标签: opengl-es colors textures mask tint

我有alpha纹理。我想用一些颜色着色,所以它会根据颜色的alpha值进行着色,但是总的不透明度只能由纹理alpha定义。

这类似于多纹理,但使用颜色而不是第二纹理。 怎么做?

(更新) 我试图设置纹理合并器。颜色很好,但是有alpha的问题 - 它不会从纹理中获取值(如蒙版)。 我的代码此刻:

glActiveTexture (GL_TEXTURE0); // do we need stage #1?
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT);
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_OPERAND2_RGB, GL_ONE_MINUS_SRC_ALPHA);
// this doesn't work for alpha:
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

截图:

没有着色:

enter image description here

RGBA =(0,0.5,1,0.5)的色调:

enter image description here

3 个答案:

答案 0 :(得分:0)

您是否使用glEnable(GL_BLEND)尝​​试了上述代码?

答案 1 :(得分:0)

您可能希望阅读OpenGL documentation透明度,15.020:“我如何实现透明效果?”

确保以正确的顺序渲染场景(您的答案不显示任何渲染)。

确保使用所需的混合功能。

我可以提出的另一个建议是开始使用shaders。我使用它时总是感觉更有控制力。

答案 2 :(得分:0)

我得到相同的结果(在Android三星Galaxy S上运行,因为它的价值)。我不明白为什么它不起作用。文档似乎相当清楚。

对我而言,如果我使用GL_MODULATE作为RGB,它就有效。如果我使用GL_ADD或GL_ADD_SIGNED,它会再次失败。即使在alpha上使用GL_MODULATE,在RGB上使用这些模式时也会产生相同的错误行为。您可能会陷入调制颜色而不是插入颜色。

总之,这对我有用:

glActiveTexture (GL_TEXTURE0); // do we need stage #1?
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
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_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);