抗锯齿和伽马补偿

时间:2010-02-10 00:47:19

标签: graphics antialiasing gamma

计算机屏幕上像素的发光度通常与像素的数字RGB三元组值线性相关。早期CRT的非线性响应需要补偿非线性编码,我们今天继续使用这种编码。

通常我们在电脑屏幕上制作图像并在那里使用它们,所以一切正常。但是当我们使用抗锯齿时,非线性 - 称为伽玛 - 意味着我们不能仅将0.5的alpha值添加到50%的覆盖像素并期望它看起来正确。 α值为0.5仅为0.5 ^ 2.2 = 22%,亮度为α为1.0,典型伽马值为2.2。

是否有广泛建立的抗锯齿伽马补偿最佳实践?你有日常使用的宠物方法吗?有没有人用不同的技术看过有关结果和人类对图形输出质量的看法的研究?

我曾考虑过做标准的X ^(1 / 2.2)补偿,但这在计算上非常强烈。不过,也许我可以使用256条目查找表来加快速度。

4 个答案:

答案 0 :(得分:2)

Jim Blinns - “Dirty Pixels”一书通过使用16位数学加上查找表来准确地返回并转发到线性色彩空间,概述了快速而良好的合成计算。这个人在NASA的可视化工作,他知道他的东西。

答案 1 :(得分:2)

我试图回答,但现在主要是为了参考实际问题:

首先,国际电联的建议(http://www.itu.int/rec/T-REC-H.272-200701-I/en)可以应用于编程(但你必须知道你的东西)。

Jim Blinn的“符号,符号,符号”,第9章,有一个非常详细的数学和感知错误分析,虽然他只涉及合成(许多其他图形任务也受到影响)。

他建立的符号也可以用来推导一种处理伽玛的方法,或检查这样做的给定方式是否实际上是正确的。非常方便,我的宠物方法(主要是因为我发现它独立但后来发现了他的书)。

答案 2 :(得分:1)

查找表经常用于此类工作。它们小而快。

但无论是查找还是某些公式,如果最终结果是图像文件,并且格式允许,最好将颜色配置文件或至少伽玛值保存在文件中供以后查看,而不是尝试调整RGB值自己。

原因:对于典型的字节值R,G,B通道,每个像素的每个通道都有256个唯一值。这几乎足以让人眼看起来很好(我希望“字节”被定义为九位!)除了琐碎的值反转之外,任何类型的数学都会为这些值中的某些值进行多对一映射。对于R,G或B,每个像素的输出不会有256个值,但要少得多。这可能导致轮廓,锯齿,颜色噪音和其他不良。

除了精度问题之外,如果需要任何类型的质量,所有堆肥,混合,混合,色彩校正,假镜头光斑添加,色度键控等等都应该在线性RGB空间中完成,其中R的值,G和B与物理光强度成比例。图像数学模拟物理光数学。但是,如果终极速度至关重要,那么就有办法作弊。

答案 3 :(得分:0)

生成图像时,通常在线性颜色空间(如线性RGB或CIE颜色空间之一)中工作,然后在最后转换为非线性RGB空间。可以通过硬件或通过查找表或甚至通过棘手的数学加速转换。 (参见其他答案的参考文献。)

当执行alpha混合(例如,将此图标渲染到此背景上)时,通常会省略这种精度以支持速度。通过使用alpha作为参数进行lerping,直接在非线性RGB空间中计算结果。这不是“正确的”,但在大多数情况下它已经足够好了。特别适用于台式机上的图标等。

如果您尝试进行更正确的混合,则将其视为原始渲染。在线性空间中工作(可能需要初始转换),然后在最后转换为非线性显示空间。

现在很多图形都使用sRGB作为非线性显示色彩空间。如果我没记错的话,sRGB非常类似于2.2的伽玛,但是对低端的值进行了调整。