【问题标题】:OpenGL: Dark Halos Around Blurred TextOpenGL:模糊文本周围的暗晕
【发布时间】:2015-04-23 08:26:48
【问题描述】:

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

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

访问http://www.andersriggelsen.dk/glblendfunc.php 网站并输入以下两个图片网址,即可轻松演示我的问题:

前台:http://troikatronix.com/files/text320x240.png

背景:http://troikatronix.com/files/solid-blue.png

这张图片显示了设置和生成的带有暗光晕的图像。

为了深入了解这一点,我编写了一个调试函数来在每一层渲染后读回后台缓冲区。从数值上看,数学结果都是正确的。

例如,如果我以 10% 渲染预乘源图像的实心部分(例如,在预乘 10% 之前,源是 rgba[0, 0, 255, 255])并使用 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)是这样的

bkg = rgba[0, 0, 255, 255]
src = rgba[0, 25, 0, 25]
result = rgba[0, 25, 230, 255]

但是当你看到它时,你基本上会得到一个深蓝色而看不到绿色,如图所示

那么我做错了什么?或者这是某种伽玛/颜色匹配问题,绿色的增加不像蓝色的减少那样明显?

【问题讨论】:

  • 考虑glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
  • Andon:你的两个建议都会产生相同的视觉效果。存在相同的蓝色光晕。

标签: opengl alphablending


【解决方案1】:

这是一个简单的感知问题,和伽玛有关。

从这个裁剪后的输出开始:

如果你拆分频道,你会得到(红、绿、蓝):

显示器(包括您几乎可以肯定看到的 sRGB LCD 显示器)会对像素值进行伽马缩放注意 1

这是 sRGB 伽马函数的近似图注 2

当我们查看蓝色背景(值0,0,255=>0,0,1)时,我们得到0,0,1 的输出。同样,当我们查看字母内部完全绿色时,我们会看到0,1,0note 3 的明显亮度。

现在想想边缘上的一点会发生什么。假设它基本上在中间0,127,128~=>0.0,0.5,0.5。使用该图,这为我们提供了0.00,0.218,0.218 的输出表观强度。我们对像素亮度的感知是跨通道叠加的,因此我们得到了0.436 的整体亮度。

这明显比字母的内部或外部更暗——你认为它是一条暗带!


注释 1为什么?它具有从例如进行更改的效果。 200201 的实际亮度比从例如56。我们这样做是因为人类的对比感知基本上是百分比差异的函数。 为了保持明显均匀的对比度,亮度必须是非线性的。
注意 2在现实中有点不同,但这基本上是对的。具体来说,指数实际上是2.4,由于数值原因,它变成接近0.0 的线性。有时会进行进一步的校正以使其 C1 连续。
注 3不同的颜色通道也被缩放以提供相似的表观亮度。

【讨论】:

  • 非常感谢您提供如此详细的回答,并确认我怀疑这不是我的错误编程而是其他原因。非常感谢您的专业知识。我要补充一点,似乎可以编写一个着色器来弥补这一点。我会考虑这种可能性,因为我真的很想让那个乐队离开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多