Shader筆記 7 透明效果

2022-07-16 07:39:07 字數 1512 閱讀 7206

不透明物體

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

透明物體

渲染透明物體時,不僅要關注渲染圖元上每個片元的顏色值和深度值,還要關注每個片元的透明度屬性,通常有兩種方式實現,透明度測試alpha test以及透明度混合alpha blending

所以渲染引擎一般都會先對物體排序後再進行渲染,先渲染所有不透明物體,開啟它們的深度測試和深度寫入;再把半透明物體按距離攝像機的遠近進行排序,由遠及近的順序渲染這些半透明的物體,開啟深度測試但是關閉深度寫入

在subshader中使用「queue」標籤來控制渲染順序,指定此時渲染的物體屬於哪乙個渲染佇列,unity在內部使用一系列的整數索引來表示每個渲染佇列,索引數越小就越早渲染

渲染佇列包括的值有:

例需要使用透明度測試實現透明效果:

subshader

pass

//code elide

}}

例通過透明度混合實現透明效果:

subshader

pass

zwrite off

blend srcalpha oneminussrcalpha

//code elide

}}

一般在片元著色器中使用clip函式來進行透明度測試,只要乙個片元的透明度不滿足條件(小於某個閾值),那麼這個片元就會被捨棄,處理透明度測試時的操作跟對待普通不透明的物體幾乎是一樣的,只是透明度測試在片元著色器中增加了對透明度判斷並裁剪片元的**

clip函式是cg中的乙個函式:

void clip(float4 x)

}

使用unity提供的blend混合命令 blend srcfactor dstfactor 開啟混合,並設定混合因子,源顏色(片元產生的顏色)乘以srcfactor目標顏色(顏色緩衝中的顏色)乘以dstfactor,兩者相加後在存入顏色緩衝中

blend srcalpha oneminussrcalpha
使用透明度混合必須要開啟blend,只有開啟了blend命令,在片元著色器中設定的透明通道才有意義,未開啟blend命令的話,設定的透明度將對片元的透明效果沒有任何影響。

透明度混合的shader**和透明度測試的**也幾乎一樣,只是移除了該片元著色器中的透明度判斷、裁剪片元**,設定了該片元著色器中的透明通道(紋理畫素的透明通道和引數_alphascale的乘積)

ref

文件:書籍:opengl寶典、unity shader入門

shader入門10 透明效果1

在unity中我們通常有兩種方法可以實現透明效果 透明度測試只能控制物體完全透明或者完全不透明,所以大部分情況下使用的都是透明度混合的效果 透明度混合需要考慮渲染順序.之前從來沒考慮過渲染順序的問題是因為對於不透明物體,有深度緩衝這種機制的存在.深度緩衝會對物體進行深度測試,原理利用快取中的深度判斷...

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

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

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

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