4D 同质 space 中的裁剪问题?
Problems of clipping in 4D homogeneous space?
我正在通过实现一个微型软件渲染器来学习可编程渲染管道。我尝试以 'hardware' 风格实现它。但是,我对GPU管线不熟悉,遇到了一些齐次裁剪的问题。
根据this thread,假设我们在3D眼睛坐标中有两个点e0
,e1
,投影到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
没有被妥善保存。插值时,您通常需要对此进行补偿,以保持每个顶点值的线性关系。
我正在通过实现一个微型软件渲染器来学习可编程渲染管道。我尝试以 'hardware' 风格实现它。但是,我对GPU管线不熟悉,遇到了一些齐次裁剪的问题。
根据this thread,假设我们在3D眼睛坐标中有两个点e0
,e1
,投影到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
没有被妥善保存。插值时,您通常需要对此进行补偿,以保持每个顶点值的线性关系。