4D 同质 space 中的裁剪问题?

Problems of clipping in 4D homogeneous space?

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

根据this thread,假设我们在3D眼睛坐标中有两个点e0e1,投影到h0(-70, -70, 118, 120)h1(-32, -99, -13, -11) 4D 均匀剪裁 space。然后我们在 4D 齐次 space 中进行插值,片段 h0-h1 在 4D 点 h(t)=t*h1+(1-t)*h2 处被平面 w = -x (NDC 中的 z = -1 )剪切,其中 t = 0.99。不失一般性,假设我们有 h0-h(0.99) 部分(可见)馈送到光栅化阶段。所以我们需要生成h(0.99)对应的顶点属性(和vertex shader的输出格式一样)。我的问题是如何生成这些新顶点的属性?

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

I am wondering why the t from 4D space can get good interpolation result in 3D vertex properties?

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

不用太深入数学,linear transformation 是两个 space 之间的转换,它保留了原始 space 的线性特性。例如,两条相互平行的直线经过线性变换后仍保持平行。如果您在 Y 方向执行 2 倍缩放,则新线会更长并且离原点更远。但它们仍然会平行。

假设我们有一条直线AB,你定义了点C,它是A和B的中点。如果你对A、B、C进行同样的线性变换,新的点C1仍然在A1B1行。不仅如此,C1仍将是新线的中点

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

事实上,这就是线性变换的真正含义:对于原始 space 中的所有点 A、B 和 C,它是一种在方程式中保留 t 的变换。 =20=]

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

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

但是请注意,从 clip-space(4D 均匀)到 normalized-device-coordinate space(3D 非均匀)的转换是 非线性的 .除以 W 不是线性变换。这就是为什么你在 4D 均匀剪辑-space 中进行剪辑的原因之一,我们仍然保留原始位置和剪辑-space.

之间的线性关系

这也是 perspective-correct interpolation of per-vertex outputs 重要的原因:因为 space 您在 (window space) 中进行的光栅化 不是 顶点着色器(剪辑 space)输出的原始 space 的线性变换。这意味着 t 没有被妥善保存。插值时,您通常需要对此进行补偿,以保持每个顶点值的线性关系。