Unity Shader之雙面材質和多Pass渲染

開發MrsFu123發表於2022-05-21

通過Cull語句實現雙面材質

實現雙面渲染最簡單的方法是用Cull Off。“Cull”意為“剔除”,表示去掉看不見的部分(預設是剔除背面)。Cull Off則告訴Unity,這個渲染不需要剔除了,你別多管閒事。下面是一個簡單的例子:

Shader "Custom/DoubleTransparent" {
    Properties {
        _MainTint ("Main Color", Color) = (1, 1, 1, 1)
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        LOD 200
        Cull Off
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off
            CGPROGRAM            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            uniform float4 _MainTint;
            float4 vert(float4 vertPos : POSITION) : SV_POSITION
            {                return mul(UNITY_MATRIX_MVP, vertPos);
            }
            float4 frag(float4 vertPos : SV_POSITION) : COLOR
            {                return _MainTint;
            }
            ENDCG
        }
    } 
    FallBack "Diffuse"}


  

不過似乎看不出來哪個是正面哪個是反面,如果我們描述的是對稱的物體是不需要區分的。然而也有的時候是需要區分,比如我們是做的一塊布的效果,布的正面是一些花花綠綠的圖案,背面只是簡單的紋理,這種需要對正反面進行不同方式的渲染的情況,需要用到多個Pass進行渲染。

多Pass渲染

為了實現正反面的不同渲染,我們需要兩個Pass進行渲染。第一個使用Cull Back語句,只渲染正面,第二個用Cull Front語句,只渲染背面。程式碼也非常簡單:

Shader "Custom/DoubleTransparent" {
    Properties {
        _FrontColor ("Front Color", Color) = (1, 1, 1, 1)
        _BackColor ("Back Color", Color) = (1, 1, 1, 1)
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        LOD 200
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off
            Cull Front
            CGPROGRAM            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            uniform float4 _BackColor;
            float4 vert(float4 vertPos : POSITION) : SV_POSITION
            {                return mul(UNITY_MATRIX_MVP, vertPos);
            }
            float4 frag(float4 vertPos : SV_POSITION) : COLOR
            {                return _BackColor;
            }
            ENDCG
        }
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off
            Cull Back
            CGPROGRAM            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            uniform float4 _FrontColor;
            float4 vert(float4 vertPos : POSITION) : SV_POSITION
            {                return mul(UNITY_MATRIX_MVP, vertPos);
            }
            float4 frag(float4 vertPos : SV_POSITION) : COLOR
            {                return _FrontColor;
            }
            ENDCG
        }
    } 
    FallBack "Diffuse"}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016819/viewspace-2895954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章