Shader其他整理

2021-06-28 11:47:38 字數 3928 閱讀 2019

1、culling陰影面剔除

culling陰影面剔除是一種優化技術。所有的多邊形都有正反兩面,而你永遠只能看見其中一面,不信的話拿張紙板或者一面鏡子看看你能不能同時看到兩面。通常多邊形面向螢幕裡面的背面,我們看不見,所以會將該面剔除。

cull off 關閉陰影面剔除

cull back 剔除背面

cull front 剔除正面

2、depth testing深度測試

depth testing:深度測試,也叫深度緩衝。只有最靠近觀察者的物體會被繪製。深度即z,該值越小表示離觀察者越近,該值越大表示離觀察者越遠。

shader裡預設有如下**

zwrite on

ztest lequal

意思即使shader裡沒有寫任何關於depth testing的**,shader也會執行深度測試。

zwrite:是否此物體的畫素深度會被記錄(預設記錄),

zwrite on  深度記錄(預設on)

zwrite off  不記錄此深度,通常用於半透明物體,

ztest:預設是 lequal。 即當深度小於或者等於深度最小值時,渲染物體,即渲染最近的物體。

3、alphatest 透明度測試

alpha test ,中文就是透明度測試。簡而言之就是v&f shader中最後fragment函式輸出的該點顏色值(即上一講frag的輸出half4)的alpha值與固定值進行比較。 alphatest語句通常位於pass{}中的起始位置。

語法:第一種:alphatestoff: 不測試,全渲染

第二種:alpha 比較符 目標alpha值

其中目標alpha值取值範圍是 0至1,也可以用引數 ,如 alphatest [varname]。

比較符:(目標alpha值下面記作x)

always  全渲染(任意x值)

never   全不渲染

greater  點的alpha值大於x時渲染

geuqal   點的alpha值大於等於x時渲染

less       點的alpha值小於x時渲染

lequal    點的alpha值小於等於x時渲染

equal  點的alpha值等於x時渲染

notequal  點的alpha值不等於x時渲染

例:alphatest never  0     全不渲染(這個0可以是任意值,但必須填)

alphatest always 0     全渲染(這個0可以是任意值,但必須填)

alphatest off              全渲染

alphatest greater 0.4  當alpha大於0.4渲染,  缺點是邊緣過於鋒利並且顯示不完整,alpha小於0.4的部分被忽略掉了

alpha blend                

邊緣柔和,但是中心也太柔和,沒有實體的感覺

alphatest greater 0.4 /alphatest lequal 0.4

兩個部分,大於

0.4不混合,小於

0.4混合。效果是既有實體感覺,邊緣也柔和。

4、alpha混合

alpha blending,中文譯作alpha混合

blend srcalpha oneminussrcalpha:

blending就是控制透明的。處於光柵化的最後階段。

這裡例如我們給乙個模型貼乙個材質,那麼在某個點計算出來顏色值稱為源,而該點之前累積的顏色值,叫目標。

語法blend off   ,  不混合

blend srcfactor dstfactor , srcfactor是源係數(靠近攝像機),dstfactor是目標係數

最終顏色= (

shader

計算出的點顏色值

* 源係數)

+(點累積顏色

*目標係數)

屬性(往srcfactor,dstfactor 上填的值)

one                         1

zero                        0

srccolor                源的rgb值,例如(0.5,0.4,1)

srcalpha                 源的a值, 例如0.6

dstcolor                  混合目標的rgb值例如(0.5,0.4,1)

dstalpha                  混合目標的a值例如0.6

oneminussrccolor   (1,1,1)- srccolor

oneminussrcalpha         1- srcalpha

oneminusdstcolor         (1,1,1) - dstcolor

oneminusdstalpha         1- dstalpha

運算法則示例:

(注:r,g,b,a,x,y,z取值範圍為[0,1])

(r,g,b) * a = (r*a , g*a , b*a)

(r,g,b) * (x,y,z) = (r*x , g*y , b*z)

(r,g,b) + (x,y,z) = (r+x , g+y ,b+z)

(r,g,b) - (x,y,z)  = (r-x , g-y, b-z)

5、霧化

參考:部分霧化: 三種shader都可使用,在需要霧化的物體shader指令碼裡,加上如下**

fog6、貼圖與光影

從本講開始講一些特效貼圖。這些貼圖大多數是在不採用高精度模型的情況下,以較小的代價獲得最好的畫面效果。而涉及的主要是與光有關的運算。

7、render setup 渲染設定

通道設定顯示硬體的各種狀態,例如能開啟alpha混合,能使用霧,等等。這些命令如下:

material 

定義乙個使用頂點光照管線的材質,參考material頁面。

lighting on | off

開啟或關閉頂點光照,參考material頁面。

cull back | front | off

set polygon culling mode. 設定多邊形剔除模式

ztest (less | greater | lequal |gequal | equal | notequal | always)

set depth testing mode. 設定深度測試模式

zwrite on | off

set depth writing mode. 設定深度寫模式

fog 

set fog parameters. 設定霧引數

alphatest (less | greater | lequal |gequal | equal | notequal | always) cutoffvalue

turns on alpha testing. 開啟alpha測試

sets alpha blending mode. 設定alpha混合模式

color color value

設定當頂點光照關閉時所使用的顏色

colormask rgb | a | 0 | anycombination of r, g, b, a

設定顏色寫遮罩。設定為0將關閉所有顏色通道的渲染

set depth offset. 設定深度偏移

separatespecular on | off

開啟或關閉頂點光照相關的平行高光顏色, 參考material頁面。

colormaterial ambientanddiffuse |emission

當計算頂點光照時使用每頂點顏色, 參考material頁面。

8、bindchannels命令

允許你指定頂點資料如何對映到顯示卡中。

可程式設計頂點著色器使用時,bindchannels將沒有效果。在這種情況下,繫結受頂點著色器輸入控制。

預設情況下,unity3d 會為你計算並繫結,但在某些情況下,你要使用自定義繫結。

Shader學習整理

好久沒寫部落格了,研究了一段時間shader,整理一下 unity的shader包含三種,固定渲染管線,cg片段,su ce表面著色器,unity推薦su ce表面著色器,寫起來簡單,很多東西unity都做好了,實際中往往看具體需求而定,一般選cg片段和su ce表面著色器。然而不管怎麼說,基礎理論...

LayaAir 2 6 雪地shader整理

因為最近開發乙個laya3d小遊戲,有需要用到shader的地方,最後發現網上找的laya shader因為laya api的變動而沒能達到自己想要的效果,所以決定整理一下 snowmaterial.ts export default class snowmaterial extends laya....

shader常用數學函式整理(持續更新)

step a,b b a 1 0 smoothstep x,y,a a如果小於x返回0 如果a y返回1 在x y之間返回 3a 2 2a 3 saturate x 如果x取值小於0,則返回值為0。如果x取值大於1,則返回值為1。若x在0到1之間,則直接返回x的值.lerp a,b,w a,b,w ...