Unity 使用替换着色器进行渲染(Rendering with Replaced Shaders ) | 狂吼的面包圈
因为梦想
我们一直在努力

Unity 使用替换着色器进行渲染(Rendering with Replaced Shaders )

使用替换着色器进行渲染(以下简称:替换渲染),原文是Rendering with Replaced Shaders,其实也可以理解为使用一个指定的着色器对场景中符合条件的Mesh进行渲染。实现替换主要依赖于 Camera.RenderWithShader 以及 Camera.SetReplacementShader两个接口。

Camera.RenderWithShader(Shader shader, string replacementTag)

这个接口的效果与Camera.Render类似,即在调用时执行一次全场景的渲染,即使相机的GameObject或者Camera组件设置为ActiveFalse时仍然可以执行渲染。但该接口需要提供一个用于替换的Shader,在渲染场景时,所有满足条件的GameObject都使用这个shader进行绘制。所谓的条件则是第二个参数提供的,用于匹配的Tag名称。稍后的实例中将展示Tag条件的匹配是如何工作的。

Camera.RenderWithShader(Shader shader, string replacementTag)

这个接口的不同之处在于它将持久性地为相机设置一个替换Shader,此后该相机每一次渲染都会生效,直到再次调用改接口修改Shader和Tag或者调用Camera.ResetReplacementShader()进行重置。

实例:

先创建四个最简单的UnityShader,其中一个作为用于替换的Shader,在其中编写两个SubShader,并分别赋予Tag:“RepalceTag”=“Type1”、 “RepalceTag”=“Type2”。在实际使用中可以根据需要定义不同的Tag。

另外三个添加对应的Tag,用作被替换的Shader

创建材质,并分别选择三个Shader,将材质赋予场景上的三个物体,

创建C#脚本,在Start方法中添加如下代码:

将C#脚本赋予相机并点击运行,可以看到如下效果:

由于没有SetReplacementShader方法中tag为空字符串,没有指定要匹配的Tag,因此三个物体都使满足了替换渲染的条件,并且替换Shader中两个SubShader也都满足条件,所以默认使用前面的一个SubShader进行渲染。

现在修改C#代码,匹配“ReplaceTag”

此时再运行,可以看到如下效果:

可以看到,匹配Type1的方块使用了替换Shader的第一个SubShader渲染,匹配Type2的圆球使用了第二个SubShader进行渲染,因此显示为绿色。由于替换Shader中没有匹配Type3的SubShader,因此圆柱体则没有被渲染出来。

总结:

使用替换渲染可以让相机在渲染时,使用一个指定的Shader替换掉GameObject原有的Shader。替换时若指定了匹配的Tag,则会根据原有Shader和替换Shader的Tag匹配情况决定是否渲染这个GameObjet以及使用替换Shader中的哪个SubShader进行渲染。当想对场景中的某些物体进行特殊渲染处理时,可以使用这个技术,例如可以利用一个计算深度的Shader替换场景中全部半透明物体的Shader进行渲染,已获得他们的深度信息等等。

本文的实例工程已上传GitHub,欢迎下载使用:https://github.com/RCBelmont/Unity-ShaderLab-Render

才疏学浅,必有疏漏,还望各位不吝赐教~

转载请注明原出处:狂吼的面包圈 » Unity 使用替换着色器进行渲染(Rendering with Replaced Shaders )