OpenGL中灰度图像的着色

OpenGL中灰度图像的着色,opengl,textures,Opengl,Textures,我正在尝试使用两种颜色在OpenGL中以彩色作为纹理绘制灰度图像。黑色变为颜色1,白色变为颜色2。使用GL\u RGBA加载纹理 我尝试了两种解决方案: (一) 将图像加载为纹理 在屏幕上绘制图像 启用混合 glBlendFunc(GL_一减色,GL_零)并使用颜色1绘制矩形 glBlendFunc(GL_一减色,GL_一)并使用颜色2绘制矩形 但是。。。当我应用第一种颜色时,屏幕上并没有黑色,当应用第二种颜色时,它也会与第一种颜色结合 (二) 将图像另存为纹理,但不使用灰度图像,请使用与

我正在尝试使用两种颜色在OpenGL中以彩色作为纹理绘制灰度图像。黑色变为颜色1,白色变为颜色2。使用
GL\u RGBA
加载纹理

我尝试了两种解决方案:

(一)

  • 将图像加载为纹理
  • 在屏幕上绘制图像
  • 启用混合
  • glBlendFunc(GL_一减色,GL_零)并使用颜色1绘制矩形
  • glBlendFunc(GL_一减色,GL_一)并使用颜色2绘制矩形
但是。。。当我应用第一种颜色时,屏幕上并没有黑色,当应用第二种颜色时,它也会与第一种颜色结合

(二)

  • 将图像另存为纹理,但不使用灰度图像,请使用与灰度相同的alpha通道的白色图像
  • 使用颜色1绘制矩形
  • 画图
但是。。。绘制图像时,在图像是透明的情况下,它不使用color1,而是使用带有glColor的当前颜色集

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

您的#2想法会奏效,但似乎您没有正确设置混合。 应该是:

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
你的#2想法行得通,但似乎你没有正确设置混合。 应该是:

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

一般来说,在处理OpenGL纹理管道时,我建议写下您想要的最终结果。在这里,您希望将灰度颜色用作两种颜色之间的插值

out_color = mix(color1, color2, texValue)
这方面的数学实际上是这样的:

out_color = color1 + (color2 - color1) * texValue
所以。。。有没有一个价值观可以帮助做到这一点?是的,它也被称为
glu-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)

没有必要像你试着做的那样画多次或比这更复杂的东西。纹理管道有很多方法可以控制。学习它们对你有利

一般来说,在处理OpenGL纹理管道时,我建议写下您想要的最终结果。在这里,您希望将灰度颜色用作两种颜色之间的插值

out_color = mix(color1, color2, texValue)
这方面的数学实际上是这样的:

out_color = color1 + (color2 - color1) * texValue
所以。。。有没有一个价值观可以帮助做到这一点?是的,它也被称为
glu-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相同的结果。我尝试过的解决方案。公式应该是这样的:color1*texValue+color2*(1-texValue)哈?如果交换颜色1和颜色2,则公式是等效的。这确实有效,而且是达到你要求的最快方式。顺便说一句,根据你的公式,黑色不会变成彩色1。它去了color2!我的是color1。公式不是等价的!如果color1为红色,color2为绿色,会发生什么情况?out_颜色将始终为红色,不应该为红色。如果color1映射为黑色或白色并不重要…您认为-color1在乘法中做什么?随着texValue的增加,它会从outcolor中去除红色。实际上,这个公式并不是很好。我得到了与1相同的结果。我尝试过的解决方案。公式应该是这样的:color1*texValue+color2*(1-texValue)哈?如果交换颜色1和颜色2,则公式是等效的。这确实有效,而且是达到你要求的最快方式。顺便说一句,根据你的公式,黑色不会变成彩色1。它去了color2!我的是color1。公式不是等价的!如果color1为红色,color2为绿色,会发生什么情况?out_颜色将始终为红色,不应该为红色。如果color1映射为黑色或白色并不重要…您认为-color1在乘法中做什么?随着texValue的增加,它将从outcolor中删除红色。