OpenGL ES:如何用颜色对纹理进行着色

5

我有一个带有透明度的纹理,现在想要使用某种颜色对其进行着色,这样它会根据颜色的透明度值变成彩色,但总体的不透明度仅由纹理的透明度来定义。

这类似于多重纹理,但是用颜色替代了第二个纹理。 如何实现呢?

(更新) 我已经尝试设置纹理合并器,颜色正确着色,但是透明度存在问题 - 它没有从纹理中获取值(像掩码)。 此刻我的代码如下:

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


你的代码看起来没问题。能否请您附上alpha问题的截图或描述一下出了什么问题? - iHunter
你可以上传纹理本身吗? - Christian Neverdal
有影响吗?纹理是一个带有透明掩码的树(如第一张截图所示)。树的渲染是在设置代码之后通过 glDrawArrays 完成的。 - brigadir
3个回答

0
你尝试过使用glEnable(GL_BLEND)的上述代码吗?

0

你可能想要阅读关于透明度的OpenGL文档,15.020:“如何实现透明效果?”

确保你按正确的顺序渲染场景(你的答案没有显示任何渲染)。

确保你使用所需的混合函数。

我可以提出另一个建议,那就是开始使用着色器。当我使用它们时,我总是感觉更加掌控。


0

我在 Android Samsung 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);

是的,使用调制模式一切都正常,但它看起来不像我想要的。我会在这里加上+50,以免失去它。 - brigadir
感谢慷慨奖赏。抱歉我帮不上更多忙。 - Martin Stone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接