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

glFrustum函数公式为:

glPerspetive为:

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

The term "homogeneous" means that these coordinates should not necessarily be considered to be true Cartesian positions until they are divided by their fourth coordinate.

齐次裁剪空间坐标系(范围  -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,1)

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

P_Hw = -P_Vz。

经过透视投影后 (除以变换后的w分量,即相当于除以 观察坐标系中的-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值(相机坐标系)的增大,精度迅速降低),这也是为什么远处两个邻近的物体会发生闪烁的原因,也就是深度冲突 。

所以,事实上是透视投影变换由两步组成:  
1)  用透视变换矩阵把顶点从视锥体中变换到裁剪空间的CVV中。  
2)  CVV裁剪完成后进行透视除法。

另外多边形裁剪就是用这个规则体(齐次裁剪空间坐标系)完成的。

引用OpenGL Shader 4.0 CookBook 中一句话(第7章shadow)

In clip coordinates (after perspective division) the z coordinate ranges from
-1 to 1. It is the viewport transformation that (among other things) converts
the depth to a range between zero and one. Incidentally, if so desired, we can
configure the viewport transformation to use some other range for the depth
values (say between 0 and 100) via the function glDepthRange.

Of course, the x and y components also need to be biased between zero and one because
that is the appropriate range for texture access.
We can use the following "bias" matrix to alter our clip coordinates.

This matrix will scale and translate our coordinates such that the x, y, and z components range from 0 to 1 (after perspective division)

因为经过透视除法后顶点的w分量是1  那么范围是 -1 到1 的x 映射到 0 到 1 上 就是 x‘ = (x+1)/2 = x/2 + 0.5

最后附上一个比较好的链接

OpenGL 透视投影 齐次裁剪空间 深度缓存相关推荐

  1. OpenGL透视投影

    OpenGL透视投影 OpenGL透视投影简介 源代码剖析 主要源代码 OpenGL透视投影简介 我们到了 3D 图形的特征点 - 从 3D 世界投影到 2D 平面,同时保持深度.一个很好的例子是铁路 ...

  2. OpenGL透视投影原理与实现

    透视投影的原理和实现 by Goncely 转自:https://blog.csdn.net/wong_judy/article/details/6283019#t2 摘  要 :透视投影是3D渲染的 ...

  3. OpenGL透视投影函数gluPerspective的参数含义之解析(图示)

    首先解释一下透视投影: **透视投影属于中心投影.**透视投影图简称为透视图或透视,它是从某个投射中心将物体投射到单一投影面上所得到的图形.透视图与人们观看物体时所产生的视觉效果非常接近,所以它能更加 ...

  4. Unity shader 入门之渲染管线三、空间转换

    一个顶点是怎么显示在屏幕上的 开始 妞妞的鼻子是怎么绘制到屏幕上的? 一些重要的空间变换 渲染流水线中顶点的空间变换过程 模型空间 模型空间,有时也被称为对象空间(object space)或局部空间 ...

  5. 可编程渲染管线(Scriptable Render Pipeline, SRP)

    原文链接 可编程渲染管线处理数据的流程可分为以下3大阶段 1. 应用阶段 这个阶段大概会由CPU处理4件事情.首先会对模型数据进行可见性判断.模型数据由顶点位置.法线方向.顶点颜色.纹理坐标等构成.然 ...

  6. openGL学习笔记十四: 透视投影

    透视投影   三维空间物体显示近大远小. 透视投影区域是个棱锥体: 透视投影显示效果: opengl透视投影函数: void APIENTRY gluPerspective (GLdouble fov ...

  7. 使用opengl编程实现一个三维渲染实体_Unity Shader学习随记_01_渲染流水线

    什么是Shader?它和Material(材质)的关系 Shader,中文翻译:着色器,是可编程图形管线的算法片段 Shader实际上就是一小段程序,它负责将输入的顶点数据以指定的方式和输入的贴图或者 ...

  8. 深入理解OpenGL之投影矩阵推导

    深入理解OpenGL之投影矩阵推导 OpenGL流水线中的投影矩阵以及坐标变换 OpenGL中,投影矩阵在Vertex shader中使用,用于变换顶点.一般和Model, View矩阵结合成MVP矩 ...

  9. 透视投影(Perspective Projection)变换推导

    透视投影(Perspective Projection)变换推导 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View V ...

最新文章

  1. 为什么你应该深入Github
  2. js及jQuery实现checkbox的全选、反选和全不选
  3. 关于web服务器TIME_WAIT值高的问答
  4. php72w redis,docker php7安装php-redis
  5. jquery里面的$(this)和this都什么时候用,有什么区别
  6. 内联函数的意义和使用
  7. 南京师范大学计算机科学与技术复试名单,2018年各学院硕士研究生复试办法及复试名单公示网址汇总表...
  8. Java项目实战:计算机毕业设计案例分享(Java毕设)
  9. B站ACM算法资源汇总
  10. 实对称矩阵 二次型 合同 相似对角化
  11. 学习掌握Excel程度的层级划分
  12. 计算机word上下左右边距,Word页边距调整设置(上下左右边距,2003-2013)
  13. ASP.NET通过流方式导出EXCEL并且单元格换行
  14. 【AR】AR 的几种底层实现方式
  15. 2023届双非跨保计算机经验贴(最终上岸浙软)
  16. 微信小程序创建项目后无法显示内容
  17. 爱一个人,爱到八分最相宜
  18. 命运更喜欢将丰硕约果实馈赠给那些含着泪微笑的灵魂
  19. SAP方丈-SAP常见问题与解决办法(转)
  20. Java重写的7个规则

热门文章

  1. 伯禹-公益AI学习打卡 Task02
  2. 亚马逊SP-API申请 PII权限申请 ERP开发 开发人员注册
  3. 2018_WWW_DKN- Deep Knowledge-Aware Network for News Recommendation阅读笔记
  4. 杰理之AI协议之CMD_SET_BLE_VISIBILITY命令格式【篇】
  5. ukf 在matlab 下的实现,ukf在matlab下的实现
  6. 解决java.sql.SQLException: Access denied for user ‘***‘@‘localhost‘ (using password: YES)
  7. AJAX框架衣柜内部结构,衣柜内部结构这样布局,解决你家 90% 的收纳难题
  8. xshell 6查看测试日志
  9. 02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析——python
  10. 【兴趣阅读】DeepInf: Social Influence Prediction with Deep Learning