原文链接
版权声明:本文为CSDN博主「_delta」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
正文
概要
Unity 提供了使用 Camera 实现场景中物体替换 shader 渲染的方法,来满足一些特殊需求。
public void RenderWithShader(Shader shader, string replacementTag);
public void SetReplacementShader(Shader shader, string replacementTag);
两种方法都在挂载在 Camera 的脚本上调用,其中
RenderWithShader方法调用一次之后 只 渲染场景 一次,SetReplacementShader方法调用之后会 一直使用 ,直到调用ResetReplacementShader方法,则恢复所有物体的正常渲染。
RenderWithShader
英文不好,个人大概理解为使用这个方法的相机 不能是 你当前正在使用的渲染的相机,你需要一个新的相机,并且 disable 掉挂载的 Camera 组件,这个相机不会再发送 OnPreCull, OnPreRender or OnPostRender 消息,最好结合 RenderTexture 使用。所以我使用它的方法基本就是将它作为一种 触发 性质的渲染方式,在你需要的时候调用一次渲染方法,渲染到 RenderTexture 并进行使用。
GetComponent<Camera>().RenderWithShader(usedShader, replaceTag);
SetReplacementShader
这个要比上面的方法好用一些,它是一种状态控制方式,调用一次之后,该相机会 一直 采用参数中的着色器进行场景物体渲染,直到使用 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 的属性设置问题,比如贴图等,只要替换前和替换后的着色器 参数名 相同,则替换前着色器的属性信息会自动传到替换后着色器当中。
暂时先写到这,有些浮于表面,希望以后研究的更清楚一些……