一、深度緩衝:對於不透明物體,不需要考慮它們的渲染順序,因為強大的深度緩衝(z-buffer),在實時渲染中,深度緩衝是用於解決可見性問題的,基本思想:根據深度緩衝中的值來判斷該片遠距離攝像機的距離。
一、透明度:當開啟透明混合後,當乙個物體被渲染到螢幕上時,每個片元除了顏色值和深度值之外,還有另乙個屬性——透明度。
二、實現透明效果的兩種方法
1、透明度測試
採用一種「霸道極端」的機制,只要乙個片元的透明度不滿足條件,那麼它對應的片元就會被捨棄,被捨棄的片元不再進行任何處理,也不會對顏色緩衝產生任何影響;否則就會按照普通的不透明物體的處理方法來處理它。
2、透明度混合
這種方法可以得到真正的半透明效果,它會使用當前片元的透明度作為混合因子,與已經存在的顏色緩衝中的顏色值進行混合,得到新的顏色。但是透明度混合僅需要關閉深度寫入,沒有關閉深度測試,這使得我們要小心物體的渲染順序。對於透明度混合,深度緩衝是唯讀的。(如果不關閉深度寫入,那麼就會發生前面的透明物體遮住了後面的不透明物體)
3、渲染順序
因為有時關閉深度寫入,那麼就導致渲染順序將變得非常重要。所以渲染引擎一般會先對物體進行排序,再渲染。常用方法:
①先渲染所有不透明物體,並開啟它們的深度測試和深度寫入。
②把半透明物體按他們距離攝像機的遠近進行排序,然後按照從後往前的順序渲染這些半透明物體,並開啟它們的深度測試,但關閉深度寫入。
4、對於渲染順序unityshader的解決方案
①渲染佇列:queue標籤:決定我們的模型歸於哪個渲染佇列,unity在內部使用一系列整數索引來表示每個渲染佇列,且索引號越小表示越早被渲染。
unity提前定義的5個渲染佇列 名稱
佇列索引號
描述background
1000
這個渲染佇列會在任何其他佇列之前被渲染,我們通常使用該佇列來渲染那些需要繪製在背景上的物體
geometry
2000
預設的渲染佇列,大多數物體都使用這個佇列,不透明物體使用這個佇列
alphatest
2450
需要透明度測試的物體使用這個佇列,在unity5中它從geometry佇列中被單獨分出來了,這是因為在所有不透明物體渲染之後再渲染它們會更加高效。
transparent
3000
這個佇列中的物體會在所有geometry和alphatest物體渲染後,再按從後往前的順序進行渲染,任何使用了透明度混合(例如關閉了深度寫入的shader)的物體都應該使用這個佇列
overlay
4000
該佇列用於實現一些疊加效果。任何需要在最後渲染的物體都應該使用該佇列
②在unityshader中,zwrite off:用於關閉深度寫入。
shaderlab的blend命令 語義
描述blend off
關閉混合
blend srcfactor dstfactor
開啟混合,並設定混合因子。源顏色(該片元產生的顏色)會乘以srcfactor,而目標顏色(已經存在於顏色快取的顏色)會乘以dstfactor,然後把兩者相加後再存入顏色緩衝中
blend srcfactor dstfactor,srcfactora dstfactora
和上面幾乎一樣,只是使用不同的因子來混合透明通道
blendop blendoperation
並非是把源顏色和目標顏色簡單相加後混合,而是使用blendoperation對它們進行其他操作。
5、混合
①混合是乙個逐片元的操作,它是高度可配置但是不可程式設計的,
②混合等式:兩個運算元:源顏色s和目標顏色d,想得到輸出顏色o,就必須使用乙個等式計算,我們把這個等式稱為混合等式。
混合等式分為兩個:乙個用於混合rgb通道的,乙個用於混合a通道的。預設情況下,混合使用的操作都是加操作,我們只需要設定一下混合因子即可。混合因子就是和源顏色或者目標顏色相乘的。
③混合因子命令
shaderlab中設定混合因子的命令 命令
描述blend srcfactor dstfactor
開啟混合,並設定混合因子。源顏色(該片元產生的顏色)會乘以srcfactor,而目標顏色(已經存在於顏色快取的顏色)會乘以dstfactor,然後把兩者相加後再存入顏色緩衝中
blend srcfactor dstfactor, srcfactora dstfactora
和上面幾乎一樣,只是使用不同的因子來混合透明通道
shaderlab中的混合因子 引數
描述one
因子為1
zero
因子為0
srccolor
因子為源顏色值。當用於混合rgb的混合等式時,使用srccolor的rgb分量作為混合因子;當用於a的混合等式時,使用srccolor的a分量作為混合因子
srcalpha
因子為源顏色的透明值(a通道)
dstcolor
因子為目標顏色值。當用於混合rgb的混合等式時,使用dstcolor的rgb分量作為混合因子;當用於a的混合等式時,使用dstcolor的a分量作為混合因子
dstalpha
因子為目標顏色的透明度值(a通道)
oneminussrccolor
因子為(1-源顏色)
oneminussrcalpha
因子為(1-源顏色的透明度值)
oneminusdstcolor
因子為(1-目標顏色)
oneminusdstalpha
因子為(1-目標顏色的透明度值)
④混合操作:當我們把源顏色和目標顏色與它們對應的混合因子相乘後,對他們的結果如何操作呢?可以不使用加法嗎?可以的。
我們使用shaderlab的blendop blendoperation命令
blendoperation命令 操作
描述add
將混合後的源顏色和目標顏色相加,預設的混合操作
sub用混合後的源顏色減去混合後的目標顏色
revsub
用混合後的目標顏色減去混合後的源顏色
min使用源顏色和目標顏色中較小的值,是逐分量比較的
max使用源顏色和目標顏色中較大的值,是逐分量比較的
⑤通過混合操作和混合因子命令的組合,我們可以得到photoshop混合模式中的混合效果(可以在網上單獨查詢,應該會有很多)
blend srcalpha oneminussrcalpha // alphablending alpha混合
blend one one // additive 相加混合
blend one oneminusdstcolor // soft additive柔和相加混合
blend dstcolor zero // 正片疊底multiplicative 相乘混合
blenddstcolor srccolor // 2x multiplicative 2倍相乘混合
Unity Shader透明效果
unity中通常使用2種方法來實現透明效果 第一種是使用透明度測試 alpha test 這種方法無法得到真正的半透明效果 另一種是透明度混合 alpha blending 透明度測試和透明度混合的基本原理如下 透明度測試 只要乙個片元的透明度不滿足條件 通常是小於某個閾值 那麼它對應的片元就會被捨...
Unity Shader 實現半透明效果
想要實現如下效果 主角可以遮擋背景,背景遮擋主角時候半透明混合 研究了一周,shader知識了解從無到稍稍入門,終於解決了,記錄一下實現方案。使用blend one oneminussrcalpha指令,也就是srccolor dstcolor 1 srcalpha 假設a和b重疊,先渲染a,然後渲...
unity Shader 扭曲效果
所謂扭曲就是擾動乙個物體的uv座標,表現出來就是乙個擾動效果,如火焰扭曲空氣,和水波對水底的影響。1.在shader 中我們需要一張當前渲染的紋理 2.給乙個物體渲染並使用當前紋理,用螢幕座標作為uv座標加上乙個擾動值 1.unity提供了抓取的pass grabpass unity官網介紹 每次遇...