Unity 渲染管线        

着色器规定了对象本身的外观(其材质属性)以及它对光照的反应方式。由于光照计算必须嵌入着色器,并且有多种可能的光照和阴影类型,因此编写“刚好有效”的质量着色器是一个很复杂的任务。为了使编写变得更加容易,Unity 3 引入了表面着色器,在该着色器上可以自动处理光照、阴影、光照贴图、正向光照以及延时光照对象。

本文档介绍了 Unity 光照及渲染管线的特点,以及表面着色器的工作原理。

渲染路径

您所使用的渲染路径决定了光照的应用方式以及着色器所使用的通道。着色器中的每个通道通过通道标记传送其光照类型。

  • 在延时光照中,使用 PrepassBasePrepassFinal 通道。

  • 在正向渲染中,使用 ForwardBaseForwardAdd 通道。

  • 在顶点光照中,使用 VertexVertexLMRGBMVertexLM 通道。

  • 在以上任何一种情况下,要渲染阴影,请使用 ShadowCasterShadowCollector 通道。

延时光照路径

PrepassBase 通道渲染法线和高光指数;PrepassFinal 通道通过将纹理、光照与发光材质等属性相结合来渲染最终颜色。场景中所有正规光照都是在屏幕空间中单独进行的。有关详情,请参阅延时光照。

正向渲染路径

ForwardBase 通道同时渲染环境、光照贴图、主方向灯以及不重要的(顶点/球谐函数)光源。ForwardAdd 通道用于任何额外的逐像素光源;对于每个被这种光照明的对象,该通道都会被调用一次。有关详情,请参阅正向渲染。

如果使用了正向渲染,但着色器没有合适的正向通道(也就是说,没有 ForwardBaseForwardAdd 通道类型),则按在顶点光照 (Vertex Lit) 路径的渲染方式渲染该对象,参见下文。

顶点光照渲染路径

由于顶点光照最常用于不支持可编程着色器的平台,所以 Unity 不能在内部创建多种着色器排列来处理光照贴图与非光照贴图的情况。因此,要处理光照贴图和非光照贴图对象,就必须明确编写多条通道。

  • 顶点通道用于非光照贴图对象。所有光照均使用固定函数 OpenGL/Direct3D 光照模型 (Blinn-Phong) 同时渲染

  • VertexLMRGBM 通道用于光照贴图对象,其中光照贴图是 RGBM 格式编码(这种情况主要发生在桌面和控制台上)。该通道不使用实时光照,而是将纹理与光照贴图结合。

  • VertexLMM 通道用于光照贴图对象,其中光照贴图为 double-LDR 格式编码(这种情况发生在移动设备和老式桌面上)。该通道不使用实时光照,而是将纹理与光照贴图结合。

,