一.前言
在光照概述中,我们叙述了一些光照模型,以及逐顶点和逐像素的计算光照,我们没有考虑阴影,没有考虑间接光照,没有考虑光照强度的衰减,而实际上,这些因素游戏的渲染效果的真实感和沉浸感有着至关重要的影响,可以说光照是shader最核心的要素。
二.更复杂的光照
1.渲染路径
什么是渲染路径?渲染路径决定了光照是如何应用到shader中的,而不是仅仅简单的在顶点或者片元着色器中进行计算而已。unity在5.0以前的版本支持三种渲染路径:前向渲染,延迟渲染,顶点照明渲染。而在5.0以后,顶点照明渲染已经被抛弃,新的延迟渲染路径代替了旧的延迟渲染路径(当然也兼容了旧版本),一般时候一个项目只使用一个渲染路径,我们可以通过在edit-Project Setting-Player-Other Setting-RenderingPath中设置,默认情况下是选择的前向渲染路径。
2.前向渲染
假如场景中有N个光源,M个物体,那么每个物体为每个光源计算一遍光照,然后刷新到颜色缓冲和深度缓冲中,即需要N*M个pass的计算,我们才完成整个光照的渲染效果,而且成功实现了他们的叠加,在这里要注意设置正确的混合模式,混合模式即,我们希望新计算的光照结果和缓冲区中的颜色值怎么混合,按什么比例混合,一般情况下选择Blend One One,即1:1混合。
在unity的前向渲染中,有三种处理光照的方式:逐顶点,逐像素,球谐函数。而使用哪种方式取决于光源的类型和他的渲染模式(即是否是重要的),unity中光源的渲染模式有三种,Important,not Important,Auto。顾名思义,设置为Important的光源会被逐像素处理,即更加精细同时开销也更大,Not Important的光源会按逐顶点或者SH(球谐函数)处理,Auto则告诉Unity你自己决定这个光源的处理方式吧。
3.延迟渲染
前向渲染的问题是,当场景中有大量的光源时,m个物体,n个实时光照的光源,计算复杂度会是m*n,而对于这些光照来说,光照计算中很大一部分对同一个物体的计算是重复的,延迟渲染是一种古老的方法,原理就是,除了前向渲染使用的颜色缓冲和深度缓冲之外,还有额外的缓冲区-G缓冲,G缓冲存储了我们所关心的表面的其他信息,如表面的法线,位置,用于光照计算的属性等。
计算原理和方法:
包含两个Pass,第一个Pass中不进行任何光照计算,而是仅仅计算哪些片元是可见的,主要是通过深度缓冲技术来实现,当一个片元是可见的,我们就把它的相关信息存储到G缓冲区。在第二个Pass,我们利用G缓冲区的各个片元信息,如表面法线,视角方向,漫反射系数等,进行光照计算。核心就是,在第一个Pass中提前将光照所需的通用信息缓存,减小计算量。所以延迟渲染的Pass通常就是两个,和光源数无关,而是和我们使用的屏幕空间的大小有关。
网友评论