Unity Shader程式設計細節

2021-09-08 09:42:18 字數 830 閱讀 2802

1.通用編譯指令

#pragma vertex name

#pragma fragment name

2.cg/hlsl的語義,語義是不可省略的,它將告訴系統使用者需要輸入哪些值以及使用者的輸出是什麼。

position:告訴unity,把模型的頂點座標輸入

sv_position:告訴unity,頂點著色器的輸出是裁剪空間中的頂點座標

sv_target:它等同於告訴渲染器,把使用者的輸出顏色儲存到乙個渲染目標中。

3.資料是怎麼來的

填充到輸入結構體中的資料,是由使用該材質的mesh renderer提供的,在每幀呼叫draw call時,mesh render會把它負責渲染的模型資料傳送給unity shader。乙個模型通常包括了一組三角麵片,每個三角麵片由三個頂點構成,而每個頂點又包含了一些資料,例如頂點位置,法線,切線,紋理資料,頂點顏色等。

4.頂點著色器和片元著色器如何通訊

頂點著色器的輸出結構中必須包含乙個變數,它的語義是sv_position,否則,渲染器無法得到裁剪空間中的頂點座標,也就無法把頂點渲染到螢幕上。

注意:頂點著色器是逐頂點的,片元著色器是逐片元的。片元著色器的輸入實際上是把頂點著色器的輸出進行插值後得到的結果。

5.shader裡應該盡量不用分支和迴圈語句。因為gpu支援大量的算術運算時基於其高並行的硬體結構,但是在處理邏輯時,高並行的優勢就沒了。

6.每個pass結束時,返回顏色值,都會將每個通道的值擷取到1,類似如下操作,finalcol=min(fixed4(1,1,1,1),finalcol);這個一定要注意,要記著它會自動進行這種操作,防止在合併兩個pass的時候,由於沒有手動進行這種處理而發生錯誤。

程式設計細節小點

1.碰到字串中比較排序的時候,對數值進行比較的時候,不一定用正規表示式進行匹配是否是數值,然後再比較大小,可以直接用ascii碼進行比較大小。if c 0 c 9 2.將ip掩碼轉換成 long型 格式 string split 255.255.255.0 split listipnums new ...

程式設計細節綜合

console.read 讀取下乙個字元,但是要注意的是,她是依次讀取乙個完整的字串的第乙個字元,他返回的是乙個ascii碼 至少包含兩個字元13 10 如果你想讀取這串數字的所有字元,可以這樣做 while true 注意,這不是乙個無限死迴圈,不是像你們想象的,每輸入乙個,便列印一次,而是,你直...

MFC程式設計細節

1.禁止改變視窗大小 style ds setfont ds fixedsys ws minimizebox ws popup ws visible ws caption ws sysmenu ws thickframe style ds setfont ds fixedsys ws minimiz...