将Depth Buffer中的Z值转换到Camera坐标系下需要使用投影矩阵
OpenGL:
OpenGL的投影矩阵为
设Camera坐标系下点为(Vx,Vy,Vz,1.0)
通过上述投影矩阵变换后的点为(Px,Py,Pz,-Vz)
Px与Py我们不关心,Pz=Az+B,A=-(f+n)/(f-n),B=-2fn/(f-n),
然后各项除以w,Pz=-A-B/Vz
现在Pz在[-1,1]之间,OpenGL会将其变换到[0,1]内得到Dz
以上就是Camera坐标系到投影坐标系的过程
当得到Depth Buffer中的Dz,按照以下流程得到Camera坐标系Vz
1. 将Dz从[0,1]变换到[-1,1]得到Dz’,即Dz’=2*Dz-1
2. 由前述可知Dz’=-A-B/Vz,Vz=-B/(A+Dz’)
在已知f和n的情况下,Vz=2fn/(Dz’(f-n)-(f+n))
由于OpenGL是右手坐标系,Camera朝向的是-z方向,所以上述Vz要乘以-1.0
即Vz=-1.0*Vz
Vz=B/(A+Dz’)
Vz=2fn/((f+n)-Dz’(f-n))
以上是OpenGL的变换过程
D3D的变换过程
D3D的投影矩阵为
设Camera坐标系下点为(Vx,Vy,Vz,1.0)
通过上述投影矩阵变换后的点为(Px,Py,Pz,Vz)
Px与Py我们不关心,Pz=Az+B,A=f/(f-n),B=-fn/(f-n),
然后各项除以w,Pz=A+B/Vz
由此得到的Pz在[0,1]之间,Pz即为Depth Buffer中的Dz
已知Dz我们使用以下流程得到Vz
Dz=A+B/Vz
Vz=B/(Dz-A)
Vz=fn/(f-Dz(f-n))
时间: 2024-10-03 11:09:20