将深度缓冲z值变换到相机坐标系

将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))

posted @ 2016-08-07 19:44 sunny_王 阅读(...) 评论(...) 编辑 收藏