码迷,mamicode.com
首页 > 其他好文 > 详细

OpenGL 透视投影 齐次裁剪空间 深度缓存

时间:2015-05-14 16:34:45      阅读:498      评论:0      收藏:0      [点我收藏+]

标签:c++   osg   opengl   z-buffer   深度缓冲   

对于从事三维方面的 ,透视投影公式应该不陌生,如下:

技术分享



经过透视投影 (正射投影也一样)变换, 能够把点 从 观察空间(相机坐标系)转换到 齐次裁剪空间坐标系(如下图)。这个转化后的空间体 不仅独立于 把三维场景转换为二维屏幕空间的投影类型(透视、正射),也独立于屏幕的分辨率(Resolution) 以及长宽比(Aspect Ratio).



技术分享


齐次裁剪空间坐标系(范围  -1<=x <=1,-1<=y<=1,-1<=z <=1, )是左手坐标系,为什么? 其实也很好理解,如上图 , A和B点经过投影变换后其x坐标是一样的(不再是投影平截体中的那种相对关系), 而近裁剪面上的点的z坐标经过投影变换后变为-1 , 而远裁剪面上的z坐标为1 ,所以齐次裁剪空间坐标系的z轴的正方向正好和相机坐标系中的z轴正方向是相反的。

经过透视投影后,每个顶点的x和y坐标还要除以其z坐标,这个除法是产生透视收缩的方法。


假设相机坐标系中的一点 P_V,经过透视变换后为P_H(分量分别为P_Hx,P_Hy,P_Hz)

P_Hz =- P_Vz  *  (far+near)/(far-near) - 2far*near/(far-near)


经过透视投影后 (除以 观察坐标系中的z坐标)

P_Hz‘ = -(far+near)/(far-near)  - (2far*near)/P_Vz  *(far-near)


当P_Vz = -near(注意是负数,看上图便知) 时候 P_Hz‘ = -1

当P_Vz = -far 的时候,P_Hz‘=1


从上面求 P_Hz的公式中也可以看到,深度缓冲的值并不是线形的,随着z值(相机坐标系)的增大,精度迅速降低),这也是为什么远处两个邻近的物体会发生闪烁的原因,也就是深度冲突 。






OpenGL 透视投影 齐次裁剪空间 深度缓存

标签:c++   osg   opengl   z-buffer   深度缓冲   

原文地址:http://blog.csdn.net/zhuyingqingfen/article/details/45721643

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!