ShaderLab: Properties

25 篇文章 0 订阅
25 篇文章 0 订阅

ShaderLab: Properties

Shaders可以定义一个参数列表,让设计师可以在Unity的material inspector中设置。Shader文件的Properties代码块是用来定义它们的。

Syntax(语法)

Properties

Properties { Property [Property ...] }

定义property代码块。 括号内的属性定义如下。

Numbers and Slider(数字与滑块)

name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number

它们都定义了一个数值(标量) property 作为默认值。Range 格式让其显示为一个滑块,可在minmax值之间滑动。

Colors and Vectors(颜色和向量)

name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)

用所给的RGBA组件定义一个有默认值的颜色属性,或者定义一个有默认值的4D向量属性。颜色 properties 会有颜色拾取器, 并根据色彩空间的需要进行调整 (see Properties in Shader Programs)。 向量属性展示为4个数字变量。

Textures(纹理)

name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}

分别定义了一个 2D texture, cubemap3D (volume) 属性。

Details

在shader中的每个property,都是靠 name来引用的(在Unity中,用下划线开头的shader property名称是很常见的。)。属性会以display name显示在材质的inspector面板中。每个属性都要给予一个默认值在等号后:

  • 对于 RangeFloat properties 只是一个数字, 比如 “13.37”。
  • 对于 ColorVector properties 是四个数字在一个圆括号内, 例如 “(1,0.5,0.2,1)”。
  • 对于 2D Textures, 默认值可以是一个空的字符串,或者内建的默认纹理:“white” (RGBA: 1,1,1,1), “black” (RGBA: 0,0,0,0), “gray” (RGBA: 0.5,0.5,0.5,0.5), “bump” (RGBA: 0.5,0.5,1,0.5) or “red” (RGBA: 1,0,0,0)。
  • 对于 non–2D Textures (Cube, 3D, 2DArray) 默认值为空字符串。 当材质没有被分配一个 Cubemap/3D/Array 纹理时,就会使用一个灰色(RGBA: 0.5,0.5,0.5,0.5)纹理。

然后在固定管线部分,property值可以直接通过方括号中的name来访问: [name]. 例如,你可以使混合模式通过一个材质属性驱动,通过定义两个 integer properties(名为 “SrcBlend“”DstBlend”), 然后让 Blend Command 使用它们: Blend [_SrcBlend] [_DstBlend].

Properties块中的着色器参数被序列化为Material数据。 Shader programs 其实可以拥有更多参数(比如 matrices, vectors and floats )它们被代码在运行中设置到材质里,但是如果它们不是Properties块的一部分,那么它们的值将不会被保存下来。这对于那些完全由脚本代码驱动的值非常有用 (使用 Material.SetFloat 和其他类似函数).

Property attributes and drawers

Property前的方括号内的属性是可以指定的。 这些属性被Unity识别或由您自定义的MaterialPropertyDrawer classes识别来控制property会如何渲染到material inspector。被Unity定义的属性:

  • [HideInInspector] - 不在material inspector中显示property的值。
  • [NoScaleOffset] - material inspector将不会显示被该属性标记的纹理的tiling/offset变量。
  • [Normal] - 标示该纹理应该为法向贴图。
  • [HDR] - 标示纹理属性应该为高动态范围(HDR)纹理。
  • [Gamma] - 标示一个float/vector property在UI中是被指定为sRGB值的(就和color值一样,通过color picker赋值?), 并可能需要根据使用的色彩空间转换. See Properties in Shader Programs.
  • [PerRendererData] - 标示纹理将来自格式为 MaterialPropertyBlock的per-renderer data. Material inspector changes the texture slot UI for these properties.

Example

// properties for a water shader
Properties
{
    _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
    _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
    _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
    _RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
    _ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
    _RefractionTex ("Environment Refraction", 2D) = "" {}
    _Fresnel ("Fresnel (A) ", 2D) = "" {}
    _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

Texture property options (removed in 5.0)

在Unity 5之前,纹理属性可以在卷括号中选择, 例如 TexGen CubeReflect。 它们都是用了控制固定管线纹理坐标生成的。 这些函数在 5.0 中被移除了; 如果你需要 texgen 你应该写一个 vertex shader 代替。 到 Implementing Fixed Function TexGen page 页面查看例子。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值