第六章 基礎紋理(3)

2021-09-20 03:55:25 字數 2612 閱讀 9379

儘管在一開始,我們在渲染中使用紋理是為了定義乙個物體的顏色,但後來人們發現,紋理其實可以用來儲存任何表面屬性。一種常見的用法就是使用漸變紋理來控制漫反射光照的結果。在之前計算漫反射光照結果的時候,我們都是使用表面法線和光照方向的點積結果與材質的反射率相乘來得到表面的漫反射光照。但有時,我們需要更加靈活的控制光照。使用這種技術,可以保證物體的輪廓線相比於之前使用的傳統漫反射光照更加明顯,而且能夠提供多種色調製化。

在本節中,我們將學習如何用一張漸變紋理來控制漫反射光照。然後得到類似下圖的效果。

可以看出,使用這種方式可以自由的控制物體的漫反射光照。不同的漸變紋理有不同的特性。例如在左邊的圖中,我們使用一張從紫色調到淺黃的漸變紋理;而中間的漸變紋理是從黑色向淺灰色靠攏,而中間的分界線略微微發紅,這是因為畫家在插畫中往往會在陰影中使用這種色調;右邊的漸變紋理則通常被用於**風格的渲染,這種漸變紋理中的渲染通常是突變的,既沒有平滑過渡,以此來模擬**中的陰影色塊。

為了達到上述效果,我們需要進行以下工作:

(1)我們在properties語義塊中宣告乙個紋理屬性來儲存漸變紋理:

properties

_ramptex("ramp tex",2d)="white"{}

_specualr("specular",color)=

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

}

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

subshader

}}

lightmode是pass標籤中的一種,它用於定義該pass在unity的光照流水線中的角色

(3)然後,我們使用cgprogram和endcg開包圍住cg**片,以定義最重要的頂點著色器和片元著色器**。我們使用#pragma指令來告訴unity,我們定義的頂點著色器和片元著色器叫什麼名字。在本例中它們名字分別是vert和frag

cgprogram

#pragma vertex vert

#pragma fragment frag

(4)為了使用unity內建的一些變數,如_lightcolor0,還需要包含進unity的內建檔案lighting.cginc:

#include"lighting.cginc"
(5)隨後,我們需要定義和properties中各個屬性相匹配的變數:

fixed4 _color;

sampler2d _ramptex;

float4 _ramptex_st;

fixed4 _specular;

float _gloss;

我們為漸變紋理_ramptex定義了它的紋理屬性變數_ramptex_st

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

struct a2v;

struct v2f

(7)定義頂點著色器:

v2f vert(a2v v)
我們使用了內建的transform_tex巨集來計算經過平鋪和偏移後的紋理座標。

(8)接下來是關鍵的片元著色器:

fixed4 frag(v2f i):sv_target
在上面的**中,我們使用了以前所講的半蘭伯特模型,通過對該法線方向和光照方向的點積做一次0.5倍的縮放以及0.5倍的平移來計算半蘭伯特部分的halflambert。這樣我們得到的halflambert的範圍被對映到了[0,1]之間。之後我們使用halflambert來構建乙個紋理座標,並用這個紋理座標對漸變紋理_ramptex進行取樣,由於_ramptex實際上就是乙個一維紋理(它在縱軸方向上顏色不變),因此紋理座標的u和v方向我們都使用了halflambert。然後把從漸變紋理取樣得到的顏色和材質顏色_color相乘,得到最終的漫反射顏色。剩下的**就是計算高光反射和環境光,並把它們的結果進行相加。

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

fallback"specular"
需要注意的是。我們需要把漸變紋理的wrap mode設定為clamp模式,以防止由於浮點數精度而造成的問題。下圖給出了wrapmode分別為repeat和clamp模式的效果對比。

可以看出,左圖(使用repeat模式)在高光區域有一些黑點。這是由於浮點數精度造成的,當我們使用fixed2(halflambert,halflambert)對漸變紋理進行取樣時,雖然理論上halflambert的值在[0,1]之間,但可能會有1.00001這樣的值出現。如果我們使用的是repeat模式,此時就會捨棄整數部分,只保留小數部分,得到的值就是0.00001,對應了漸變圖中最左邊的值,即黑色。因此,就會出現圖中這樣在高光區域反而有黑點的情況。我們只需把紋理的wrapmode設為clamp模式就可以解決這種問題。

第六章 基礎紋理(4)

什麼是遮罩呢?簡單來講,遮罩可以允許我們保護某些區域,使它們免於 某些修改。例如,在之前的實現中,我們都是把高光反射應用到模型表面的所有地方,即所有的畫素都使用同樣大小的高光強度和高光指數。但有時我們希望模型表面的某些區域的反光強一些,而某些區域弱一些。為了得到更加細膩的效果,我們就可以使用一張遮罩...

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的位,他們可以被解釋為整數或者其他,這取決...