UnityShader快速上手指南(一)

2022-07-07 02:00:31 字數 3619 閱讀 3264

其實網上有很多shader教程,但是大概看了下,也不知是網上各位大神已經脫離了**層面的高度還是啥原因。貌似沒有找到從**方面作為入門講解的,導致了shader對於苦逼程式設計師入門有一定要求,鄙人不才,來寫個比較低階的從**入門的shader教程吧。
了解過unityshader的人都知道,unityshader分三種,固定管線、表面著色器、頂點和片段著色器,具體區別書面上以及網上大神已經解釋的很清楚了,我就不多做贅述了,我這一系列教程只從頂點和片段著色器教程開始,跟其他教程可能也有些區別(一來就上比較坑爹的部分),如果您沒聽過頂點和片段著色器的,請止步於此。
如果已經習慣了自己的ide請直接跳過,只是推薦一下

3.將資料夾改名為unity-shader(就是去掉後面的-master)然後複製到sublime的packages路徑下

4.在sublime下設定unity的shader include路徑

preferences ->packages settting -> unity-shader - >setting - default

路徑是:d:/program files/unity/editor/data/cgincludes(自行模擬)

5.愉快的用sublime編寫shader吧(支援**跳轉及基本自動完成功能)

效果:

shader "lt/lesson1"

fixed4 frag ( void ) : color

endcg

} }}

這裡我們大概解釋一下我們要用的shader的**結構:

shader的語法是

shader "名字" // 這個名字自己隨便取,類似於類名,不需要與檔名相同

// 可以從unity中設定的外接屬性,後面具體講怎麼設定

subshader

} .

. // 可以有很多個,gpu執行的時候從上往下,找到第乙個可以執行的subshader執行

. subshader

// 備胎,在沒有任何subshader可以執行時,用該shader代替

fallback "diffuse"

}

以上就是我們大概要用的**結構,其實還有其他的,但是為了快速上手,後續要擴充套件再引入

其中除了subshader不能刪,其他的不用的都可以刪掉

所以精簡出我們的第乙個shader的結構:

shader "名字"

}}

下面講**部分:

我們要用的cg語言,前後必須用cgprogram和endcg包起來,

然後中間的部分就是我們真正的cg**了

#pragma vertex vert

// 這一行是定義處理頂點資訊的函式名

// 模型中每乙個頂點會呼叫一次該函式,gpu執行運算,注意效能

// 格式是: #pragma vertex 函式名,函式名字可以自己隨意取

#pragma fragment frag

// 這一行是定義處理片面資訊的函式名

// 具體呼叫時機不是很確定,應該是跟面數相關

// 格式是: #pragma fragment 函式名,函式名字可以自己隨意取

float4 vert ( float4 position : position ) : sv_position

// 對應的上面頂點處理的函式,傳入物件是乙個float4

// 其實是乙個頂點的詳細資訊,只是我們這裡通過: position單獨選取了位置資訊而已

// 後面的: sv_position表示return的float4作為sv_position(不可變頂點)

// 其實傳出為position也是可以的,dx10之後才有區別,sv_position效能更高

fixed4 frag ( void ) : color

// 對應上面的麵片處理的函式,這裡為了簡單,不處理任何資料

// : color 表示返回的fixed4型別作為color處理

先來明確編寫思路:

從上面的解釋可以看出,我們的顏色處理是在frag 函式中返回的

所以我們要想改變物體顏色,只需要更改這個返回值即可

那麼要從unity中更改顏色,我們就需要乙個外接屬性

恩,上面也講了,從properties 中設定!

直接上**吧

shader "lt/lesson1"

subshader

fixed4 frag ( void ) : color

endcg

} }}

好~

來解釋一下:

_color ("main color", color ) = (1,0,0,1)

表示我在unity的shader面板中定義了乙個_color的外接屬性

格式為 [變數名字] ("unity中顯示的名字", [型別]) = (值)

具體後面還有其他的,我也背不下來,用到再講,也可以自行查閱

然後定義了之後,並不能直接被cg**識別,

需要用到 uniform float4 _color;申明一下該變數名(名字必須完全一致)

然後後續操作就不解釋了吧,直接該顏色,返回就行

我們來看看效果

哈哈,這裡就是shader開始牛逼的地方了:

我們可以很高效的對模型頂點資料進行特殊處理!

這次我們要更改vert函式(這個應該不難想吧,頂點相關的操作一般都在這裡做了)

直接來**:

shader "lt/lesson1"

subshader

fixed4 frag ( void ) : color

endcg

} }}

來,先看效果再解釋

可以很清楚地看到,x軸被放大到了2倍,y變為了0.5倍,z沒有變化,

然後對比一下position * float4 (2,0.5,1,1)這個操作,應該很容易猜出這個操作的含義了吧

float4 (x,y,z,u)這個float4的xyz分別對應三個軸上的縮放量,u呢則是我們的單位長度

具體的縮放關係體現為 座標位置 = 原始位置 * (x / u)

當然,你也可以在這個函式中對頂線資訊進行其他操作,這裡只是最簡單乙個例子

UnityShader快速手冊 型別

1.shaderlab 可以顯示在編輯器面板 1.int 1.有些時候當作float處理 2.float 3.range min,max 4.color 5.vector 6.2d 7.3d 8.cube 2.cg hlsl 各自 pass 內使用 1.float 1.32位儲存 2.half 1....

ibatis 快速上手

簡介 例子 現在我們我們通過乙個簡單的案例,了解如何通過ibatis解決資料訪問問題。現在有有乙個資料庫,資料庫裡面有一張人員資訊表 需求是這樣 通過乙個web應用程式顯示人員資訊表裡面的資訊,並且可以新增 修改 刪除人員記錄 乙個並不複雜的案例,但是它覆蓋所有開發首先要學習的內容。第1步 the ...

Pro C快速上手

條件 winxp vc 6 裝在c program files microsoft visual studio vc98 oracle 9 裝在e oracle ora90 步驟 1 dos視窗設定環境變數,預編譯 oralce 給的關於pro c 例子 2 設定vc 環境 3 編譯執行 c程式。具...