Unity Shader入門精要 閱讀筆記二

2021-08-10 11:11:40 字數 1844 閱讀 6551

unity shader在5.2版本以上能夠直接從專案中建立4個shader模板:standard su***ce shader、unlit shader、image effect shader,computer shader.

standard shader:包含標準光照模型(使用了基於物理的渲染方法)

unlit shader:不含光照的基本的頂點/片元著色器

image effect shader:處理螢幕效果

computer shader:將一些計算放置到gpu中計算

shaderlab:這是unity 對我們封裝了大部分的渲染實現細節,向開發者提供的一種著色器語言。

shaderlab的基本結構:

shader"shadername"

subshader

subshader

...fallback"vertexlit"

}

子著色器是為了shader能夠適應不同的gpu環境,unity在shader中查詢,直到找到最適合的,如果沒找到,就在fallback中去找。

為了能讓shader中的變數在面板中調控,需要在properties中定義屬性,格式為:

name("display name",propertytype) = defaultvalue
name是屬性的名稱,用來和著色器進行關聯,display name用作在材質面板上顯示。propertytype是屬性的型別。defaultvalue是屬性的預設值。

每個屬性的預設值是不同的,格式也是不同的,詳情見書:30頁。

subshader是著色器的具體的實現部分,格式為:

subshader

}

tag用來設定標籤,通常是鍵值對的形式,這個就是之前在shader中看到一些設定比如:tags

rendersetup 是渲染狀態設定,用來處理深度測試、深度寫入等的設定。

tags和rendersetup都是設定渲染流水線中的可配置部分。

pass定義了乙個完整的渲染流程,pass過多的話會影響渲染效率。

pass中也定義了一些tag和rendersetup。pass中的tag==於rendersetup基本相同==,但是==tag基本不同==。

同時可以給pass定義乙個名稱,通過以下方法定義:

name"mypassname"
定義名稱很大程度上是為了方便其他的shader呼叫,呼叫是需要注意所有的英文單詞需要大寫!:

usepass"myshader/mypassname"
表面著色器其實是unity的一種封裝,為的是讓開發者儘量減少開發的難度,而只需要去通過簡單的設定就能開發出想要的效果。減少開發的一些細節。這樣的好處是開發簡單,但是自由度很低。

開發語言是cg/hlgl,所有的**需要在subshader中實現:

subshader
開發者只需要關注很少的一部分就可以了,但是這樣的效率並不高。

表面著色器有乙個很明顯的特徵,那就是具體實現**是在:

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

中實現。這裡不需要寫pass,因為具體的渲染細節已經被unity所隱藏了。

頂點/片元著色器

這個於表面著色器最大的區別在於使用者需要自定義渲染過程,並且所有的**都需要寫在pass**塊中:

subshader

}

這樣的代價是我們需要寫很多渲染相關的**,但是具有很高的自由度。

Unity Shader入門精要

學習資料 unity shader入門精要 時長 乙個月 計畫 1 2天完成一章,預計乙個月內完成 幾何階段 gpu實現,輸出螢幕空間的二位點座標,深度,著色資訊,傳送給光柵化階段 光柵化階段 gpu實現,決定每個渲染圖元哪些畫素應該被繪製在螢幕上,將幾何階段傳來的頂點資料進行插值 頂點v法線的獲取...

筆記 《Unity Shader入門精要》

應用階段 輸出渲染圖元 rendering primitives 包括 準備場景資料 相機 場景模型 光源 粗粒度剔除 culling 把不可見的物體剔除 渲染狀態 材質 紋理,使用的shader等。光柵化階段 每個渲染圖元的哪些畫素應該被繪製在螢幕上,包括 三角形設定 三角形遍歷 片元著色器 逐片...

《UnityShader入門精要》Unity陰影

lightmode為shadowcaster的pass是用來渲染陰影對映紋理。該shader如果沒有定義lightmode為shadowcaster的pass,則會去fallback指定的shader繼續尋找。如果沒有找到,該物體無法向其他物體投射陰影,但能接收來自其他物體投射的陰影 螢幕空間的對映...