unity3d遊戲開發學習分享之表面著色器講解

2021-09-09 02:31:43 字數 2686 閱讀 6798

一、三種著色器的書寫格式:

1、su***ce shaders, 指的是表面著色器

2、vertex and fragment shaders and 指的是頂點和片段著色器

3、fixed function shaders. 指固定功能著色器

二、頂點著色器與片段著色器

我們可以這麼理解,在unity的三維空間中,所有複雜模型都是由無數個三角形構成的,那麼頂點(vertex)就是說,這些構成複雜模型的三角形的頂點,而片段(fragment)就是這些三角形的填充區域了。

三、表面著色器(su***ce shader)標準的輸出結構:

1

struct

su***ceoutput

2;

四、我們的表面著色器應該去用 #pragma su***ce su***cefunction lightmodel [optionalparams] 指令,這起到乙個宣告的作用。

1、su***cefunction:接下來,該段表示了在cg函式中有著表面著色器(su***ce shader)的**。格式應該如下:void surf (input in,inout su***ceoutput o), input是自定義結構,該結構其中應該包括我們所有的紋理座標(texture coordinates)以及表面函式(su***cefunction)需要的額外必要變數。

2、lightmodel:就是說使其能夠在光照的模式下應用,其內建是lambert(diffuse)和 blinnphong(specular)。

五、著色器附加輸入結構:

1、float3 viewdir:檢視方向(view direction) 的值。這裡由於我們需要去計算視差效果(parallax effects)以及邊緣光照(rim lighting)等等,所以我們要包含檢視方向(view direction)的值。

2、float4 color:各個頂點中(per-vertex)顏色插值。

3、float4 screenpos:螢幕空間中的位置資訊。這裡因為我們可以去使用反射效果,所以說我們就需要在其中包含螢幕空間中位置的資訊。

4、float3 worldpos:世界空間位置。

5、float3 worldrefl:世界空間反射向量。這裡的話,如果我們的表面著色器(su***ce shader)不通過法線(o.normal)引數,那麼其將自行包含該引數。

6、float3 worldnormal:世界空間法線向量(normal vector)。這裡指的是如果表面著色器(su***ce shader)不通過法線法線(o.normal)引數,那麼它將包含這個引數。

7、float3 worldrefl(internal_data):世界空間反射向量。指表面著色器(su***ce shader)如果不寫入法線(o.normal)引數,那麼將自行包括該引數。我們為了能成功獲取到每個頂點法線貼圖( per-pixel normal map)的反射向量(reflection vector),所以我們就需要去應用世界的反射向量(worldreflectionvector (in, o.normal))。

8、float3 worldnormal(internal_data):世界空間法線向量(normal vector)。這裡說表面著色器(su***ce shader)如果不寫入法線(o.normal)引數,那麼就會包含這個引數。同樣的,我們為了成功獲取每個頂點法線貼圖( per-pixel normal map)的法線向量(normal vector),我們需要去應用世界法線向量(worldnormalvector (in, o.normal))。

六、光照模式宣告

該模式指的是以lighting開頭並且與名稱組合到一起的規範函式。我們可以在著色器檔案(shader file)或匯入的檔案(included files)中任何地方來宣告它。這個函式如下所示:

1、half4 lightingname(su***ceoutput s, half3 lightdir, half atten):指的是正向渲染路徑中(forward rendering path)所應用的模式,順便提醒大家,它並不是取決於檢視方向的(view direction)。

2、half4 lightingname(su***ceoutput s, half3 lightdir, half3 viewdir, half atten):在正向渲染路徑(forward rendering path)所應用的光照模式。它是取決於檢視方向的(view direction)。

3、half4 lightingname_prepass(su***ceoutput s, half4 light):這是在延時光照路徑(deferred lighting path)中使用的。

當定向解碼光照貼圖用於向前/延遲光照中的光照函式,或類似的函式中時,需要進行定製。

1、half4 lightingname_dirlightmap (su***ceoutput s, fixed4 color, fixed4 scale, bool surffuncwritesnormal):這是使用的不依賴於檢視方向(view direction)的光照模式(light model)。

2、half4 lightingname_dirlightmap (su***ceoutput s, fixed4 color, fixed4 scale, half3 viewdir, bool surffuncwritesnormal, out half3 speccolor):這是使用的依賴於檢視方向(view direction)的光照模式(light model)。

Unity3D遊戲開發

入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...

Unity3D遊戲開發初探

1 如何在遊戲指令碼程式中建立物件而不是一開始就建立好物件?使用gameobject的靜態方法 createprimitive view code 其中在createcube方法中,使用gameobject.createprimitive方法來建立cube型別的遊戲物件例項,設定了它出現的座標並為它...

學習 Unity 3D遊戲開發日常筆記

vr 虛擬實境技術 virtual reality,簡稱vr 就是帶的那個眼罩,大眼鏡。ar 增強現實技術 augmented reality,簡稱ar 是一種實時地計算攝影機影像的位置及角度並加上相應影象的技術,這種技術的目標是在螢幕上把虛擬世界套在現實世界並進行互動。mr 混合現實,mr是mag...