浅浅了解延迟渲染(延迟着色)
延迟渲染
- 一般采用正向渲染,也就是线进行着色,然后进行深度测试。但是这种渲染存在一个缺点,那就是如果一个颜色已经被渲染出来来的,但是经过深度测试,发现在它上面还有一种颜色需要渲染,那么就导致之前渲染的颜色所耗费的资源被浪费。因为最后看到的颜色之后是经过深度测试的颜色。
- 对于延迟渲染来说,就是先进行深度测试,然后进行着色。这样我们只渲染最后一定可以看到的颜色,对于那些被深度测试pass掉的颜色不进行渲染,这样就极大的节省了计算资源,提高FPS。
注:延迟渲染是从G-buffer中读取纹理数据,而不是从顶点着色器的变量中,这样我们在渲染片段的时候,渲染的都是最顶层的片段(感觉就是通过深度测试的片段),所以每个像素都只处理一次(无法使用MSAA,因为msaa需要对每个像素进行多次采样,综合之后得出最终的颜色值)。但是传统的正向渲染就需要对像素处理多次(这里的“多”就是指光源个数,有多少个光源,就处理多少次)。
延迟渲染流程:
分两个阶段:几何处理阶段 -> 光照处理阶段
1)几何处理阶段:先渲染场景 -> 得到对象的几何信息(位置、颜色、法向量等)-> 存储到G-buffer中
2)光照处理阶段:G-buffer纹理数据 -> 计算每一个片段中的场景光照。(ps:通常光照处理阶段是从顶点着色器获取变量进行片段着色)
复杂度对比
这里的 m 可以认为是 m 个光源,n 可以指的是 n 个需要渲染的目标或者片段或者像素点。
- 正向 O(m*n)
- 延迟 O(m+n)
延迟渲染优缺点
- 缺点显而易见:耗费内存、不支持混色(因为只渲染最顶层的片段,所以无法使用MSAA)
- 优点也显而易见: 复杂度低、多光源场景非常适用
针对延迟渲染缺点进行的改进
- 延迟光照 LightPre-Pass : 减少内存开销
- 分块延迟渲染 Tile-Base Defferred Rendering:目的是分摊内存开销
延迟渲染真的好吗?
对于光源非常多的情况下,利用延迟渲染会极大的提高渲染效率。对于光源少的情况下,优先选择正向渲染。因为延迟渲染会造成非常大的内存开销。当内存开销非常大的时候,其实也会影响它的渲染效率。