【转载】Unity 材质替代: RenderWithShader & SetReplacementShader

519 阅读3分钟

原文链接

版权声明:本文为CSDN博主「_delta」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/Wind_Code/a…

正文

概要

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{……}
}

物体原着色器 中的 SubShadertags 中的键值对和 相机替换使用 的着色器 SubShadertags 中的键值对进行匹配(键值对应都要相同,只要有一对 SubShader 满足即可),如果匹配成功,则该物体使用对应替换 shader 的 Subshader 进行渲染,其他任何情况该物体都不会渲染。例如:

ShaderReplacement.png

成功案例

  • 相机替换用:
Tags { "RenderType"="TransparentCutout"}
  • 物体原着色器:
Tags{ 
    "Queue" = "AlphaTest" 
    "IgnoreProjector" = "True" 
    "RenderType" = "TransparentCutout" 
}

则替换成功。

失败案例

  • 相机替换用:
Tags { "RenderType"="Transparent"}
  • 物体原着色器:
Tags{ 
    "Queue" = "AlphaTest" 
    "IgnoreProjector" = "True" 
    "RenderType" = "TransparentCutout" 
}

则替换失败。

SetReplacementShader 实践结果

  • 左边 Scene 视图下,物体正常渲染;
  • 右侧 Game 视图下相机替代渲染,正方体未通过,球体通过并替换渲染方式,失去描边

image.png

而且 tags 键值对可以自行设置

另外

关于 shader 的属性设置问题,比如贴图等,只要替换前和替换后的着色器 参数名 相同,则替换前着色器的属性信息会自动传到替换后着色器当中。

暂时先写到这,有些浮于表面,希望以后研究的更清楚一些……