Unity材质替代渲染相关:RenderWithShader & SetReplacementShader
概要
Unity提供了使用Camera实现场景中物体替换shader渲染的方法,来满足一些特殊需求。
public void RenderWithShader(Shader shader, string replacementTag);
public void SetReplacementShader(Shader shader, string replacementTag);
两种方法都在挂载在Camera上的脚本上调用,其中RenderWithShader 方法调用一次之后只渲染场景一次,SetReplacementShader方法调用之后会一直使用,直到调用ResetReplacementShader方法,则恢复所有物体的正常渲染。
RenderWithShader
官方文档解释链接(v:2018.4)
英文不好,个人大概理解为使用这个方法的相机不能是你当前正在使用的渲染的相机,你需要一个新的相机,并且disable掉挂载的Camera组件,这个相机不会再发送OnPreCull, OnPreRender or OnPostRender 消息,最好结合RenderTexture使用。所以我使用它的方法基本就是将它作为一种触发性质的渲染方式,在你需要的时候调用一次渲染方法,渲染到RenderTexture并进行使用。
GetComponent<Camera>().RenderWithShader(usedShader, replaceTag);
SetReplacementShader
官方文档解释链接(v:2018.4)
这个要比上面的方法好用一些,它是一种状态控制方式,调用一次之后,该相机会一直采用参数中的着色器进行场景物体渲染,使用ResetReplacementShader方法停止状态。可以直接在周期方法中调用。
*GetComponent<Camera>().SetReplacementShader(usedShader, replaceTag);
关于UsedShader和ReplaceTag的解释
UsedShader很简单,就是你想要渲染物体使用的着色器,用它来替换原来场景中的物体的着色器(只是用来渲染,并非真的替换)。
ReplaceTag则是Shader中SubShader使用的Tags标签,例如:
SubShader{
Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
Pass{……}
}
在物体原着色器中的SubShader的tags中的键值对和相机替换使用的着色器SubShader的tags中的键值对进行匹配(键值对应都要相同,只要有一对SubShader满足即可),如果匹配成功,则该物体使用对应替换shader的Subshader进行渲染,其他任何情况该物体都不会渲染。例如:
相机替换用:
Tags { "RenderType"="TransparentCutout"}
物体原着色器:
Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
则替换成功。
—————————————————————————————————————————————————————————————
相机替换用:
Tags { "RenderType"="Transparent"}
物体原着色器:
Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
则替换失败。
SetReplacementShader实践结果,左边Scene视图下,物体正常渲染;右侧Game视图下相机替代渲染,正方体未通过,球体通过并替换渲染方式,失去描边
而且tags键值对可以自行设置
另外,关于shader的属性设置问题,比如贴图等,只要替换前和替换后的着色器参数名相同,则替换前着色器的属性信息会自动传到替换后着色器当中。
暂时先写到这,有些浮于表面,希望以后研究的更清楚一些……