第六章 基礎紋理(4)

2021-09-20 03:55:25 字數 2668 閱讀 3770

什麼是遮罩呢?簡單來講,遮罩可以允許我們保護某些區域,使它們免於 某些修改。例如,在之前的實現中,我們都是把高光反射應用到模型表面的所有地方,即所有的畫素都使用同樣大小的高光強度和高光指數。但有時我們希望模型表面的某些區域的反光強一些,而某些區域弱一些。為了得到更加細膩的效果,我們就可以使用一張遮罩紋理來控制光照。另一種是常見的應用是在製作地形材質時需要混合多張,例如表現草地的紋理、表現石子的紋理、表現裸露土地的紋理等,使用遮罩紋理可以控制如何混合這些紋理。

使用遮罩紋理的一般流程是:通過取樣得到遮罩紋理的紋素值,然後使用其中某個(或幾個)通道的值(texel.r)來與某種表面屬性進行相乘,這樣當該通道的值為0時,可以保護表面不受該屬性影響。總而言之,使用遮罩紋理可以讓美術人員更加精準(畫素級別)地控制模型表面的各種性質。

在本節中,我們將學習如何使用一張高光遮罩紋理,逐畫素的控制模型表面的高光反射強度。下圖西安設了只包含漫反射、未使用高光反射和使用遮罩的高光反射的對比效果。

我們使用的遮罩紋理如圖所示,可以看出,遮罩紋理可以讓我們更加精細地控制光照細節,得到更加細膩的效果。

步驟:(1)我們需要在properties語義塊中宣告更多的變數來控制高光反射:

properties

_maintex("main tex",2d)="white"{}

_bumpmap("normal map",2d)="bump"{}

_bumpscale("bump scale",float)=1.0

_specularmask("specular mask",2d)="white"{}

_specuarscale("specular scale",float)=1.0

_specular("specular",color)=(1,1,1,1)

_gloss("gloss",range(8.0,256))=20

}

上面屬性中的_specularmask既是我們需要使用的高光反射遮罩紋理,_specularscale則是用於控制遮罩影響度的係數。

(2)然後,我們在subshader語義塊中定義了pass語義塊,並在pass的第一行指明了該pass的光照模式:

subshader

}}

(3)我們需要定義和properties中各個屬性型別相匹配的變數:

fixed4 _color;

sampler2d _maintex;

float4 _maintex_st;

sampler2d _bumpmap;

float _bumpscale;

sampler2d _specularmask;

float _specularscale;

fixed4 _specular;

float _gloss;

我們為主紋理_maintex、法線紋理_bumpmap和遮罩紋理_specularmask定義了它們共同使用的紋理屬性_maintex_st。這意味著,在材質面板中修改主紋理的平鋪係數和偏移係數會同時影響3個紋理取樣。使用這種方式可以讓我們節省需要儲存的紋理座標數目,如果我們為每乙個紋理都使用乙個單獨的屬性變數texturename_st,那麼隨著紋理數目的增加,我們會迅速佔滿頂點著色器中可以使用的插值暫存器。而很多時候,我們不需要對紋理進行平鋪和位移操作,或者很多紋理可以使用同一種平鋪和位移操作,此時我們就可以對這些紋理使用同乙個變換後的紋理座標進行取樣。

(4)定義頂點著色器的輸入和輸出結構體

struct a2v;

struct v2f;

(5)在頂點著色器中,我們對光照方向和視角方向進行了座標空間變換,把它們從模型空間變換到了切線空間中,以便在片元著色器中和法線進行光照運算:

v2f vert(a2v v)
(6)使用遮罩紋理的地方是片元著色器,我們使用它來控制模型表面的高光反射強度:

fixed4 frag(v2f i):sv_target
環境光照和漫反射光照和之前使用過的**完全一樣。在計算高光反射時,我們首先對遮罩紋理_specularmask進行取樣。由於本書中使用的遮罩紋理的每個紋素的rgb分量其實都是一樣的,表明了該點對應的高光反射強度,在這裡我們選擇使用r分量來計算掩碼值。然後我們得到的掩碼值和_specularscale相乘,一起來控制高光的反射強度。

需要說明的是,我們使用的這張遮罩紋理其實有很多空間被浪費了——它的rgb分量儲存的都是同乙個值。在實際的遊戲製作中,我們往往會充分利用遮罩紋理中的每乙個顏色通道來儲存不同的表面屬性。

(7)最後我們為該unityshader設定合適的fallback:

fallback"specular"
在真實的遊戲製作過程中,遮罩紋理已經不止限於保護某些區域使它們免於修改,而是儲存任何我們希望逐畫素控制的表面屬性。通常,我們會充分利用一張紋理的rgba四個通道,用於儲存不同的屬性。例如我們把高光反射強度儲存在r通道,把邊緣光照的強度儲存在g通道,把高光發射的指數部分儲存在b通道,最後把自發光強度儲存在a通道,

第六章 基礎紋理(3)

儘管在一開始,我們在渲染中使用紋理是為了定義乙個物體的顏色,但後來人們發現,紋理其實可以用來儲存任何表面屬性。一種常見的用法就是使用漸變紋理來控制漫反射光照的結果。在之前計算漫反射光照結果的時候,我們都是使用表面法線和光照方向的點積結果與材質的反射率相乘來得到表面的漫反射光照。但有時,我們需要更加靈...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...