如何自动渲染具有特定着色器的所有不透明网格物体?

我有一个镜面轮廓着色器,我希望在特定相机呈现时在场景的所有不透明网格物体上使用。 当手动应用于某些材质时,着色器正常工作。 着色器如下所示:

Shader "Custom/Outline" { Properties { _Color ("Main Color", Color) = (.5,.5,.5,1) _OutlineColor ("Outline Color", Color) = (1,0.5,0,1) _Outline ("Outline width", Range (0.0, 0.1)) = .05 _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1) _Shininess ("Shininess", Range (0.03, 1)) = 0.078125 _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {} } SubShader { Tags { "Queue"="Overlay" "RenderType"="Opaque" } Pass { Name "OUTLINE" Tags { "LightMode" = "Always" } Cull Off ZWrite Off // Uncomment to show outline always. //ZTest Always CGPROGRAM #pragma target 3.0 #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 pos : POSITION; float4 color : COLOR; }; float _Outline; float4 _OutlineColor; v2f vert(appdata v) { // just make a copy of incoming vertex data but scaled according to normal direction v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); float2 offset = TransformViewToProjection(norm.xy); o.pos.xy += offset * o.pos.z * _Outline; o.color = _OutlineColor; return o; } float4 frag(v2f fromVert) : COLOR { return fromVert.color; } ENDCG } UsePass "Specular/FORWARD" } FallBack "Specular" } 

使用相机只是一个脚本组件设置着色器replace:

 using UnityEngine; using System.Collections; public class DetectiveEffect : MonoBehaviour { public Shader EffectShader; // Use this for initialization void Start () { this.camera.SetReplacementShader(EffectShader, "RenderType=Opaque"); } // Update is called once per frame void Update () { } } 

不幸的是,每当我使用这台相机,我只看到背景颜色。 有任何想法吗?

我误解了着色器replace的概念。 的replace标签值

 SetReplacementShader(shader: Shader, replacementTag: string): void; 

只能是标签types。 然后,在replace着色器中,我必须设置我想要replace的标记值,就像我之前做的那样。 标签中具有此值的任何材质将使用replace着色器,而不是在相机呈现时连接并启用效果脚本。 效果脚本的最终代码变为:

 using UnityEngine; using System.Collections; public class DetectiveEffect : MonoBehaviour { public Shader EffectShader; // Use this for initialization void Start () { //Notice the "RenderType" tag here. this.camera.SetReplacementShader(EffectShader, "RenderType"); } // Update is called once per frame void Update () { } } 

着色器代码没有改变。 但要注意标签的设置。

 //... SubShader { Tags { "Queue"="Overlay" "RenderType"="Opaque" } Pass { //... 

在我的情况下,任何带有RenderType标记的着色器等于不透明的材质将被我的效果摄像机渲染时的着色器replace。