UnityShader开发之常见渲染路径
- 概念
- 1. 光照处理方式
- 1.1 逐顶点处理
- 1.2 逐像素处理
- 1.3 球谐函数
- 2. 渲染路径
- 2.1前向渲染
- 2.1.1原理
- 2.2. 延迟渲染
- 2.2.1原理
- 2.2.1缺点
- 2.3 两种模式的比较
概念
1. 光照处理方式
光照估计是指从图片中获取光照信息,从而降低光照对纹理的影响。传统的光照估计依赖于光源方向和法线方向的估计。
1.1 逐顶点处理
在Vertex中计算光照颜色,每个顶点计算一次光照颜色,然后通过顶点在多边形所覆盖的区域对像素的颜色进行线性插值。
1.2 逐像素处理
在Fragment中计算光照颜色,每个像素都计算一次光照颜色。
1.3 球谐函数
曲面上的像素值使用9维的球谐基函数进行线性表示,而这种光照模型只需要估计球谐基函数前面的权值,不需要光源的方向,大大简化了光照的估计。
2. 渲染路径
2.1前向渲染
前向渲染是渲染物体的一种非常直接的方式,在场景中一个一个物体渲染过去,在计算深度的同时,也将颜色存入颜色缓冲中。
2.1.1原理
每进行一次完整的前向渲染,都需要渲染该对象的渲染图元,并计算两个缓冲区的信息,一个是颜色缓冲区,一个是深度缓冲区。首先利用深度缓冲区还决定一个片元是否可见,如果可见就更新颜色缓冲区中的颜色。
从原理中我们可以看出,如果要渲染一个逐像素光源,就需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果,然后再帧缓冲中吧这些光照结果混合起来得到最终的颜色值。假设,场景中有N个物体,每个物体收到M个光源的影响,那么要渲染整个场景一共需要N*M个Pass。如果有大量逐像素光照,那么需要执行的Pass数目也会很大。
2.2. 延迟渲染
延迟渲染是将着色计算延后进行处理的一种渲染方法,即先做深度检测,将不需要的片元去除掉,再开始进行颜色的渲染。
2.2.1原理
延迟渲染主要包含了两个Pass。在第一个Pass中,我们不进行任何光照计算,而是仅仅计算那些片元是可见的,这主要是通过深度缓冲技术来实现,当发现一个片元是可见的,我们就把他的相关信息存储到G缓存区中。然后再第二个Pass中,我们利用G缓冲区的各个片元信息,例如表面法线、视角方向、漫反射系数等,进行真正的光照计算。
2.2.1缺点
1.不能处理半透明物体
2.不能支持真正的抗锯齿
3.对显卡有一定要求
2.3 两种模式的比较
当场景中有n个物体,m个光源,那么他们的复杂度对比为
渲染路径 | 复杂度 | 解释 |
延迟渲染 | O(n+m) | n个物体进行几何缓冲计算,而后对每个光源根据几何缓存数据,于是加m |
前向渲染 | O(n*m) | 每个物体都需要计算深度和光照,然后写到颜色缓冲中,即n*m |