着色器定义了两点:对象自身的外观(其材质属性);对象对光照的反应。由于光照计算必须内置在着色器中,并且有很多可能的光源和阴影类型,因此编写“好用”的高质量着色器将是一项复杂的任务。为了简化这一任务,Unity 提供了表面着色器;在表面着色器中,所有光照、阴影、光照贴图、前向渲染和延迟渲染任务均自动完成。
本文档将介绍 Unity 的光照和渲染管线的特质以及表面着色器的内部原理。
如何应用光照以及使用着色器的哪些通道取决于使用的渲染路径。着色器中的每个通道均通过通道标签来表达其光照类型。
ForwardBase
和 ForwardAdd
通道。Deferred
通道。PrepassBase
和 PrepassFinal
通道。Vertex
、VertexLMRGBM
和 VertexLM
通道。ShadowCaster
通道。ForwardBase
通道可一次性渲染环境光、光照贴图、主方向光和不重要的(顶点/SH)光源。ForwardAdd
通道用于任何附加的每像素光源;针对此类光源照亮的每个对象进行一次调用。请参阅前向渲染以了解详细信息。
如果使用前向渲染,但着色器没有适合前向渲染的通道(即,ForwardBase
和 ForwardAdd
通道类型均不存在),则会按照在顶点光照通道中的方式来渲染该对象,请参阅下文。
Deferred
通道将渲染光照需要的所有信息(在内置着色器中:漫射颜色、镜面反射颜色、平滑度、
世界空间法线、发光)。它还在发光通道中增加光照贴图、反射探针和环境光照。有关详细信息,请参阅延迟着色。
PrepassBase
通道将渲染法线和镜面反射指数;PrepassFinal
通道将通过组合纹理、光照和发光材质属性来渲染最终颜色。所有常规的场景内光照都在屏幕空间中单独完成。有关详细信息,请参阅延迟光照。
由于顶点光照最常用于不支持可编程着色器的平台,因此 Unity 无法在内部创建多个着色器变体来处理光照贴图与非光照贴图的情况。所以,要处理光照贴图对象和非光照贴图对象,必须显式编写多个通道。
Vertex
通道用于非光照贴图对象。所有光源均通过固定函数 OpenGL/Direct3D 光照模型 (Blinn-Phong) 立即渲染VertexLMRGBM
通道在光照贴图为 RGBM 编码(PC 和游戏主机)时用于光照贴图对象。情况下不会应用实时光照;通道应该将纹理与光照贴图组合。VertexLMM
通道在光照贴图为双 LDR 编码(移动平台)时用于光照贴图对象。情况下不会应用实时光照;通道应该将纹理与光照贴图组合。