在OpenGL中着色灰度图像

时间:2009-12-03 02:14:53

标签: opengl textures

我正在尝试使用两种颜色在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)

  • 将图像保存为纹理但不使用灰度图像,使用与灰度相同的Alpha通道的白色图像
  • 使用color1
  • 绘制矩形
  • 绘制图片

但是......当绘制图像时,它不使用color1,其中图像是透明的,而是使用当前颜色设置为glColor。

任何帮助都会派上用场:)

2 个答案:

答案 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 );