我正在通过实现一个小巧的软件渲染器来学习可编程渲染管道。我试着以'硬件'的方式实现它。但是,我不熟悉GPU管道,并且遇到了一些均匀剪切问题。
根据this thread,我们假设我们在3D眼坐标中有两个点e0
,e1
,它们被投射到4D中的h0(-70, -70, 118, 120)
,h1(-32, -99, -13, -11)
均匀的剪裁空间。然后我们在4D齐次空间中进行插值,段h0-h1
被4D点w = -x
处的z = -1
平面h(t)=t*h1+(1-t)*h2
(t = 0.99
)剪切,h0-h(0.99)
。在不失一般性的情况下,假设我们有h(0.99)
部分(可见)可以进入光栅化阶段。所以我们需要生成t
的相应顶点属性(与顶点着色器的输出格式相同)。我的问题是如何生成这些新顶点的属性?
更新:我尝试使用t作为插值变量来获取h(t)的顶点属性,并得到合理的结果。我想知道为什么来自4D空间的print_r($_FILES)
可以在3D顶点属性中获得良好的插值结果?
答案 0 :(得分:1)
我想知道为什么4D空间的t可以在3D顶点属性中获得良好的插值效果?
因为那是数学如何运作的。或者更重要的是,线性数学如何运作。
在没有深入研究数学的情况下,linear transformation是两个空间之间的转换,它保留了原始空间的线性特性。例如,在线性变换之后,彼此平行的两条线将保持平行。如果在Y方向上执行2倍刻度,则新线将越来越远离原点。但它们仍然是平行的。
假设我们有一条AB线,你定义了C点,它是A和B之间的中点。如果你在A,B和C上执行相同的线性变换,新点C < sub> 1 将仍位于A 1 B 1 的行上。不仅如此,C 1 仍然是新行的中点。
我们甚至可以概括这一点。对于任何C = (B-A)t + A
,C可以是符合以下等式的任何点:t
。 A,B和C的线性变换不会影响此等式中的变化 t
。
事实上,这就是线性变换的真正含义:它是在原始空间中所有点A,B和C中保留t
在该等式中的变换。
您空间中有4个维度的事实最终与上面的向量方程无关。任何空间中的线性变换都将保留t
。矩阵变换表示从一个空间到另一个空间的线性变换(通常)。
此外,您的原始3D位置实际上是4D位置,W假定为1.0。
请注意,从剪辑空间(4D齐次)到normalized-device-coordinate space(3D非齐次)的转换是非线性。 W分割不是线性变换。这就是为什么你在4D均匀剪辑空间中剪切的一个原因,我们仍然保留原始位置和剪辑空间之间的线性关系。
这也是perspective-correct interpolation of per-vertex outputs重要的原因:因为您在(窗口空间)中进行光栅化的空间是而不是原始空间输出的线性变换顶点着色器(剪辑空间)。这意味着t
未正确保留。插值时,通常需要对其进行补偿,以保持每个顶点值的线性关系。