opengl蓝宝书读书笔记

 

裁剪空间坐标系中,dx是从0到1,opengl是从-1到1. 都是从近到远

深度值也不一样,dx中,深度缓冲区中1代表近平面,深度缓冲区中0代表远平面。 而裁剪空间范围对应的是near到0.

而opengl中,深度缓冲区0代表近平面,1代表远平面。裁剪空间范围分为都d3d和opengl两个系列。d3d范围是0到far,而

opengllike是-near,到far。联系投影变换,是将坐标xyz1变成-x'Z,-y'Z,-z'Z,-Z。也就是说对于opengl,我们w坐标就是view坐标的-z,可以想象,view坐标中z的方位是near-far,那么取-就是-far到-near,因为-z'Z中z'的范围是-1到1,所以-z'Z的范围是,近平面,Z是-near,z'是-1,这里你可能有疑惑,z'是-1没错,可是Z为什么是-near呢,那是因为摄像机坐标系下,看到的位置其实在z的负方向

 

那么就可以算出近平面的值是-near,再看远平面,就是-1 * -far * 1,也就是far。所以就看到了范围是-near到far.

再看看dx的,由于z'是0到1,那么近平面,就是0,远平面,-1 * -far * 1 = far

那么深度缓冲的区别,dx优势就是可以减少zfight,我们来看下为啥,首先列出投影公式,

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

当near很小far很大的时候,前面几乎等于1,也就是说z的变化几乎取决于后面,而后面重点在于far*near,对于两个数相乘,near越大,越容易让差值越大。减少zfight。

如果near特别小,就会容易出现zfight,我们看下dx中:

可以看到P_Hz' = az + b,也就是 (F+N)/(F-N) + 2NF/(F-N) / z可以看到,其实是一样的公式。 所以问题不在这里。

问了群里大佬,给了一篇文章:

https://translate.google.com.hk/translate?hl=zh-CN&sl=en&u=https://developer.nvidia.com/content/depth-precision-visualized&prev=search

有点醍醐灌顶的感觉。

首先,投影变换本身是不会影响精度的。而是做了齐次除法,存到深度缓冲区中的时候。

 首先存在深度缓冲区中的必须是倒数,我们看到d的刻度,这个刻度是整数型的。不难发现在near上,精度更加高,而后面far精度就低了。想一下,如果far远大于near,那么远距离的物体最终都将投射到同一个d中,导致zfight。

看一下近平面变小的 情况:

 可以看到,开始在近处聚集。

而拉远平面:

其实变化不大。

神奇不,只是把d从0-1改成1-0,精度就开始变得合理了。

遗憾的是如果你是opengles,那么范围是-1,1, 那么增加浮点数也只是提高中间的精度而已。无法解决问题。

即使没有浮点数精度,通过反转z,我们也看到了实验结果也是好一点的。这个原理我就不是很清楚了。

 

关于step优化if else的行为,最近又有了新的看法:

https://www.sohu.com/a/219886389_667928

对于这样一组单元,只要满足其中两个,那么就会执行两个分支。循环逻辑执行的时候,由于其中一个点要循环很多次,其他人也只能等着。

  • GPU的这种工作方式叫Single Instruction Multiple Threads(单指令多线程),前面用“一个像素”的说法不准确,因为顶点也是一样处理的,应该叫一个Thread。而一组像素是一组Thread,被称为“线程束”,也就是一般说的Warp。不在正文直接使用这些专业名词只是为了不增加理解成本。
  • 硬件一直都在发展,很难判断现在if的成本有多少,我说的也是一种很老旧的实现方式,现在GPU对分支的处理很可能变得更加复杂,因为空载是一件明显粗暴的处理方法,具有优化的余地。这种优化可能逻辑复杂,涉及断批,重新创建warp等等行为,但至少并不会比这种简单暴力的空载方式更慢。 ——而使用step则等于放弃了这些优化。 step和if的性能差距只会越来越大,step万一比if快的情况,也只可能越来越少。
  • 自己的测试结果才靠谱。手机型号虽多,按GPU的厂商/大版本区分其实也没多少台,没什么不能测试的。未经过测试验证的结论,管它多权威,信的人有多少,都不能信。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值