Unity-使用 Cg/HLSL 訪問著色器屬性
著色器在?Properties?代碼塊中聲明材質(zhì)屬性。如果要在著色器程序中訪問其中一些屬性,則需要聲明具有相同名稱和匹配類型的 Cg/HLSL 變量。著色器教程:頂點(diǎn)和片元程序中提供了一個(gè)示例。
例如,以下著色器屬性:
可通過如下 Cg/HLSL 代碼進(jìn)行聲明以供訪問:
Cg/HLSL 還可以接受?uniform?關(guān)鍵字,但該關(guān)鍵字并不是必需的:
uniform float4 _MyColor;
ShaderLab 中的屬性類型以如下方式映射到 Cg/HLSL 變量類型:
Color 和 Vector 屬性映射到?float4、half4?或?fixed4?變量。
Range 和 Float 屬性映射到?float、half?或?fixed?變量。
對于普通 (2D) 紋理,Texture 屬性映射到?sampler2D?變量;立方體貼圖 (Cubemap) 映射到?samplerCUBE__;3D 紋理映射到?sampler3D__。
如何向著色器提供屬性值
在下列位置中查找著色器屬性值并提供給著色器:
MaterialPropertyBlock?中設(shè)置的每渲染器值。這通常是“每實(shí)例”數(shù)據(jù)(例如,全部共享相同材質(zhì)的許多對象的自定義著色顏色)。
在渲染的對象上使用的材質(zhì)中設(shè)置的值。
全局著色器屬性,通過 Unity 渲染代碼自身設(shè)置(請參閱內(nèi)置著色器變量),或通過您自己的腳本來設(shè)置(例如?Shader.SetGlobalTexture)。
優(yōu)先順序如上所述:每實(shí)例數(shù)據(jù)覆蓋所有內(nèi)容;然后使用材質(zhì)數(shù)據(jù);最后,如果這兩個(gè)地方不存在著色器屬性,則使用全局屬性值。最終,如果在任何地方都沒有定義著色器屬性值,則將提供“默認(rèn)值”(浮點(diǎn)數(shù)的默認(rèn)值為零,顏色的默認(rèn)值為黑色,紋理的默認(rèn)值為空的白色紋理)。
序列化和運(yùn)行時(shí)材質(zhì)屬性
材質(zhì)可以同時(shí)包含序列化的屬性值和運(yùn)行時(shí)設(shè)置的屬性值。
序列化的數(shù)據(jù)是在著色器的?Properties?代碼塊中定義的所有屬性。通常,這些是需要存儲在材質(zhì)中的值,并且可由用戶在材質(zhì)檢視面板中進(jìn)行調(diào)整。
材質(zhì)也可以具有著色器使用的一些屬性,但不在著色器的?Properties?代碼塊中聲明。通常,這適用于在運(yùn)行時(shí)從腳本代碼(例如,通過?Material.SetColor)設(shè)置的屬性。請注意,矩陣和數(shù)組只能作為非序列化的運(yùn)行時(shí)屬性存在(因?yàn)闊o法在 Properties 代碼塊中定義它們)。
特殊紋理屬性
對于設(shè)置為著色器/材質(zhì)屬性的每個(gè)紋理,Unity 還會在其他矢量屬性中設(shè)置一些額外信息。
紋理平鋪和偏移
材質(zhì)通常具有其紋理屬性的 Tiling 和 Offset 字段。此信息將傳遞到著色器中的 float4?{TextureName}_ST
?屬性:
x
?包含 X 平鋪值y
?包含 Y 平鋪值z
?包含 X 偏移值w
?包含 Y 偏移值
例如,如果著色器包含名為?_MainTex
?的紋理,則平鋪信息將位于?_MainTex_ST
?矢量中。
紋理大小
{TextureName}_TexelSize
?- float4 屬性包含紋理大小信息:
x
?包含 1.0/寬度y
?包含 1.0/高度z
?包含寬度w
?包含高度
紋理 HDR 參數(shù)
{TextureName}_HDR
?- 一個(gè) float4 屬性,其中包含有關(guān)如何根據(jù)所使用的顏色空間解碼潛在 HDR(例如 RGBM 編碼)紋理的信息。請參閱?UnityCG.cginc?著色器 include 文件中的?DecodeHDR
?函數(shù)。
顏色空間和顏色/矢量著色器數(shù)據(jù)
使用線性顏色空間時(shí),所有材質(zhì)顏色屬性均以 sRGB 顏色提供,但在傳遞到著色器時(shí)會轉(zhuǎn)換為線性值。
例如,如果?Properties?著色器代碼塊包含名為“MyColor“的?Color
?屬性,則相應(yīng)的”MyColor”HLSL 變量將獲得線性顏色值。
對于標(biāo)記為?Float
?或?Vector
?類型的屬性,默認(rèn)情況下不進(jìn)行顏色空間轉(zhuǎn)換;而是假設(shè)它們包含非顏色數(shù)據(jù)。可為浮點(diǎn)/矢量屬性添加?[Gamma]
?特性,以表示它們是以 sRGB 空間指定,就像顏色一樣(請參閱屬性)。