Unity Shader(Cg/HLSL中的数据类型)
在Shader中,我们在Properties中定义的变量是为了在材质面板中显示并方便我们调节,如果要在Cg/HLSL中使用的话就必须要重新声明一次(要求命名一致)。
Cg/HLSL中的数据类型
- float
高精度类型,32位,通常用于世界坐标下的位置,纹理UV,或涉及复杂函数的标量计算,如三角函数、幂运算等。
- half
中精度类型,16位,数值范围为[-60000,+60000],通常用于本地坐标下的位置、方向向量、HDR颜色等。
- fixed
低精度类型,11位,数值范围为[-2,+2],通常用于常规的颜色与贴图,以及低精度间的一些运算变量等。
在PC平台不管你Shader中写的是half还是fixed,统统都会被当作float来处理。half与fixed仅在一些移动设备上有效。
比较常用的一个规则是,除了位置和坐标用float以外,其余的全部用half。主要原因也是因为大部分的现代GPU只支持32位与16位,也就是说只支持float和half,不支持fixed。
- interger
整型类型,通常用于循环与数组的索引。
在 Direct3D 9 和 OpenGL ES 2.0平台上整型可能会被直接用浮点数来处理,在Direct3D 11、OpenGL ES 3等现代GPU上可以正确的以整型类型来处理。
- sampler2D、sampler3D与samplerCUBE
纹理,默认情况下在移动平台纹理会被自动转换成低精度的纹理类型,如果你需要中精度的或者高精度的需要用以下方式来声明:
sampler2D_half(中精度2D纹理)
sampler2D*_*float(高精度2D纹理)
sampler3D_half(中精度3D纹理)
sampler3D*_*float(高精度3D纹理)
samplerCUBE_halft(中精度立方体纹理)
samplerCUBE_float(高精度立方体纹理)
类型对应
那么在Properties中的与Cg/HLSL中的是如何对应的呢?
- Int/float/Range用浮点值表示,也就是float、half或者fixed,根据自己需要的精度来定义。
- Vector/Color用float4、half4或者fixed4表示。
- 2D类型用sampler2D表示。
- 3D类型sampler3D表示。
- CUBE类型用samplerCUBE表示。
其实不管是Vector还是Color,都是由四个同样精度的浮点数值组成的,所以我们在定义的时候才会写成float4、half4或者fixed4.
比如,我们在Properties中声明了如下的颜色:
_Color("Color", Color) = (1,1,1,1)
在Cg/HLSL中我们需要同样再声明一次:
fixed4 _Color;