今天要說的是Unity3D中shader相關的一些知識。不會做非常細致的講解(東西實在太多!- -),但是看完之后會知道shader是怎么用的。
在shader編程中,有一些術語,有時候不明白的話容易被整懵圈,所以這里就簡單提一下。
Shading
Shading最開始指的在素描中給物體畫明暗調子,在圖形學中,其實就是給Mesh上色(Mesh就是一堆三角面片,包含頂點左邊,法線坐標,uv坐標之類的),wiki中說的是根據物體相對于光線的角度及其距離光源距離改變物體顏色生成photorealistic效果的過程。我們所編寫的處理shading的程序就叫做shader,中文叫著色器,程序的輸入是顏色,紋理,坐標等等,輸出的是mesh網格的最終的顏色。
光照模型
光照模型主要包括兩個部分,一部分是光源的定義,另一部分是mesh表面的光照計算。光源根據現實中的光源可以抽象成點光源,方向光源,聚光燈。mesh表面的光照計算主要計算三個部分, 環境光(Ambient light),漫反射光(Diffuse light),全反射光(Specular light)。
Lambert光照模型
此模型屬于經驗模型,主要用來簡單模擬粗糙物體表面的光照現象。
此模型假設物體表面為理想漫反射體(也就是只產生漫反射現象,也成為Lambert反射體),同時,場景中存在兩種光,一種為環境光,一種為方向光,然后我們分別計算這兩種光照射到粗糙物體表面所產生的光照現象,最后再將兩個結果相加,得出反射后的光強值。
首先是計算環境光的公式:
I_ambdiff = K_d * I_a;
其中,K_d為粗糙物體表面材質對光的反射系數,這個系數由程序編寫者在宿主程序中給出,I_a為環境光的光強,也就是環境光的顏色數值,一般是一個float3型的變量。
然后是計算方向光的公式:
I_ldiff = K_d * I_l * cosa;
由向量的點積公式可得:cosa = N