别名光栅化:为什么要在中心采样像素?
Aliased rasterization: why sampling pixel at center?
OpenGL 和 Direct3D 在光栅化过程中都使用像素的中心作为采样点(没有抗锯齿)。
例如这里引用自D3D11 rasterization rules:
Any pixel center which falls inside a triangle is drawn
我试图找出对 x 和 y 使用 (0.5, 0.5)
而不是 (0.0, 0.0)
或 0.0 - 1.0f
范围内的任何其他内容的原因。
结果可能会翻译一点,但这真的很重要吗?它会产生一些可见的伪影吗?可能是,它使某些算法更难实现?还是只是约定俗成?
同样,我在这里不讨论多重采样。
那么是什么原因呢?
也许这不是你问题的答案,但我试着从ray tracing的角度回答你的问题。
在光线追踪中,您可以获得场景中每个点的颜色。但是由于我们的像素数量有限,您需要将图像下采样到屏幕像素。
在光线追踪中,如果每个像素使用 1 条光线,我们通常会选择中心点来创建我们的光线,从而提供最正确的渲染结果。在下图中,当您选择像素的角或中心时,我尝试显示差异。当您的对象远离渲染屏幕时,距离会变大。
如果你对每个像素使用不止一条光线,比如说 5 条光线(4 个角 + 1 个中心)并对结果进行平均,你当然会得到更逼真的图像(将更好地处理混叠问题)但是它会像你猜的那样慢。
因此,opengl 和 directX 为每个像素取一个样本而不是多重采样并取平均值(性能问题)和中心点可能给出最佳结果可能是相同的想法。
编辑:
对于区域光栅化,使用像素中心,因为如果像素中心保留在区域内,则可以保证 至少 50% 的像素 在形状内。(除了shape corners)这就是为什么因为比例大于像素着色的一半。
对于其他角点选择,没有通用规则。让我们看看下面的示例图像。黑点(左下角)在区域之外,不应绘制(当你看它时,超过一半的像素在外面。但是,如果你看蓝点,%80 的像素在区域内,但由于左下角在区域之外,不应绘制
这个回答主要集中在OP对
Cagkan Toptas 回答:
Thanx for the answer, but my question is: why does it give better
results? Does it at all? If yes, what is the explanation?"
这取决于您如何定义 "better" 结果。从图像质量的角度来看,只要基元没有特别对齐(投影后),它就不会发生太大变化。
在 (0,0) 处仅使用一个样本而不是 (0.5, 0.5) 只会 将场景 移动半个像素(当然是在两个轴上)。在任意放置原语的一般情况下,平均误差应该相同。
但是,如果您想要 "pixel-exact" 绘图(即用于文本和 UI,以及全屏 post 处理效果),您只需要使用考虑到基础实施的约定,并且这两个约定都可以工作。
"center at half integers"规则的一个优点是你可以通过简单的floor(floating_point_coords)
操作得到最近像素的整数像素坐标(相对于样本位置),这比四舍五入到最接近的整数。
OpenGL 和 Direct3D 在光栅化过程中都使用像素的中心作为采样点(没有抗锯齿)。
例如这里引用自D3D11 rasterization rules:
Any pixel center which falls inside a triangle is drawn
我试图找出对 x 和 y 使用 (0.5, 0.5)
而不是 (0.0, 0.0)
或 0.0 - 1.0f
范围内的任何其他内容的原因。
结果可能会翻译一点,但这真的很重要吗?它会产生一些可见的伪影吗?可能是,它使某些算法更难实现?还是只是约定俗成?
同样,我在这里不讨论多重采样。
那么是什么原因呢?
也许这不是你问题的答案,但我试着从ray tracing的角度回答你的问题。
在光线追踪中,您可以获得场景中每个点的颜色。但是由于我们的像素数量有限,您需要将图像下采样到屏幕像素。
在光线追踪中,如果每个像素使用 1 条光线,我们通常会选择中心点来创建我们的光线,从而提供最正确的渲染结果。在下图中,当您选择像素的角或中心时,我尝试显示差异。当您的对象远离渲染屏幕时,距离会变大。
如果你对每个像素使用不止一条光线,比如说 5 条光线(4 个角 + 1 个中心)并对结果进行平均,你当然会得到更逼真的图像(将更好地处理混叠问题)但是它会像你猜的那样慢。
因此,opengl 和 directX 为每个像素取一个样本而不是多重采样并取平均值(性能问题)和中心点可能给出最佳结果可能是相同的想法。
编辑:
对于区域光栅化,使用像素中心,因为如果像素中心保留在区域内,则可以保证 至少 50% 的像素 在形状内。(除了shape corners)这就是为什么因为比例大于像素着色的一半。
对于其他角点选择,没有通用规则。让我们看看下面的示例图像。黑点(左下角)在区域之外,不应绘制(当你看它时,超过一半的像素在外面。但是,如果你看蓝点,%80 的像素在区域内,但由于左下角在区域之外,不应绘制
这个回答主要集中在OP对 Cagkan Toptas 回答:
Thanx for the answer, but my question is: why does it give better results? Does it at all? If yes, what is the explanation?"
这取决于您如何定义 "better" 结果。从图像质量的角度来看,只要基元没有特别对齐(投影后),它就不会发生太大变化。 在 (0,0) 处仅使用一个样本而不是 (0.5, 0.5) 只会 将场景 移动半个像素(当然是在两个轴上)。在任意放置原语的一般情况下,平均误差应该相同。
但是,如果您想要 "pixel-exact" 绘图(即用于文本和 UI,以及全屏 post 处理效果),您只需要使用考虑到基础实施的约定,并且这两个约定都可以工作。
"center at half integers"规则的一个优点是你可以通过简单的floor(floating_point_coords)
操作得到最近像素的整数像素坐标(相对于样本位置),这比四舍五入到最接近的整数。