Shader 學習之路-Unity Shader 范例(七)

1、根據(jù)Unity 3d引擎,可以知道一些常用的Unity Shader 模版


2、標準著色器模版信息


3、常用屬性標簽信息


4、Unity Shader 常用結構

//著色器名稱

Shader "ShaderName"

{

//屬性

Properties{Name("display name",propertyType)=DefaultValue}

//子著色器

SubShader

{

//可選標簽(告訴Unity 何時如何渲染對象)

[Tags]

//可選狀態(tài)設置(開關混合、深度測試、剔除模式、設置深度測試使用函數(shù))

[RenderSetup]

//完整渲染流程

Pass

{

[Name]

[Tags]

[RenderSetup]

}}

//SubShader 不能運行時執(zhí)行(同時渲染陰影)

Fallback "VertexLit"

}

5、淺析Properties 屬性:可以在引擎中屬性面板顯示Shader 屬性

定義:Name(“display name”,PropertyType)=DefaultValue

Name:名字,在Shader中訪問該變量時,即面板顯示的標簽名字

DisPlay Name:顯示名字,即面板顯示標簽的名字

PropertyType:屬性類型

DefaultValue:默認值

Properties {

? ? // Numbers and Sliders

? ? _Int ("Int", Int) = 2

? ? _Float ("Float", Float) = 1.5

? ? _Range("Range", Range(0.0, 5.0)) = 3.0

? ? // Colors and Vectors

? ? _Color ("Color", Color) = (1,1,1,1)

? ? _Vector ("Vector", Vector) = (2, 3, 6, 1)

? ? // Textures

? ? _2D ("2D", 2D) = "" {}

? ? _Cube ("Cube", Cube) = "white" {}

? ? _3D ("3D", 3D) = "black" {}



6、淺析SubShader 子著色器,每個Unity Shader 文件可以包含多個SubShader 語義塊,至少一個。在調(diào)用Shader時Unity會掃描所有SubShader并選擇一個可以在目標平臺運行的SubShader,若沒有合適的SubShader,系統(tǒng)就會調(diào)用Fallback語句定義的Unity Shader。

SubShader的代碼段的大體結構如下:

SubShader

{//可選的

[Tags]

//可選的

[RenderSetup]

Pass

{....}

//Other Passes}

其中[Tags]為標簽的設置,[RenderSetup]為一些通用狀態(tài)的設置,這兩者都是可有可無的,而Pass語句塊則定義了一次完整的渲染過程。在SubShader中可以定義多個Pass語句塊,在Pass中可以對只用于該Pass的狀態(tài)進行設置。一般編程時為了減少CPU和GPU的負擔會盡可能少的定義Pass語句塊。

SubShader中的常用狀態(tài)設置有以下幾個:

1.Cull Back/Front/Off

設置剔除模式:剔除背面/剔除正面/關閉剔除。

2.ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always

設置深度測試時使用的函數(shù)。

3.ZWrite On/Off

開啟/關閉深度寫入。

4.Blend SrcFactor DstFactor

開啟并設置混合模式。

5.ColorMask RGB? |? A? |? 0? |? 其他任何R、G、B、A的組合

設置顏色通道的寫掩碼(write mask)

SubShader中的標簽(Tags)是一個鍵值對(Key/Value Pair),它的鍵和值都是字符串類型。用途是告訴渲染引擎怎樣以及何時渲染這個對象。其結構如下:

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }//SubShader中主要的標簽類型有以下幾種:

Tags { "Queue" = "Transparent" }//控制渲染順序,制定該物體屬于哪一個渲染序列。

Tags { "RenderType" = "Opaque" }//對著色器進行分類如(透明/不透明)。

Tags { "DisableBatching" = "True" }//是否使用批處理。

Tags { "ForceNoShadowCasting" = "True" }//是否投射陰影。

Tags { "IgnoreProjector" = "True" }//是否不受Projector影響。

Tags { "CanUseSpriteAtlas" = "True" }//該SubShader是否不用于Sprite(精靈)。

Tags { "PreviewType" = "Plane" }//指明材質(zhì)面板會如何預覽該材質(zhì)如(球形“Sphere”、平面“Plane”等)。

上述標簽不可以寫在Pass里。

Pass語句塊的結構大致如下:

Pass{

[Name]

[Tags]

[RenderSetup]

//OtherCode

}

設在一個Pass中如下定義了Pass的名稱:

Name "MyPassName"

通過這個名稱,我們可以使用UsePass命令在其他的Unity Shader中調(diào)用這個Pass,例如:

UsePass "MyShader/MYPASSNAME"http://其中MyShader為定義了這個Pass的Unity Shader的名稱。

Pass同樣可以設置標簽來告訴渲染引擎怎樣渲染物體,但與上文中提到的SubShader中的標簽又不相同,Pass中的標簽有下面幾個類型:

Tags { "LightMode" = "ForwardBase" }//定義該Pass在Unity的渲染流水線的角色。

Tags { "RequireOptions" = "SoftVegetation" }//用于指定當滿足一定條件時才渲染該Pass。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • <轉(zhuǎn)>我也忘了轉(zhuǎn)自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對3D對象進行操作...
    星易乾川閱讀 5,631評論 1 16
  • Basic Shaderlab unity 使用一個叫做 shaderlab 的語言用來包裝和組織整個shader...
    goteet閱讀 3,144評論 0 12
  • 轉(zhuǎn)載注明出處:點擊打開鏈接 Shader(著色器)是一段能夠針對3D對象進行操作、并被GPU所執(zhí)行的程序。Shad...
    游戲開發(fā)小Y閱讀 3,429評論 0 4
  • 三字經(jīng)寫到:人之初,性本善。人在最初的時候,本性是善良的。這樣善良的本性大家也都差不多。只是在后期成長過程中...
    羅銀丹閱讀 335評論 0 1
  • 2017年年初,我在自己的新年計劃里寫下了一個新年愿望:習得寫作技能,為此我的數(shù)量目標是發(fā)布至少60篇文章。半年過...
    波米諾不知道閱讀 229評論 0 0