默認情況下渲染引擎提出了背面(相對於攝像機的方向)的渲染圖元,這樣導致即使我們開啓了透明(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