Shader 三種主要UnityShader形式

2021-08-29 18:31:26 字數 1177 閱讀 9472

unity shader最重要的任務是指定各種著色器所需的**。這些著色器**可以寫在subshader語義塊中(如:表面著色器),也可以寫在pass語義塊中(如:頂點/片元著色器、固定函式著色器)。

在unity中,我們可以使用三種形式來編寫unity shader,而不管使用哪種形式,真正意義上的shader**都需要包含在shaderlab語義塊中。

表面著色器是unity自己建立的一種著色器**型別。它的**量很少,unity在背後做了很多任務作,但渲染的代價比較大。

表面著色器是unity對頂點、/片元著色器的更高一層的抽象。當給unity提供乙個表面著色器的時候,它在背面仍把該著色器轉換成對應的頂點/片元著色器。

表面著色器被定義在subshader語義塊(不是pass語義塊)中cgprogram和endcg之間。原因是,表面著色器不需要開發者關心使用多少個pass、每個pass如何渲染等問題,unity會在背後為我們做好這些事情。

cgprogram和endcg之間的**是使用cg/hlsl編寫的,也就是說,我們需要把cg/hlsl語言巢狀在shaderlab語言中。(

注意:這裡的cg/hlsl是經過unity封裝後提供的,某些地方不同於標準的cg/hlsl語法。)

相比表面著色器更加複雜,但更加靈活,我們可以控制渲染的實現細節。

頂點/片元著色器**塊寫在pass語義塊內。原因是,我們需要自己定義每個pass需要使用的shader**。

頂點/片元著色器**也是使用cg/hlsl編寫的。

之前兩種unity shader形式都使用了可程式設計渲染。但對於一些較舊的裝置,它們不支援可程式設計管線著色器,這時候就需要使用固定函式著色器來完成渲染,這種著色器只能實現一些簡單的效果。

固定函式著色器**被定義在pass語義塊中,這些**相當於pass中的一些渲染設定。

固定函式著色器**需要完全使用shaderlab的語法,而非使用cg/hlsl。

在unity5.2中,所有固定函式著色器都會在背後被unity編譯成對立的頂點/片元著色器。因此,真正意義上的固定函式著色器已經不存在了。

如果需要和各種光源打交道,使用表面著色器,但要注意它在移動平台上的效能表現。

如果光照數目非常少,可以使用頂點/片元著色器。

如果有很多自定義的渲染效果,使用頂點/片元著色器。

只有明確需要使用固定函式著色器(如在舊裝置上執行遊戲)時才使用固定函式著色器,否則使用另兩個著色器。

listView主要三種優化方案

1 如果自定義介面卡,那麼在getview方法中要考慮方法傳進來的引數contentview是否為null,如果為null就建立contentview並返回,如果不為null則直接使用。在這個方法中盡可能少建立view。2 給contentview設定tag settag 傳入乙個viewholde...

陣列的三種主要排序

介紹一下我自己,是一名在校培訓的初級程式設計師,所以寫的東西可能會有bug,還請大神多多指教 第一種是氣泡排序,簡單的來形容就是兩兩比較,就好像是一組人比身高,下面讓我們舉個例子 假設有乙個這樣的陣列 var arr 10,9,8,7,6 來用氣泡排序來進行排序第一輪 有5個數進行比較,兩兩比較,較...

unity的三種移動方式

第一種移動方式 首先在方法外宣告剛體 private rigidbody body 為了明顯,可定義乙個速度 public float speed void start void update if input.getkey keycode.s if input.getkey keycode.a i...