Version: 2019.4
编写表面着色器
表面着色器示例

Surface Shaders and rendering paths

In the Built-in Render Pipeline, when using a Surface Shader, how lighting is applied and which Passes of the shader are used depends on which rendering path is used. Each pass in a shader communicates its lighting type via Pass Tags.

  • 前向渲染中,将使用 ForwardBaseForwardAdd 通道。
  • 延迟着色中,将使用 Deferred 通道。
  • 旧版延迟光照中,将使用 PrepassBasePrepassFinal 通道。
  • 旧版顶点光照中,将使用 VertexVertexLMRGBMVertexLM 通道。
  • In any of the above, to render Shadows or a depth texture, ShadowCaster pass is used.

前向渲染路径

ForwardBase 通道可一次性渲染环境光、光照贴图、主方向光和不重要的(顶点/SH)光源。ForwardAdd 通道用于任何附加的每像素光源;针对此类光源照亮的每个对象进行一次调用。请参阅前向渲染以了解详细信息。

如果使用前向渲染,但着色器没有适合前向渲染的通道(即,ForwardBaseForwardAdd 通道类型均不存在),则会按照在顶点光照通道中的方式来渲染该对象,请参阅下文。

延迟着色路径

Deferred 通道将渲染光照需要的所有信息(在内置着色器中:漫射颜色、镜面反射颜色、平滑度、 世界空间法线、发光)。它还在发光通道中增加光照贴图、反射探针和环境光照。有关详细信息,请参阅延迟着色

旧版延迟光照路径

PrepassBase 通道将渲染法线和镜面反射指数;PrepassFinal 通道将通过组合纹理、光照和发光材质属性来渲染最终颜色。所有常规的场景内光照都在屏幕空间中单独完成。有关详细信息,请参阅延迟光照

旧版顶点光照渲染路径

由于顶点光照最常用于不支持可编程着色器的平台,因此 Unity 无法在内部创建多个着色器变体来处理光照贴图与非光照贴图的情况。所以,要处理光照贴图对象和非光照贴图对象,必须显式编写多个通道。

  • Vertex 通道用于非光照贴图对象。所有光源均通过固定函数 OpenGL/Direct3D 光照模型 (Blinn-Phong) 立即渲染
  • VertexLMRGBM 通道在光照贴图为 RGBM 编码(PC 和游戏主机)时用于光照贴图对象。情况下不会应用实时光照;通道应该将纹理与光照贴图组合。
  • VertexLM pass is used for lightmapped objects, when lightmaps are double-LDR encoded (mobile platforms). No realtime lighting is applied; pass is expected to combine textures with a lightmap.
编写表面着色器
表面着色器示例