Unity的渲染管线
着色器定义了对象的视觉效果(通过材质属性设置)以及对象如何与光线产生反应。因为光照计算必须内置到着色器中,而且光源与阴影的种类可能有很多种,所以编写能够“干活”的优质着色器是一项复杂的任务。为了使这一任务更加简单,Unity内置了表面着色器(Surface Shader),它能自动处理全部的照明、投影、光照映射、Forward与Deferred渲染。
这篇文章描述了Unity的照明与渲染管线的特异性以及发生在使用了表面着色器的场景底层的事情。
渲染通道(Rendering Path)
如何应用照明以及使用着色器的哪个Pass取决于所使用的渲染通道。着色器中的每个Pass通过Pass Tag与它们的照明类型进行通讯。
- 在Forward Rendering中,使用的Pass是
ForwardBase
和ForwardAdd
。 - 在Deferred Shading中,使用的Pass是
Deferred
。 - 在Legacy Deferred Lighting中,使用的Pass是
PrepassBase
和PrepassFinal
。 - 在Legacy Vertex Lit中,使用的Pass是
Vertex
,VertexLMRGBM
和VertexLM
。 - 上述所有情形在渲染阴影(Shadows)或者深度纹理(Depth Texture)时,使用的Pass都是
ShadowCaster
。
Forward Rendering通道
ForwardBase
同时渲染环境光(Ambient)、光照贴图(Lightmap)、主平行光(Directional Light)和Render Mode为Not Important(Vertex/SH)的光源。ForwardAdd
用于处理所有附加的Per-Pixel光源;每个通过此类光源照亮的物体都会产生一次调用(?:one invocation per object illuminated by such light is done)。
如果选用了Forward Rendering但着色器却没有适用于Forward Rendering的(Forward-suitable) Pass(例如,既没有 ForwardBase
也没有 ForwardAdd
),那么对象的渲染结果会和使用 Vectex Lit通道时一样,参见下文。
Deferred Shading通道
Deferred
渲染照明所需要的所有信息(在内置着色器中:diffuse color, specular color, smoothness, world space normal, emission),它也负责把光照贴图、反射探针和环境光照添加到Emission Channel中。
Legacy Deferred Lighting通道
PrepassBase
渲染法线&反射指数;PrepassFinal
通过合并纹理、照明&发光材质属性来渲染最终颜色。场景内所有的常规照明都在屏幕空间内分别完成。
Legacy Vertex Lit Rendering通道
自从顶点照明(Vertex Lighting)成为在不支持可编程着色器的平台上使用最多的方式后,Unity无法再在内部创建多个着色器变体来处理由光照贴图 vs. 无光照贴图的情况。因此,必须明确的编写多个Pass来处理有光照贴图和无光照贴图的对象。
Vertex
Pass用于处理无光照贴图的对象。所有光源一次性渲染,使用固定功能的 OpenGL/Direct3D 照明模型(Blinn-Phong)。VertexLMRGBM
Pass用于处理光照贴图使用RGBM编码(PC和主机)的对象。不应用实时照明;Pass要合并纹理到光照贴图(?:pass is expected to combine textures with a lightmap)。VertexLMM
Pass用于处理光照贴图使用 Double-LDR编码(移动平台)的对象。不应用实时光照;Pass要合并纹理到光照贴图(原文同上)。
参考
- 图形指令缓冲器 - 扩展Unity渲染管线