UnityShader 透明度混合

2021-10-07 12:05:07 字數 4876 閱讀 3030

關閉深度寫入帶來的問題

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

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...