在之前推导正交相机 或 透视相机 到 裁剪空间的矩阵的归一化设置坐标NDC时。我们在DirectX平台下,都进行了Z值的反转。
在OpenGL下,我们归一化设置的Z坐标在归一化后范围为[-1,1]
在DirectX下,我们归一化设置的Z坐标在归一化后范围为应该为[0,1]
但是,却使用了Reversed-Z对Z值进行了反转[1,0]
DirectX下进行了反转后的矩阵
[
2
n
w
0
0
0
0
2
n
h
0
0
0
0
n
f
?
n
n
f
f
?
n
0
0
?
1
0
]
\begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n}{f-n} &\frac{nf}{f-n}\\ 0 & 0 & -1 & 0\\ \end{bmatrix}
?w2n?000?0h2n?00?00f?nn??1?00f?nnf?0?
?
[ 2 n w 0 0 0 0 2 n h 0 0 0 0 n f ? n n f f ? n 0 0 ? 1 0 ] ? [ x v y v z v 1 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n}{f-n} &\frac{nf}{f-n}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} · \begin{bmatrix} x_v\\ y_v\\ z_v\\ 1\\ \end{bmatrix} ?w2n?000?0h2n?00?00f?nn??1?00f?nnf?0? ?? ?xv?yv?zv?1? ?
在进行计算时,浮点值 在十进制 和 二进制 之间转化计算会造成误差
从而导致结果不是我们想要的结果。
这与我们实际需要的效果不符合
应该在离摄像机近时,精度高一点
离摄像机远时,精度低一点
在我们的计算机中,我们的计算最后都会转化为二进制。
在我们的寄存器存储小数时,会把十进制小数转化到二进制中 ,存储不下的、靠右的部分舍弃,以保证我们的计算能够正常运行