【发布时间】:2020-03-09 23:13:57
【问题描述】:
为了在透视投影和正交投影之间进行插值,我使用了以下公式(效果很好,因为剪裁平面完美对齐):
X' = rw + X / ((Z * fwi - ox) * (1f - a) + ox);
Y' = rh + Y / ((Z * fhi - oy) * (1f - a) + oy);
地点:
rw 或 rh 为 (renderWidth 或 Height - 1) / 2f,
ox 是 vSize / rw,oy 是 hSize / rh,
fwi 是 tan(vFOV/2) / rw,fhi 是 tan(hFOV/2) / rh,
a 是 lerp 系数; 0 = 透视,1 = 正交,0.5 = 介于两者之间。
现在为了正确计算每个片段的 Z 深度,我先计算 z = 1/z,然后通过 ScanLine 函数将其插入屏幕空间,最后通过 1/z 计算最后的真实深度。
但是正交投影不需要这种深度校正,所以我想知道在混合投影时确定真实 Z 的正确方法是什么。 当前的 XYZ 到 XY 公式可以总结为:
目前我正在通过深度对 UV 坐标进行插值,当投影介于透视和正交之间时,这显然是不正确的。当它达到 1 时,它会绕过 1/z 深度校正。
【问题讨论】:
-
VERTEX_DATA不是任何 OpenGL 着色器语法的一部分,因此不清楚您使用的是什么。也不清楚你如何计算你的“混合视角”。从概念上讲,透视和正射投影之间的混合可以解释为将投影中心移向无穷远,所有中间步骤仍然只是简单的投影变换。在这种情况下,没有什么是 GL 的自动透视校正无法处理的。完全不清楚为什么要手动除以z。真正的解决方案是正确使用齐次w坐标。 -
那么当 OpenGL 在透视和正交投影之间混合时,真的只是将相机超远地向后移动并降低 FOV 直到接近零,然后切换到正交投影?
-
没有。 OpenGL 不在乎。 你只需变换你认为合适的坐标,你似乎想要的效果可以用标准的 4x4 齐次投影矩阵来表示