Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL:模糊文本周围的暗晕_Opengl_Alphablending - Fatal编程技术网

OpenGL:模糊文本周围的暗晕

OpenGL:模糊文本周围的暗晕,opengl,alphablending,Opengl,Alphablending,我正在渲染绿色文本,其中一些是模糊的,带有一个固定的蓝色背景。透明度函数按预期工作,但我在文本的模糊区域得到了一个黑色的“光晕”。我花了好几天的时间阅读文章,尝试不同的解决方案,但都无济于事 前景图像用纯绿色(0,0,1)填充,alpha通道是定义文本和透明度的地方 我的问题可以通过访问站点并输入以下两个图像URL轻松演示: 前景: 背景: 此图显示了设置和带有暗晕的结果图像 为了弄清这一点,我编写了一个调试函数,在渲染每个层后读回后台缓冲区。从数字上看,所有的数学结果都是正确的 例如,如果我

我正在渲染绿色文本,其中一些是模糊的,带有一个固定的蓝色背景。透明度函数按预期工作,但我在文本的模糊区域得到了一个黑色的“光晕”。我花了好几天的时间阅读文章,尝试不同的解决方案,但都无济于事

前景图像用纯绿色(0,0,1)填充,alpha通道是定义文本和透明度的地方

我的问题可以通过访问站点并输入以下两个图像URL轻松演示:

前景:

背景:

此图显示了设置和带有暗晕的结果图像

为了弄清这一点,我编写了一个调试函数,在渲染每个层后读回后台缓冲区。从数字上看,所有的数学结果都是正确的

例如,如果我以10%的比例渲染预乘源图像的实体部分(例如,在以10%进行预乘之前,源是rgba[0,0,255,255]),并使用glBlendFunc(GL_ONE,GL_ONE_减去SRC_ALPHA),它是这样的

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:您的两个建议都会产生相同的视觉效果。同样的蓝色光环也存在。非常感谢您提供了这个详细的答案,并确认了我的怀疑,即这不是我的错误编程,而是其他一些东西。非常感谢您的专业知识。我想补充一点,似乎可以编写一个着色器来补偿这一点。我会把它作为一种可能性来研究,因为我真的很想让那个乐队离开。