在字体渲染中,通常使用subpixel渲染。这里的基本思想是将像素分解为RGB分量,然后分别计算每个像素的值。由于每个分量都小于整个像素,因此可以实现更高质量的抗锯齿。
对于光线跟踪器,显然有类似的方法可以做到这一点。您分别在每个子通道上进行重构过滤。
但是,令我感到惊讶的是,我确实找不到这样做的射线追踪器的参考。特别是如果您已经在进行光谱渲染,这似乎是一件显而易见的事情。有一篇我从未听说过的期刊的论文,似乎与之相关。但是总的来说,亚像素渲染似乎并不是一件常事。我的问题:为什么不呢?
在字体渲染中,通常使用subpixel渲染。这里的基本思想是将像素分解为RGB分量,然后分别计算每个像素的值。由于每个分量都小于整个像素,因此可以实现更高质量的抗锯齿。
对于光线跟踪器,显然有类似的方法可以做到这一点。您分别在每个子通道上进行重构过滤。
但是,令我感到惊讶的是,我确实找不到这样做的射线追踪器的参考。特别是如果您已经在进行光谱渲染,这似乎是一件显而易见的事情。有一篇我从未听说过的期刊的论文,似乎与之相关。但是总的来说,亚像素渲染似乎并不是一件常事。我的问题:为什么不呢?
Answers:
尽管差异可能不会特别明显,但我希望采样时会考虑到精确的像素几何形状,以使图像更准确。您只需要根据该颜色子像素的(平均)位置偏移每个颜色分量的像素中心即可。注意,并非所有像素布局在像素和子像素之间都具有一一对应的关系。
例如,penTile RGBG的绿色子像素是红色和蓝色的两倍,如Wikipedia上的图像所示:
我不知道有任何技术原因会阻止该技术用于生成任意全彩图像。实际上,与白色文本上的黑色相比,彩色场景的伪影要少得多,这使得颜色差异最难伪装。
渲染光线追踪场景和渲染字体之间的相关区别在于,字体倾向于按需渲染,并且可以考虑使用的屏幕。与此相反,通常会预先渲染光线跟踪的场景,然后将其显示在许多不同类型的屏幕上(具有不同的像素几何形状)。例如,在网页上显示光线跟踪的图像将阻止将其定制为特定的监视器类型。
如果您正在设计实时光线跟踪程序,并且有权检查显示器的像素几何形状,则可以将光线跟踪到特定的子像素布局。但是,只能针对单一类型的像素几何体来定制生成静态图像的脱机射线跟踪,这将使图像在任何其他像素几何体上看起来都更差。您可以通过渲染一组不同的图像并在以后将其显示在特定类型的监视器上时选择合适的图像来解决此问题。
因此,没有理由不能为光线跟踪器开发亚像素渲染,但这意味着要考虑到监视器的一个并非总是已知的方面。要记住的另一件事是,您将针对不断萎缩的市场开发此软件。亚像素渲染对于分辨率相对较低的屏幕很有用。随着越来越多的屏幕(甚至是移动屏幕)接近高分辨率,以至于人眼无法检测到亚像素渲染带来的差异,您的工作可能比实际用途更具理论意义。
当然,您可以将亚像素渲染用于任意图像。 但是,子像素渲染实际上是一种通用的2D图像处理技术-它与光线跟踪没有任何关系。您也可以将其与任何其他3D渲染方法一起使用,甚至与简单的2D绘图,照片甚至视频一起使用。
因此,我想说的是“用于射线追踪的亚像素渲染”实际上是将最好分开处理的两个不同的问题域混合在一起。唯一相关的联系是,如果您要实时跟踪光线并知道要使用亚像素渲染在屏幕上绘制结果图像,则可以使用此信息来优化像素密度(和宽高比)比率)(例如,对于典型的RGB LCD屏幕使用3倍的水平像素密度)。
可能造成混乱的原因是,在当前的计算机系统上,子像素渲染通常仅用于文本,并且通常集成到字体渲染代码中。造成这种情况的主要原因可以说是历史原因,但这也是最大的收益所在(就视觉改善和可读性而言)。
此外,由于文本倾向于由简单且重复的矢量形状组成,因此将子像素渲染集成到字体渲染器中提供了一些额外的优化机会,而不仅仅是将文本渲染到高分辨率缓冲区中,然后进行后处理。
也就是说,我完全希望最终随着技术的成熟,我们将转向一个系统,在该系统中,亚像素渲染仅由GPU透明地完成,或者可能由屏幕本身透明地完成。
(这很可能要求应用程序要充分利用此功能来处理较小的物理像素,并且形状不一定与“逻辑像素”相同。但是再说一次,我们已经在高DPI屏幕的方向。)