雙面shader

默認情況下渲染引擎提出了背面(相對於攝像機的方向)的渲染圖元,這樣導致即使我們開啓了透明(AlphaTest或者Alpha Blend)也無法看到背面的透明效果。

若想要得到雙面渲染效果,可以使用Cull指令來控制需要剔除的那個面。
Cull Back | Front | Off

若設置成Back,那麼背對攝像機的面就不會被渲染。
若設置成Front,那麼朝向攝像機的面就不會被渲染。
若設置成Off,就會關閉剔除功能,但是需要渲染的圖元數目會成倍的增加。

透明度測試的雙面渲染

可以直接關閉剔除效果來達到雙面渲染的目的:

Pass {
     // 定義該Pass在Unity中的光照流水線中的角色
     Tags { "LightMode"="ForwardBase" }
     // 可以使用Cull指令來控制需要剔除n哪個面的渲染圖元
     // Cull Back | Front | Off
     // 若設置成Back,那麼背對攝像機的面就不會被渲染
     // 若設置成Front,那麼朝向攝像機的面就不會被渲染
     // 若設置成Off,就會關閉剔除功能,但是需要渲染的圖元數目會成倍的增加
     Cull Off
}

透明度混合的雙面渲染

透明度混合需要關閉深度寫入,而深入寫入被關閉則是“一切混亂的開端”。可以通過兩個Pass來解決,一個剔除前面,一個剔除背面,兩者結合來達到保證正確深度渲染的關係(Unity會保證順序執行SubShader中的各個Pass)。

Shader "Unity Shaders Book/Chapter 8/Alpha Blend Both Sided" {
    Properties {
        _Color ("Main Tint", Color) = (1,1,1,1)
        _MainTex ("Main Tex", 2D) = "white" {}
        // 用於在透明紋理的基礎上控制整體的透明度
        _AlphaScale ("Alpha Scale", Range(0,1 )) = 1
    }
    SubShader {
        // RenderType標籤可以讓Unity
        // 把這個Shader歸入到提前定義的組(Transparent)
        // 用於指明該Shader是一個使用了透明度混合的Shader
        // IgnoreProjector=True這意味着該Shader
        // 不會受到投影器(Projectors)的影響
        // 爲了使用透明度混合的Shader一般都應該在SubShader
        // 中設置這三個標籤
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        Pass {
            // 向前渲染路徑的方式
            Tags {"LightMode"="ForwardBase"}
            Cull Front
            // 深度寫入設置爲關閉狀態
            ZWrite Off
            // 這是混合模式
            Blend SrcAlpha OneMinusSrcAlpha
            ....
        }
        Pass {
            // 向前渲染路徑的方式
            Tags {"LightMode"="ForwardBase"}
            Cull Back
            // 深度寫入設置爲關閉狀態
            ZWrite Off
            // 這是混合模式
            Blend SrcAlpha OneMinusSrcAlpha
            ....
        }
    }
    FallBack "Transparent/VertexLit"

來自:https://blog.csdn.net/biezhihua/article/details/79141356

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章