Unity Shader - Accessing shader properties in Cg/HLSL 在Cg/HLSL中访问shader properties

目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:Accessing shader properties in Cg/HLSL
版本:2019.1

Accessing shader properties in Cg/HLSL

在Cg/HLSL中访问shader properties

shader可定义材质属性使用 Properties 块。如果你想访问 shader program(shader 程序)中的那些properties属性的话,你需要在Cg/HLSL定义一样名称和对应类型的变量。这里提供一个例子:Shader Tutorial: Vertex and Fragment Programs

例如,有这么一些shader属性:

_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(向量)属性对应 float4half4 或是 fixed4
  • Range(范围值)和 Float(浮点值)属性对应 floathalf 或是 fixed
  • Texture(纹理)属性对应 sampler2D常规的2D纹理;Cubemaps 对应 samplerCUBE;3D纹理对应 sampler3D

How property values are provided to shaders

属性值如任何提供给shader

shader属性值可通过下面一些方式来获取与设置:

  • 每个Renderer的材质属性都可在 MaterialPropertyBlock (脚本类)中获取/设置。这些通常指的是每个实例的数据(如:给许多功用相同材质的对象设置自定义色调)。
  • 在显示对象上使用的 Material (Material Inspector)材质中设置的值。
  • 全局的shader属性,可以通过shader渲染代码中访问全局变量(查看 built-in shader variables),或是从你在脚本处理(如:Shader.SetGlobalTexture)。

这些三种地方的属性应用优先级:

  • 每个实例数据将会覆盖其他的;
  • 接着是材质中指定的;
  • 最后是,如果前两种方式都没有的属性,那么将使用全局属性值。
  • 最终,如果都没有一个地方设置shader属性,那么将会使用默认值(float为0,颜色为黑色,纹理为全白色)来提供数值。

Serialized and Runtime Material properties

序列化和实时材质属性

Materials 包含序列化与实时属性值。

序列化数据都是在shader Properties 块中定义的所有属性。通常是存储在材质中的值,用户可以在Material Inspector视图中调整数值。

材质也可以拥有一些属性能在shader在使用,但又没在shader Properties 块中定义的。通常这些属性从脚本代码中实时设置的,如:通过 API Material.SetColor。注意矩阵和数组类型的属性仅能在非序列化的实时属性中(因为它们没办法在Properties块中定义)。

Special Texture properties

特殊的纹理属性

每张纹理都是设置在材质中的shader属性,Unity也可以将一些额外的信息存储在向量属性中。

Texture tiling $ offset

纹理的平铺于偏移

Materials 中的纹理属性通常都用Tiling(平铺)和Offset(偏移)字段。这些信息将传入shader中以名为 {TextureName}_ST 的float4属性中。

  • x 包含tiling x值
  • y 包含tiling y值
  • z 包含offset x值
  • w 包含offset y值

例如,如果一个shader包含名为 _MainTex 的纹理,那么tiling&offset信息将会在名为 _MainTex_ST 的向量中。

Texture size

纹理大小

{TextureName}_TexelSize - 是一个 float4 属性,包含了纹理的大小信息:

  • x 包含1.0/width
  • y 包含1.0/height
  • z 包含width
  • w 包含height

Texture HDR parameters

纹理HDR参数
{TextureName}_HDR - 是一个 float4 属性,带有解码HDR纹理需要的信息,信息取决于使用的color space(颜色空间)。查看UnityCG.cginc shader头文件中的 DecodeHDR 函数。

Color spaces and color/vector shader data

颜色空间与颜色/向量的着色器数据

当使用 Linear color space(线性颜色空间),所有材质颜色属性以 sRGB颜色来提供,当传入到shader时,将被转换为线性数值。

例如,如果你的Shader Properties 块包含一个叫 “MyColor” 的 Color 类型的属性,那么对应HLSL代码中"MyColor"变量的值将会是线性颜色值。

属性标志位 FloatVector 类型,将默认不会有颜色空间的转换;这回假设它们包含非颜色数据。尽可能的添加 [Gamma] 属性来指定 float/vector 类型的属性,代表它们是使用 sRGB颜色空间的(查看 Properties了解更多)。

See Also

延伸阅读

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值