我正在尝试使用两种颜色在OpenGL中绘制彩色灰度图像作为纹理。黑色转到color1,白色转到color2。使用GL_RGBA
加载纹理。
我尝试了两种解决方案:
1)
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
并使用color1 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
并使用color2 但是......当我应用第一种颜色时,屏幕上没有黑色,当应用第二种颜色时,它也会与第一种颜色结合使用。
2)
但是......当绘制图像时,它不使用color1,其中图像是透明的,而是使用当前颜色设置为glColor。
任何帮助都会派上用场:)
答案 0 :(得分:1)
通常,在处理OpenGL纹理管道时,我建议写下你想要的最终结果。在这里,您希望将灰度颜色用作两种颜色之间的插值。
out_color = mix(color1, color2, texValue)
这个的数学实际上是这样的:
out_color = color1 + (color2 - color1) * texValue
所以...有texture environment值有助于实现这一目标吗?是的,它也被称为GL_BLEND
(不要混淆glEnable(GL_BLEND)
启用的帧缓冲区的混合。
所以...像
这样的东西// pass color1 as the incoming color to the texture unit
glColor4fv(color1);
GLfloat color2[4] = { ... };
// ask for the texture to be blended/mixed/lerped with incoming color
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_BLEND);
// specify the color2 as per the TexEnv documentation
glTexEnvfv(GL_TEXTURE_2D, GL_TEXTURE_ENV_COLOR, color2)
没有必要绘制多次或比这更复杂的东西,就像你试图做的那样。纹理管道有很多方法可以控制。了解他们的优势!
答案 1 :(得分:0)
你的#2想法会起作用,但好像你没有正确设置混合。 它应该是:
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );