關閉深度寫入帶來的問題
開啟深度寫入的半透明效果
shaderlab的混合命令
透明度混合**實現
開啟深度寫入的半透明效果**實現
透明度混合可以得到真正的半透明效果。它會使用當前片元的透明度作為混合因子,與已經儲存在顏色緩衝中的顏色值進行混合,得到新的顏色。但是,透明度混合需要關閉深度寫入,這使得我們要非常小心物體的渲染順序。
當片元著色器產生乙個顏色的時候,可以選擇與顏色快取中的顏色進行混合。混合中的顏色值包含了 rgba 四個通道的值。
把當前自身的顏色和已經存在於顏色緩衝中的顏色值進行混合。
語義描述
blend off
關閉混合
blend srcfactor dstfactor
開啟混合,並設定混合因子,源顏色(該片元的顏色)*srcfactor+目標顏色(緩衝中的)*dstfactor
blend srcfactor dstfactor,srcfactora dstfactora
和上面幾乎一樣,只是使用不同的因子來混合透明通道
blendop blendoperation
並非是把源顏色和目標顏色簡單相加後混合,而是使用blendoperation對它們進行其他操作
當模型本身有複雜的遮擋關係或是包含了複雜的非凸網格的時候,就會有各種各樣因為排序錯誤而產生的錯誤的透明效果。
這都是由於我們關閉了深度寫入造成的,因為這樣我們就無法對模型進行畫素級別的深度排序。一種解決方法是分割網格,從而可以得到乙個「質量優等」的網路。但很多情況下往往不切實際。這時,可以想辦法重新利用深度寫入,讓模型可以像半透明物體一樣進行淡入淡出。
在 shaderlab 中,colormask 用於設定顏色通道的寫掩碼(write mask),它的語義如下:
colormask rgb | a | 0 | 其他任何r、g、b、a的組合
源顏色(source color):指的是由片元著色器產生的顏色值。下面用s表示。
目標顏色(destination color):指的是從顏色緩衝中讀取到的顏色值。下面用d表示。
輸出顏色:用o表示,它會重新寫入到顏色緩衝中。
混合等式:由源顏色和目標顏色得到輸出顏色的計算公式。
當混合時,使用兩個混合等式:乙個用於混合rgb通道,乙個用於混合a通道。
當設定混合狀態時,實際上設定的就是混合等式中的操作和因子。預設情況下,混合等式使用的操作都是加操作,只需要設定一下混合因子即可。
命令描述
blend off
關閉混合
blend srcfactor dstfactor
開啟混合,並設定混合因子,srcfactor和dstfactor為混合因子(係數)
orgb = srcfactor * srgb + dstfactor * drgb
oa = srcfactor * sa + dstfactor * da
blend srcfactor dstfactor, srcfactora dstfactora
和上面幾乎一樣,只是使用不同的因子來混合透明通道
orgb = srcfactor * srgb + dstfactor * drgb
oa = srcfactora * sa + dstfactora * da
引數描述
one因子:1
zero
因子:0
srccolor
因子:源顏色值
當用於混合 rgb 的混合等式時,使用 srccolor 的 rgb 分量作為混合因子;
當用於混合 a(透明度)的混合等式時,使用 srccolor 的 a 分量作為混合因子;
srcalpha
因子:源顏色的alpha值
dstcolor
因子:目標顏色值
當用於混合 rgb 的混合等式時,使用 dstcolor 的 rgb 分量作為混合因子;
當用於混合 a(透明度)的混合等式時,使用 dstcolor 的 a 分量作為混合因子;
dstalpha
因子:目標顏色的alpha值
oneminussrccolor
因子:1-源顏色值
當用於混合 rgb 的混合等式時,使用結果的 rgb 分量作為混合因子;
當用於混合 a(透明度)的混合等式時,使用結果的 a 分量作為混合因子;
oneminussrcalpha
因子:1-源顏色的alpha值
oneminusdstcolor
因子:1-目標顏色值
oneminusdstalpha
因子:1-目標顏色的alpha值
並非是把源顏色和目標顏色簡單相加後混合,而是使用blendoperation對它們進行其他操作。
引數描述
add將源顏色和目標顏色相加(預設的混合操作)
orgb = srcfactor * srgb + dstfactor * drgb
oa = srcfactor * sa + dstfactor * da
sub用源顏色減去目標顏色
orgb = srcfactor * srgb - dstfactor * drgb
oa = srcfactor * sa - dstfactor * da
revsub
用目標顏色減去源顏色
orgb = dstfactor * drgb - srcfactor * srgb
oa = dstfactor * da - srcfactor * sa
min取源顏色和目標顏色中的較小值,是逐分量比較
orgba = (min(sr,dr),min(sg,dg),min(sb,db),min(sa,da))
max取源顏色和目標顏色中的較大值,是逐分量比較
orgba = (max(sr,dr),max(sg,dg),max(sb,db),max(sa,da))
//正常(normal),即透明度混合
blend srcalpha oneminussrcalpha
//柔和相加(soft addtive)
blend oneminusdstalpha one
//正片疊底(multiply),即相乘
blend dstcolor zero
//兩倍相乘(2x multiply)
blend dstcolor srccolor
//變暗(darken)
blendop min
blend one one
//變亮(lighten)
blendop max
blend one one
//濾色(screen)
blend oneminusdstcolor one
// 等同於
blend one oneminussrccolor
//線性減淡(linear dodge)
blend one one
注意:雖然上面使用min和max混合操作時仍然設定了混合因子,但實際上它們(混合因子)並不會對結果有任何影響,因為min和max混合操作會忽略混合因子。
雖然上面有些混合模式並沒有設定混合操作的型別,但預設就是使用加法操作,相當於設定了 blendop add。
shader "zjt/shader8_2_blend"
_alphascale ("alpha scale", range(0, 1)) = 1 // 這個只是用來控制整體的透明度
}subshader
pass
zwrite off
blend srcalpha oneminussrcalpha
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "lighting.cginc"
fixed4 _color;
sampler2d _maintex;
float4 _maintex_st;
fixed _alphascale;
struct a2v ;
struct v2f ;
v2f vert(a2v v)
fixed4 frag(v2f i) : sv_target
endcg}}
fallback "transparent/vertexlit"
}
properties
_alphascale ("alpha scale", range(0, 1)) = 1
}subshader
// extra pass that renders to depth buffer only
pass
pass
zwrite off
blend srcalpha oneminussrcalpha
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "lighting.cginc"
fixed4 _color;
sampler2d _maintex;
float4 _maintex_st;
fixed _alphascale;
struct a2v ;
struct v2f ;
v2f vert(a2v v)
fixed4 frag(v2f i) : sv_target
endcg}}
fallback "transparent/vertexlit"
UnityShader初級篇 透明度混合
shader unity shaders book chapter 8 alpha blend 在透明紋理的基礎上控制整體的透明度 alphascale alpha scale range 0,1 1 subshader pass 關閉深度寫入 zwrite off 為透明度混合進行合適的混合狀態設...
透明度演算法
方法一 首先,要能取得上層與下層顏色的 rgb三基色,然後用 r,g,b 為最後取得的顏色值 r1,g1,b1是上層的顏色值 r2,g2,b2是下層顏色值 r r1 2 r2 2 g g1 2 g2 2 b b1 2 b2 2 以上為50 透明。若要使用不同的透明度用以下演算法 alpha 透明度 ...
透明度測試
shader custom testshader cutoff alpha cutoff range 0,1 0.5 subshader pass cgprogram pragma vertex vert pragma fragment frag include lighting.cginc fix...