shader入門10 透明效果1

2021-09-24 12:34:54 字數 2081 閱讀 5375

在unity中我們通常有兩種方法可以實現透明效果

透明度測試只能控制物體完全透明或者完全不透明,所以大部分情況下使用的都是透明度混合的效果

透明度混合需要考慮渲染順序.之前從來沒考慮過渲染順序的問題是因為對於不透明物體,有深度緩衝這種機制的存在.

深度緩衝會對物體進行深度測試,原理利用快取中的深度判斷物體與攝像機之間的距離.

渲染乙個片元時,如果它的深度比快取深度高,說明它已經被某個物體遮擋住了,不應該渲染出來.

否則就渲染這個片元,並把顏色存入深度快取中.

使用深度緩衝,我們不必關心渲染順序,因為深度緩衝會判斷相機的位置來進行渲染.而我們使用透明度混合時,被透明物體遮擋的物體,不論他的深度是否大於深度快取,都應該被渲染出來.這就產生了矛盾.所以我們使用透明度混合時,是需要關閉深度寫入的.這樣不會更新深度快取的值.

我們只關閉了深度寫入,並沒有關閉深度測試,所以不透明的物體依然可以遮擋透明物體.

unity為我們提供了乙個預設的渲染佇列來解決這個問題.

我們可以通過定義tag的方式實現透明度測試或者透明度混合

tags//透明度測試

tags//透明度混合

「ignoreprojector」="true"關閉投影器影響

「rendertype」="transparent"的作用請參考這篇文章

shader "custom/newsu***ceshader"

//貼圖紋理

_cutoff("alpha cutoff",range(0,1))=0.5//透明度測試中低於這個值的顏色會被消除

} subshader

pass

cgprogram

#include "lighting.cginc"

#pragma vertex vert

#pragma fragment frag

fixed4 _color;//貼圖顏色

sampler2d _maintex;//貼圖紋理

fixed _cutoff;

float4 _maintex_st;

struct a2v ;

struct v2f ;

v2f vert(a2v v)

fixed4 frag(v2f f) :sv_target

endcg

} }fallback "transparent/cutout/vertexlit"//設定合適的fallback

}

低於_cutoff的部分完全透明,看起來像個無頭騎士一樣

//貼圖紋理

_alphascale("_alphascale",range(0,1))=1//透明度

} subshader

pass

zwrite off//關閉深度寫入

blend srcalpha oneminussrcalpha//設定混合因子 開啟透明混合

cgprogram

#include "lighting.cginc"

#pragma vertex vert

#pragma fragment frag

fixed4 _color;//貼圖顏色

sampler2d _maintex;//貼圖紋理

fixed _alphascale;

float4 _maintex_st;

struct a2v ;

struct v2f ;

v2f vert(a2v v)

fixed4 frag(v2f f) :sv_target

endcg

} }fallback "transparent/vertexlit"//設定合適的fallback

Shader筆記 7 透明效果

不透明物體 渲染不透明物體時,即使不去考慮不透明的物體opaque之間的渲染順序,也可以得到正確的渲染結果,是由於強大的深度緩衝depth buffer z buffer的存在,深度緩衝用於解決片元可見性問題,即物體哪些部分被渲染在前面,哪些部分被遮擋 透明物體 渲染透明物體時,不僅要關注渲染圖元上...

開啟深度寫入的半透明效果 Shader

思路 第乙個pass開啟深度寫入,但不輸出顏色,它的目的僅僅是為了把該模型的深度值寫入深度緩衝中 第二個pass進行正常的透明度混合,由於上乙個pass已經得到了逐畫素的正確的深度資訊,該pass就可以按照畫素級別的深度排序結果進行透明渲染。shader chapter8 alphablendzwr...

Shader學習的基礎知識(六)透明效果

在渲染的時候,渲染的順序是非常重要的,對於不透明物體我們不用不考慮是因為有的深度緩衝存在。在渲染時需要把片元中的值進行比較 如果開了深度測試 但一但關了嘗試測試就沒那麼簡單了。透明度測試 只要小於閾值就會被捨棄,完全不透明或完全透明。透明度混合 這種方法才能得到真正的透明效果,但是需要關掉深度測試,...