Unity學習筆記 Shader第一期

2021-09-10 19:31:21 字數 3659 閱讀 6695

fallback

總結

參考文獻

用unity做遊戲開發的小夥伴對此一定不陌生,shader也稱之為「著色器」,實際上就是一小段程式,它負責將輸入的mesh(網格)以指定的方式和輸入的貼圖或者顏色等進行組合處理,然後輸出,同時繪圖單元可以依據輸出的內容來將影象繪製到螢幕上。

我們在unity中輸入的貼圖或者顏色等屬性,加上對應寫好的shader,經過shader的處理過後我們得到了我們想要的紋理效果,將這些內容打包儲存在一起,得到的就是乙個material(材質)。之後,我們便可以將材質賦予合適的renderer(渲染器)來進行渲染(繪製)了。

型別說明

su***ce

通俗來講su***ce shader(表面著色器)已替我們完成大部分的工作,只需要簡單的技巧即可實現很多不錯的效果。

fragment

fragmentshader(片段著色器)可以在比較低的層級上進行更複雜更有針對性地開發,因此可以做更多的事情,但比較難寫。

這裡直接先給出一段unity預製的standard su***ce shader,下面會針對每乙個層級進行解釋

shader "custom/diffuse texture"

} subshader

lod 200

cgprogram

#pragma su***ce surf lambert

sampler2d _maintex;

struct input

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

endcg

} fallback "diffuse"

}

從上面的**中不難看出shader的結構主要由【shader】【properties】【subshader】【fallback】構成,值得一提的是,乙個【shader】下可以包含多個【subshader】,原因後面會講。

shader "custom/diffuse texture"

//此處宣告了乙個叫做"diffuse texture"的shader,同時將其放置在自定義的custom父級選單下。

需要注意的是"custom/diffuse texture"並非指代專案assets下的目錄層級,而是unity根據你此處自定義的層級自動生成的shader選項選單,在unity中你看到的是這樣的

properties
properties是存放所有宣告屬性的容器,屬性的宣告有格式上的要求,如下:

_屬性名稱 (

"unity中可見名稱"

, 屬性型別名稱)

= 屬性初始預設值

就拿例子中的shader來說

_maintex (

"base (rgb)"

,2d)

="white"

maintex = 屬性名稱 (注意名稱前的"_"不可缺失)

base (rgb) = unity中可見名稱

2d = 屬性型別名稱

white = 屬性初始預設值 (此處即為空白)

properties 

}

緊接著我們來看看幾種常見的type(屬性型別)

型別說明

color

一種顏色,由rgba(紅綠藍和透明度)四個量來定義

2d一張2的階數大小(256,512之類)的貼圖。這張貼圖將在取樣後被轉為對應基於模型uv的每個畫素的顏色,最終被顯示出來

rect

乙個非2階數大小的貼圖

cube

立方體紋理,簡單說就是6張有聯絡的2d貼圖的組合,主要用來做反射效果(比如天空盒和動態反射),也會被轉換為對應點的取樣

range(min, max)

乙個介於最小值和最大值之間的浮點數,一般用來當作調整shader某些特性的引數(比如透明度渲染的截止值可以是從0至1的值等)

float

任意乙個浮點數

vector

乙個四維數

shader的作用是將輸入的貼圖或者顏色等進行組合處理,然後輸出得到我們想要的效果,整個處理的邏輯都在subshader中。在解釋subshader的邏輯含義之前,首先我們要來說說兩個在subshader中常見的屬性tags和lod:

br#我們來看一下例子:

subshader 

}

此處"rendertype"="opaque"即表示,當進行渲染非透明物體時,呼叫該subshader下的邏輯方法。

lodlod是level of detail的縮寫,顧名思義,它是一種控制細節級別的技術。lod的數值越高,畫面的渲染質量越高,但是對硬體也有較高的要求。在unity中,我們可以在quality面板為專案設定maximum lod level(最大lod等級)

maximum lod level可以設定7個等級,maximum lod level會與shader lod進行大小比較,只有在maximum lod level範圍內的shader才可以被呼叫,因此使用lod可以針對不同平台進行渲染質量的調節,shader lod具體對照如下

maximum lod level

shader lod說明

0任何lod值的shader都可以被呼叫

1lod 100

2lod 200

3lod 300

4lod 400

5lod 500

6lod 600

回到例子

subshader
此處設定的lod值為200,參照上述**,假設當maximum lod level小於等於2時,這個shader就可以被呼叫,反之不可。

shader主體部分

subshader 

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

endcg

}

主體部分由cgprogram開始,於endcg結束,這裡面包含了整個shader的核心邏輯,輸入端的內容將會在這裡進行處理並進行輸出,由於主體相對比較複雜先大概掃一眼就好,我會在下一期專門做有關shader主體部分的筆記。

fallback "diffuse"
這個很好理解,當上面所有的subshader都無法執行時,會直接執行fallback命令,並使用fallback所指向的shader,簡單來說就是shader給自己留的一條「後路」。

這一期的筆記主要整理了unityshader的一些基礎知識,筆者是個剛跨入計算機圖形學領域的小白,也還在學習相關的知識,開始寫部落格的目的也是希望能給自己所學的知識做乙個鞏固,同時也希望各位行業大大們糾正指出我理解有誤的地方,從而提公升自己的技術水平。那麼,下期筆記見!

Shader學習筆記

direct和opengl兩種程式設計標準,前者是微軟提供的,一般用於windows平台,而後者是linux android ios等都共同支援的標準。由這兩種標準就衍生出來了集中gpu程式語言,諸如hlsl cg glsl等,在unity裡面,並不直接使用者三種語言去編寫,而是用自己自定義的sha...

Shader 學習筆記 20151031

閱讀了unity shaders and effects cookboot的 custom light model一節。page 17 閱讀了unity online manual關於 custom light model兩段文章 閱讀了博文 unity shaders 初探su ce shader...

Shader 學習筆記 20151102

計算光源法線點乘,也就是它們之間的夾角余弦 float diflight dot s.normal,lightdir 計算視點法線點乘,也就是它們之間的夾角余弦 float rimlight dot s.normal,viewdir 給光源法線點乘搞了乙個hlambert效果 就是讓非光照面也有明暗...