笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
在前面几篇博客介绍了SSAO的系列讲解,下面再给读者介绍深度值重构SSAO技术,也是在原有SSAO实现的基础上进行技术优化,首先我们使用包含视图空间位置像素的几何G缓冲作为计算的第一步,本篇博文我们将挑战一下直接从深度缓冲中计算视口空间位置。这么做的好处是可以使用更少的内存因为我们仅需要一个浮点数表示每个像素值代替通常的三个数值。本篇博文的讲解需要读者把前面讲解的SSAO技术系列文章理解了再继续,本篇博文实现的代码是在以前实现的SSAO技术的基础上进行的算法改变。
在SSAO算法中我们逐像素的扫描整个窗口,在视图空间中围绕着每个像素会产生任意的点,将这些点映射到视图空间中的近裁减面上并且与在此位置的实际像素值比较它们的Z值大小。视图空间位置是在渲染循环开始的几何通道中产生的,为了正确的填充G缓冲与视图空间位置我们还需要一个深度缓冲。我们可以使用深度缓冲来构建整个视图空间的位置向量,从而减少它所需要的空间(尽管需要更多的逐像素计算)。
我们现在做一个局部空间的顶点位置变换,在前面的博文中给读者介绍过关于固定流水线中涉及到矩阵的变换操作,在这里可以直接使用通过与WVP矩阵相乘得到,WVP是一个组合变换,将局部空间的物体首先转换到世界坐标,再转换到视口坐标,最后到投影坐标也就是在近裁剪面的投影。它得到的结果是一个4D向量,我们可以说这个向量是在裁剪空间中对应的点,裁剪空间向量是在顶点着色器中计算得到输出gl_Position表示的,接下来GPU执行投影,它的运算公式就是其它三个值除以第四个分量W。我们可以得到4D向量的前三个值是在-1和1之间,最后的值W简单就是1,我们可以说得到的点向量是在NDC空间中(标准设备坐标&#