我想以纯白色渲染纹理形状。 我的意思是,我想渲染兔子的形状,但完全黑色。我有兔子的彩色纹理,我想用它来使它全白。我希望保持alpha透明。
我可以使用以下方法用黑色渲染它:
glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
但是我怎么能做到白色?
这是我的兔子:
https://raw.githubusercontent.com/wrobelp/GameEngine/master/res/rabbit.png
像这样工作:
glBindTexture(GL_TEXTURE_2D, texId);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
// Draw textured quad.
// Back to normal
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
答案 0 :(得分:0)
我们的想法是用白色替换兔子纹理的颜色通道,同时保持alpha通道不变。
GLfloat white [4] = { 1.0f, 1.0f, 1.0f, 1.0f };
glBindTexture (GL_TEXTURE_2D, rabbitTexture);
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, white);
glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); // RGB = White
glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); // Alpha = Mask
glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
这需要OpenGL 1.3才能工作,但是没有片段着色器就可以完成,因为你提到你不想使用它。
答案 1 :(得分:0)
您可以使用GL_ADD
作为纹理环境模式来执行此操作:
glBindTexture(GL_TEXTURE_2D, texId);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
// Draw textured quad.
将GL_ADD
用于env模式意味着为RGB组件添加纹理颜色和片段颜色。通过glColor4f()
调用将片段颜色设置为白色,两者的总和将始终为白色。
对于GL_ADD
模式下的alpha分量,纹理alpha和片段alpha 乘以。这有点令人惊讶,但这是它的指定方式。由于上面的代码将片段alpha设置为1.0f
,因此乘法的结果将是纹理alpha值。
然后,通过使用公共(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
作为混合函数,纹理的不透明部分将使用纹理env计算的结果颜色(白色)绘制,而之前的颜色保持不变纹理的透明部分。