1

我正在通过实现一个微型软件渲染器来学习可编程渲染管道。我尝试以“硬件”风格实现它。但是,我对 GPU 管道并不熟悉,并且遇到了一些均匀裁剪的问题。

根据这个线程,假设我们有两个点e0e1在 3D 眼睛坐标中,它们被投影到h0(-70, -70, 118, 120)h1(-32, -99, -13, -11)在 4D 齐次裁剪空间中。然后我们在 4D 齐次空间中进行插值,该段在 4D 点h0-h1被平面w = -xz = -1在 NDC 中)剪裁h(t)=t*h1+(1-t)*h2,其中t = 0.99. 不失一般性,假设我们有h0-h(0.99)一部分(可见的)馈送到光栅化阶段。所以我们需要生成对应的顶点属性h(0.99)(同顶点着色器的输出格式)。我的问题是如何生成这些新顶点的属性?

更新:我尝试使用 t 作为插值变量来获取 h(t) 的顶点属性,并得到合理的结果。我想知道为什么t来自 4D 空间可以在 3D 顶点属性中获得良好的插值结果?

4

1 回答 1

1

我想知道为什么 4D 空间中的 t 可以在 3D 顶点属性中获得良好的插值结果?

因为这就是数学的运作方式。或者更重要的是,这就是线性数学的工作原理。

无需深入研究数学,线性变换是两个空间之间的变换,它保留了原始空间的线性性质。例如,两条相互平行的线在线性变换后将保持平行。如果在 Y 方向执行 2 倍缩放,则新线将更长且离原点更远。但它们仍将是平行的。

假设我们有一条线 AB,并且您定义点 C,它是 A 和 B 之间的中点。如果您对 A、B 和 C 执行相同的线性变换,新点 C 1仍将在线A 上11。不仅如此,C 1仍将是新线的中点

我们甚至可以概括这一点。C 可以是符合以下等式的任何点C = (B-A)t + A: ,对于任何t。A、B 和 C 的线性变换不会影响t这个方程的变化。

事实上,这就是线性变换的真正含义:t对于原始空间中的所有点 A、B 和 C,它是保留在该方程中的变换。

您的空间中有 4 个维度的事实最终与上面的向量方程无关。任何空间中的线性变换都将保留t. 矩阵变换表示从一个空间到另一个空间的线性变换(通常)。

此外,您原来的 3D 位置实际上是 4D 位置,假设 W 为 1.0。

但是请注意,从剪辑空间(4D 同质)到标准化设备坐标空间(3D 非同质)的转换是非线性的。除以 W 不是线性变换。这就是您在 4D 同质剪辑空间中进行剪辑的原因之一,我们仍然保留原始位置和剪辑空间之间的线性关系。

这也是每个顶点输出的透视正确插值很重要的原因:因为您在(窗口空间)中进行光栅化的空间不是顶点着色器(剪辑空间)输出的原始空间的线性变换。这意味着t没有妥善保存。插值时,您通常需要对其进行补偿,以保持每个顶点值的线性关系。

于 2016-05-30T15:28:57.440 回答