unity Shader透明效果

2021-10-02 02:29:27 字數 3365 閱讀 8957

一、深度緩衝:對於不透明物體,不需要考慮它們的渲染順序,因為強大的深度緩衝(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官網介紹 每次遇...