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