着色器属性

使用Cg/HLSL 访问着色器属性

着色器在Properties 代码块中声明材质属性。如果要在着色器程序中访问其中一些属性,则需要声明具有相同名称和匹配类型的 Cg/HLSL变量。

着色器属性:

//形式:
// Cg/HLSL变量名称 ("Inspector中显示的名称", 类型)= 默认值

_MyColor ("Some Color", Color) = (1,1,1,1) 
_MyVector ("Some Vector", Vector) = (0,0,0,0) 
_MyFloat ("My float", Float) = 0.5 
_MyTexture ("Texture", 2D) = "white" {} 
_MyCubemap ("Cubemap", CUBE) = "" {}

Cg/HLSL 代码进行声明以供访问:

fixed4 _MyColor; // 低精度类型对于颜色而言通常已经足够
float4 _MyVector;
float _MyFloat; 
sampler2D _MyTexture;
samplerCUBE _MyCubemap;

同时 Cg/HLSL 还可以接受 uniform 关键字, 但该关键字不是必须的:

uniform float4 _MyColor;

ShaderLab 中的属性类型以如下方式映射到 Cg/HLSL 变量类型:

  • Color 和 Vector 属性映射到 float4half4fixed4 变量。
  • Range 和 Float 属性映射到 floathalffixed 变量。
  • 对于普通 (2D) 纹理,Texture 属性映射到 sampler2D 变量;立方体贴图 (Cubemap) 映射到 samplerCUBE__;3D 纹理映射到 sampler3D__

向着色器提供属性值

在下列位置中查找着色器属性值并提供给着色器:

  • MaterialPropertyBlock 中设置的每渲染器值。这通常是“每实例”数据(例如,全部共享相同材质的许多对象的自定义着色颜色)。
  • 在渲染的对象上使用的材质中设置的值。
  • 全局着色器属性,通过 Unity 渲染代码自身设置(请参阅内置着色器变量),或通过您自己的脚本来设置(例如 Shader.SetGlobalTexture)。

优先顺序如上所述:每实例数据覆盖所有内容;然后使用材质数据;最后,如果这两个地方不存在着色器属性,则使用全局属性值。最终,如果在任何地方都没有定义着色器属性值,则将提供“默认值”(浮点数的默认值为零,颜色的默认值为黑色,纹理的默认值为空的白色纹理)。

序列化和运行时材质属性

材质可以同时包含序列化属性值和运行时设置的属性值。

  • 序列化的数据是在着色器的Properties代码中定义的所有属性。通常,这些是需要储存在材质的值,并且可由用户在材质的Inspector面板中进行调整。

  • 材质也可以具有着色器使用的一些属性,但不在着色器的Properties代码块中声明。通常,这适用于运行时从脚本代码(eg,Material.SetColor) 设置的属性。 矩阵和数组只能作为非序列化的运行时属性存在(因为无法在Properties代码块中定义他们)。

特殊纹理属性

对于设置为种色器/材质属性的每个纹理,Unity还会在其他矢量属性中设置一些额外信息。

纹理平铺和偏移

材质通常具有纹理属性的 TilingOffset字段。 此信息将传递到着色器的 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 参数

{TextureName}_HDR -float4属性,包含有关如何根据所使用的颜色空间 解码潜在 HDR(例如 RGBM 编码) 纹理信息。 参见DecodeHDR 函数

颜色空间和颜色/矢量着色器数据

使用线性颜色空间时,所有材质颜色属性均以 sRGB颜色提供,但在传递到着色器时会转换为线性值。

例如,如果 Properties 着色器代码块包含名为“MyColor“的 Color 属性,则相应的”MyColor”HLSL 变量将获得线性颜色值。

对于标记为 Float 或 Vector 类型的属性,默认情况下不进行颜色空间转换;而是假设它们包含非颜色数据。可为浮点/矢量属性添加 [Gamma] 特性,以表示它们是以 sRGB 空间指定,就像颜色一样(请参阅属性)。


文章作者: Yonggang Long
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Yonggang Long !
 上一篇
2022-08-10 Yonggang Long
下一篇 
2022-08-10 Yonggang Long
  目录