OpenGL:模糊文本周围的暗晕
我正在渲染绿色文本,其中一些是模糊的,带有一个固定的蓝色背景。透明度函数按预期工作,但我在文本的模糊区域得到了一个黑色的“光晕”。我花了好几天的时间阅读文章,尝试不同的解决方案,但都无济于事 前景图像用纯绿色(0,0,1)填充,alpha通道是定义文本和透明度的地方 我的问题可以通过访问站点并输入以下两个图像URL轻松演示: 前景: 背景: 此图显示了设置和带有暗晕的结果图像 为了弄清这一点,我编写了一个调试函数,在渲染每个层后读回后台缓冲区。从数字上看,所有的数学结果都是正确的 例如,如果我以10%的比例渲染预乘源图像的实体部分(例如,在以10%进行预乘之前,源是rgba[0,0,255,255]),并使用glBlendFunc(GL_ONE,GL_ONE_减去SRC_ALPHA),它是这样的OpenGL:模糊文本周围的暗晕,opengl,alphablending,Opengl,Alphablending,我正在渲染绿色文本,其中一些是模糊的,带有一个固定的蓝色背景。透明度函数按预期工作,但我在文本的模糊区域得到了一个黑色的“光晕”。我花了好几天的时间阅读文章,尝试不同的解决方案,但都无济于事 前景图像用纯绿色(0,0,1)填充,alpha通道是定义文本和透明度的地方 我的问题可以通过访问站点并输入以下两个图像URL轻松演示: 前景: 背景: 此图显示了设置和带有暗晕的结果图像 为了弄清这一点,我编写了一个调试函数,在渲染每个层后读回后台缓冲区。从数字上看,所有的数学结果都是正确的 例如,如果我
bkg = rgba[0, 0, 255, 255]
src = rgba[0, 25, 0, 25]
result = rgba[0, 25, 230, 255]
但当你看到这一点时,你基本上得到了一个深蓝色,看不到绿色,如图所示
那么我做错了什么?或者这是某种伽马/颜色匹配问题,绿色的增加不如蓝色的减少那么明显?这是一个简单的感知问题,与伽马相关。 从该裁剪输出开始:
如果您分割频道,则会得到(红色、绿色、蓝色):
监视器,包括您几乎可以肯定看到的sRGB LCD监视器,对像素值进行伽马缩放注1 以下是sRGB伽马函数的近似图注2: 当我们查看蓝色背景时(值
0,0255
=>0,0,1
),我们得到0,0,1
的输出。类似地,当我们看到字母内部的完全绿色时,我们会得到明显的亮度0,1,0
注3
现在想想边缘上的一个点会发生什么。也就是说,基本上是正确的,代码< 0127128 > /代码> ~= >代码> 0.05、0.5、0.5< /代码>。使用该图,我们得到的输出视在强度为0.00,0.218,0.218
。我们对像素亮度的感知是跨通道累加的,因此我们得到的整体亮度为0.436
这明显比字母的内部或外部更暗——你把它看作一条暗带
注1为什么?在实际亮度方面,其效果是使从例如
200
到201
的变化比从例如5
到6
的变化大得多。我们这样做是因为人类的对比感知基本上是百分比差异的函数。为了保持明显的均匀对比度,亮度必须是非线性的。注2事实上有点不同,但这基本上是正确的。具体来说,指数实际上是
2.4
,由于数值原因,它变得接近0.0
。有时会进行进一步修正,使其连续。注3不同的颜色通道也进行了缩放,以提供类似的视亮度。考虑
glBlendFuncSeparate(GL_-ONE,GL_-ONE,GL_-ONE,GL_-ZERO)
Andon:您的两个建议都会产生相同的视觉效果。同样的蓝色光环也存在。非常感谢您提供了这个详细的答案,并确认了我的怀疑,即这不是我的错误编程,而是其他一些东西。非常感谢您的专业知识。我想补充一点,似乎可以编写一个着色器来补偿这一点。我会把它作为一种可能性来研究,因为我真的很想让那个乐队离开。