LWJGL如何渲染白色的纹理形状

时间:2014-11-08 00:52:04

标签: opengl blending

我想以纯白色渲染纹理形状。 我的意思是,我想渲染兔子的形状,但完全黑色。我有兔子的彩色纹理,我想用它来使它全白。我希望保持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);

2 个答案:

答案 0 :(得分:0)

这可以使用纹理合并器来完成。

我们的想法是用白色替换兔子纹理的颜色通道,同时保持alpha通道不变。

设置纹理合成器以将常量白色与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计算的结果颜色(白色)绘制,而之前的颜色保持不变纹理的透明部分。