使用替换着色器渲染

一些渲染效果要求使用一组不同的着色器来渲染场景。例如,好的边缘检测需要带场景法线的纹理才能检测出表面朝向变化的边缘。其他效果可能需要带场景深度的纹理等等。要想获得这些效果,可用所有对象的替换着色器来渲染场景。

在脚本撰写中使用 Camera.RenderWithShaderCamera.SetReplacementShader 函数可进行着色器替换。这两个函数都使用着色器和 ``replacementTag`。

其工作原理如下:相机还是像平常一样渲染场景,对象仍使用原有的材质,但最后真正使用的着色器已经变了:

所以,举例而言,如果所有着色器都有“RenderType”标记,标记值为“不透明” (Opaque)、“透明” (Transparent)、“背景” (Background)、“叠加” (Overlay) 等,您可以通过使用含有 RenderType=Solid 标记的子着色器编写一个只渲染固体对象的替换着色器。其他标记不会在替换着色器中找到,所以对象不会进行渲染。或者您可以为不同的“渲染类型”(RenderType) 标记值编写数个子着色器。顺便说一下,所有内置的 Unity 着色器都有一个“渲染类型”(RenderType) 标记集。

光照着色器替换

使用着色器替换时,通过使用配置在相机上的渲染路径对场景进行渲染。这意味着用于替换的着色器可以包含阴影和光照通道(您可以将表面着色器用于着色器替换)。这在进行特效渲染和场景调试时很有用。

内置 Unity 着色器的着色器替换标记

所有内置 Unity 着色器都有一个“渲染类型 (RenderType)" 标记集。当使用替换着色器进行渲染时,可以使用该标记集。标记值如下所示:

内置场景深度/法线纹理

如果需要在一些效果中渲染深度或深度 + 法线纹理,相机 (Camera) 的内置功能可以帮您实现这点。请参阅相机深度纹理页面。请注意,在一些情况下(依硬件而定),深度和深度 + 法线纹理可以通过使用着色器替换进行内部渲染。因此确保着色器中具有正确的 "渲染类型 (RenderType)" 标记是很重要的。

Page last updated: 2013-06-28