Unity Shader 基礎(1): RenderType & ReplacementShader

不少Shader中都會定義RenderType這個類型,可是一直搞不明白究竟是幹嗎的,官方文檔是這樣結解釋的:Rendering with Replaced Shadershtml

Rendering with Replaced Shaders

shader經過camera中 Camera.RenderWithShader 和 Camera.SetReplacementShader實現替換功能,這兩個方法都接受兩個參數:Shader和replacementTag ,根據狀況:app

  • replacementTag 爲空,場景中全部物體都會使用replacement shader進行渲染
  • replacementTag 不爲空,若是物體不存在tag則不進行渲染。
  • replacementTag 不爲空,若是物體shgader中存在、與之placement shader中相同的tag',則使用placement shader中對應subshader進行渲染,不然不渲染。

RenderType類型

  1. Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
  2. Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders).
  3. TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders).
  4. Background: Skybox shaders.
  5. Overlay: GUITexture, Halo, Flare shaders.
  6. TreeOpaque: terrain engine tree bark.
  7. TreeTransparentCutout: terrain engine tree leaves.
  8. TreeBillboard: terrain engine billboarded trees.
  9. Grass: terrain engine grass.
  10. GrassBillboard: terrain engine billboarded grass.

測試

  1. 隨便寫個兩個shader,創建對應的材質:
Shader "Unlit/BlueShader"
{
    Properties
    {
        _Color("Color",Color) = (0,0,0,1)
    }
    SubShader
    {
        Tags { "RenderType"="transparent" }
        LOD 100
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata {float4 vertex : POSITION;};

            struct v2f{
                float4 vertex : SV_POSITION;
            };

            fixed4 _Color ;

            v2f vert (appdata v){
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);return o;
            }
            
            fixed4 frag (v2f i) : SV_Target{
                fixed4 col = _Color;return col;
            }
            ENDCG
        }
    }
}
  1. 另外一個shader與之類似,修更名字爲"RedShader", 同時修改RenderType爲"transparent":
Shader "Unlit/RedShader"
{
    Properties
    {
        _Color("Color",Color) = (0,0,0,1)
    }
    SubShader
    {
        Tags { "RenderType"="transparent" }
        pass
        {}  
    }
}
  1. 建議一個Replacement shader,和rendshader類似,並將輸出顏色修改成固定黃色。之修改下名字:
Shader "Unlit/ReplacementShader"
{
    Properties
    {
        _Color("Color",Color) = (0,0,0,1)
    }
    SubShader
    {
        Tags { "RenderType"="transparent" }
        pass
        {
            ...
            //輸出爲黃色,若是替換了輸出爲黃色
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = fixed4(1,1,0,0);
                return col;
            }
            ...
        }   
    }
}
  1. 寫一個相機上的腳本,在啓動時替換shader
public class ReplaceMent : MonoBehaviour {

    public Shader rpShader; 
    // Use this for initialization
    void Start () 
    {
        //所有替換渲染
        //GetComponent<Camera> ().SetReplacementShader(rpShader,"");
        //RenderType="rpShader中RenderType"的sunshader進行渲染,
        GetComponent<Camera> ().SetReplacementShader(rpShader,"RenderType");
    }
}

執行前
mark
執行後
mark函數

若是在SetReplacementShader函數中tag爲空,則輸出爲全黃色。測試

結論

  1. 不知道啥時候能夠用到

引用

  1. unity 替換渲染 ( Rendering with Replaced Shaders )
  2. 官方文檔
  3. 淺析Unity shader中RenderType的做用及_CameraDepthNormalsTexture
相關文章
相關標籤/搜索