着色器规定了对象本身的外观(其材质属性)以及它对光照的反应方式。由于光照计算必须嵌入着色器,并且有多种可能的光照和阴影类型,因此编写“刚好有效”的质量着色器是一个很复杂的任务。为了使编写变得更加容易,Unity 3 引入了表面着色器,在该着色器上可以自动处理光照、阴影、光照贴图、正向光照以及延时光照对象。
本文档介绍了 Unity 光照及渲染管线的特点,以及表面着色器的工作原理。
您所使用的渲染路径决定了光照的应用方式以及着色器所使用的通道。着色器中的每个通道通过通道标记传送其光照类型。
PrepassBase
和 PrepassFinal
通道。
ForwardBase
和 ForwardAdd
通道。
Vertex
、VertexLMRGBM
和 VertexLM
通道。
ShadowCaster
和 ShadowCollector
通道。
PrepassBase
通道渲染法线和高光指数;PrepassFinal
通道通过将纹理、光照与发光材质等属性相结合来渲染最终颜色。场景中所有正规光照都是在屏幕空间中单独进行的。有关详情,请参阅延时光照。
ForwardBase
通道同时渲染环境、光照贴图、主方向灯以及不重要的(顶点/球谐函数)光源。ForwardAdd
通道用于任何额外的逐像素光源;对于每个被这种光照明的对象,该通道都会被调用一次。有关详情,请参阅正向渲染。
如果使用了正向渲染,但着色器没有合适的正向通道(也就是说,没有 ForwardBase
或 ForwardAdd
通道类型),则按在顶点光照 (Vertex Lit) 路径的渲染方式渲染该对象,参见下文。
由于顶点光照最常用于不支持可编程着色器的平台,所以 Unity 不能在内部创建多种着色器排列来处理光照贴图与非光照贴图的情况。因此,要处理光照贴图和非光照贴图对象,就必须明确编写多条通道。
顶点
通道用于非光照贴图对象。所有光照均使用固定函数 OpenGL/Direct3D 光照模型 (Blinn-Phong) 同时渲染
VertexLMRGBM
通道用于光照贴图对象,其中光照贴图是 RGBM 格式编码(这种情况主要发生在桌面和控制台上)。该通道不使用实时光照,而是将纹理与光照贴图结合。
VertexLMM
通道用于光照贴图对象,其中光照贴图为 double-LDR 格式编码(这种情况发生在移动设备和老式桌面上)。该通道不使用实时光照,而是将纹理与光照贴图结合。
Page last updated: 2013-06-28