Unity shader 編譯指令

2021-08-01 18:46:22 字數 2173 閱讀 5620

程式片段被寫在cgprogram和endcg之間;在程式片段被編譯之前需要個程式加上預編譯(#pragma)。

1、#pragma vertex name:編譯name函式為頂點著色器

2、#pragma fragment name:編譯name函式為片段著色器

3、#pragma geometry name:編譯name函式為dx10的幾何著色器,會自動開啟#pragma target 4.0

4、#pragma hull name:編譯name函式為dx10的殼著色器,會自動開啟#pragma target 5.0

5、#pragma domain name:編譯name函式為dx10的域著色器,會自動開啟#pragma target 5.0

6、#pragma target name: 表明編譯目標

7、#pragma only_renderers space_separated_names:只為指定的渲染平台渲染著色器

8、#pragma exclude_renderers pace_separated_names:排除指定的渲染平台

9、#pragma multi_compile … :根據不同的情況,使用不同的預處理器指令,來多次編譯shader**

10、#pragma enable_d3d11_debug_symbols : 生成d3d11的除錯資訊,可以在vs2012(或以上)使用圖形偵錯程式除錯shader

11、#pragma hardware_tier_variants renderername: 針對所選渲染器的每個硬體層級,生成每個已編譯的shader的多重shader硬體變體

注:

(1)上述中space_separated_names包括以下值:

d3d9:direct3d 9

d3d11:direct3d 11/12

glcore:opengl 3.x/4.x

gles:opengl es 2.0

gles:opengl es 3.x

metal:ios&mac metal

d3d11_9x:direct3d 11 9.x特性等級一般用於wsa平台

xbox360:xbox 360

xboxone:xbox one

ps4:playstation 4

psp2:playstation vita

n3ds:nintendo 3ds

wiiu:nintendo wii u

(2)#pragma multi_compile詳解

以下鏈結有詳細介紹:

編譯指令#pragma su***ce surffunc lightingmodel [optional params]

通常就是名為surf的函式(函式名可以任意)必須指定,其固定格式為:

void surf(input in,inout su***ceoutput o)

光照模型函式,必須指定,unity內建了一些光照模型,預設情況下使用的是內建的lambert模型,包括:

standard:基於物理的漫反射模型

standardspecular:基於物理的高光模型

lambert:不基於物理的漫反射模型

blinnphong:不基於物理的高光模型

通過宣告乙個新的光照模型函式我們就能夠建立乙個新的關照模型,函式名的格式為:lighting《任意名字》你可以使用以下三種格式的光照模型函式:

(1)half4 lightingname(su***ceoutput s,half3 lightdir,half atten){}

該函式用於不需要視角方向的前向著色

(2)half4 lightingname(su***ceoutput s,half3 lightdir,half3 viewdir,half atten){}

該函式用於需要視角方向的前向著色

(3)half4 lightingname_prepass(su***ceoutput s,half4 light){}

該函式用於需要實現延遲著色的專案

包含可用的指令型別,包括開啟、關閉一些狀態,設定生成pass型別、指定可選函式,具體在以下部落格中有介紹:

Unity Shader預編譯指令

我們在unity中最常見的就是下面前兩種,使用就不必介紹了,這裡會針對其它一些較為常用的編譯指令做一下詳細介紹。1 pragma vertex name 編譯name函式為頂點著色器 2 pragma fragment name 編譯name函式為片段著色器 3 pragma geometry na...

關於編譯指令

自定義條件識別符號 define 下面例子中自定義了條件識別符號 bbbbb 識別符號和定義它的指令都不區分大小寫,但大家一般慣用大寫.begin showmessage 識別符號 bbbbb 已定義 showmessage 識別符號 bbbbb 未定義 end 測試預定義的 debug 和 rel...

編譯指令 pragma optimize

msdn 指令形式 optimize pragma optimize optimization list 僅用於專業和企業版本的特徵 優化只被visual c 專業版和企業版支援。更多的資訊參見microsoft visual c 聯機編輯。該指令指定在函式基中執行的優化。optimize編譯指示必...