1. 程式人生 > >Unity Shader入門精要 閱讀筆記二

Unity Shader入門精要 閱讀筆記二

Unity Shader 基礎

unity shader在5.2版本以上能夠直接從專案中建立4個shader模板:standard surface shader、Unlit shader、Image Effect shader,computer shader.

standard shader:包含標準光照模型(使用了基於物理的渲染方法)
Unlit shader:不含光照的基本的頂點/片元著色器
Image Effect shader:處理螢幕效果
Computer shader:將一些計算放置到GPU中計算

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

shaderLab的基本結構:

shader"ShaderName"
{
    properties{
    //放置unity介面能訪問到的資料    
    }
    subshader{
    //子著色器
    }
    subshader{
    //子著色器
    }
    ...
    Fallback"Vertexlit"
}

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

properties

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

Name("display name",propertytype) = defaultValue

Name是屬性的名稱,用來和著色器進行關聯,display name用作在材質面板上顯示。propertytype是屬性的型別。defaultValue是屬性的預設值。
每個屬性的預設值是不同的,格式也是不同的,詳情見書:30頁。

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

subshader{
    [tags]//標籤設定
    [rendersetup]//狀態設定
    pass{

    }
}

tag用來設定標籤,通常是鍵值對的形式,這個就是之前在shader中看到一些設定比如:Tags{“TagName1”=”value” “TagName2”=”Value2”}

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

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

Pass

pass定義了一個完整的渲染流程,pass過多的話會影響渲染效率。
pass中也定義了一些tag和rendersetup。pass中的tag==於rendersetup基本相同==,但是==tag基本不同==。

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

Name"MyPassName"

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

UsePass"MyShader/MYPASSNAME"

表面著色器與頂點面片著色器之間的區別

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

開發語言是cg/HLGL,所有的程式碼需要在subshader中實現:

subshader{
    CGPROGRAM
    //cg code
    ENDCG
}

開發者只需要關注很少的一部分就可以了,但是這樣的效率並不高。
表面著色器有一個很明顯的特徵,那就是具體實現程式碼是在:

void surf(Input IN,inout SurfaceOutput o)
{

}

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

頂點/片元著色器

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

subshader{
    pass{
        CGPROGRAM
        //
        ENDCG
    }
}

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