Shader之小白入门学习六
前言
上一篇学习了顶点和片段着色器,这一片我们学习一些与变量相关的问题。
Cg/HLSL中的数据类型
再Shader中,在Properties中定义的变量是为了在材质面板中显示并方便我们调节,如果要在Cg/HLSL中使用的话就必须要重新声明一次(要求命名一样)
首先,我们先看下在Cg/HLSL中得几种常见数据类型:
- float/half/fixed(三个都是浮点数。只是精度不一样而已)
- integer(整形)
- sampler2D(2D纹理)
- samplerCUBE(3D纹理)
float:高精度类型,32位,通常用于世界坐标下的位置,纹理UV,或涉及复杂函数的标量计算,如三角函数,幂远算等。
half:中精度类型,16位,数值范围[-60000,60000],通常用于本地坐标下的位置,方向向量,HDR颜色等等。
fixed:低精度类型,11位,数值范围为[-2,+2],通常用于常规得颜色与贴图,以及低精度间的一些运算变量等。
注:在PC平台不管你得Shader中写的是half还是fixed,统统会被当作float来处理。half与fixed仅在一些移动设备上有效。比较常用的一个规则是,除了位置和坐标用float以外,其余的全部用half。主要原因也是因为大部门的现在GPU只支持32位与16位,也就是说只支持half和floa,不支持fixed。
interger:整型类型,通常用于循环与数组的索引。
注:在Direct3D9和OpenGl ES2.0平台上整形可能会被直接用浮点数来处理,在Direct3D11,OpenGl ES 3等现代GPU上可以正确的以整形类型来处理。
sampler2D,sampler3D与samplerCUBE:纹理,默认情况下在移动平台纹理会被自动转换成低精度的纹理类型,如果需要中精度的或者高精度的需要用以下方式来声明:
sampler2D_half(中精度2D纹理)
sampler2D_float(高精度2D纹理)
sampler3D_half(中精度3D纹理)
sampler3D_float(高精度3D纹理)
samplerCUBE_half(中精度立方体纹理)
samplerCUBE_float(高精度立方体纹理)
类型对应
在了解了Cg/HLSL中的数据类型,那么Properties中的Cg/HLSL中得是如何应对的呢?
- Int/float/Range用浮点值表时,也就是float,half或者fixed,根据自己需要的精度来定义;
- Vector/Color用float3,half4或者fixed4表示;
- 3D类型sampler3D表时;
- CUBE类型用samplerCUBE表示。
- 单个浮点数值比较好理解,像Vector与Color得float4要如何理解呢?其实不管事Vector还是Color,都是由4个同样精度得浮点数值组成的,所以我们在定义得时候才会携程float4.half4或者fixed4.
比如,我们在Properties中声明了如下的颜色:
_Color("Color",Color)=(1,1,1,1)
在Cg/HLSL中我们需要同样再声明一次:
fixed4_Color;
颜色的四个分量:
- Red(红)
- Green(绿)
- Blue(蓝)
- Alpha(透明)
在Cg/HLSL中我们可以通过_Color来访问颜色。也可以通过_Color.rgba来访问,这里的.rgba就是表示颜色的四个分量。如果只想干活的颜色的红通道就是_Color.r,有如果只想获得绿通道和透明通道就是_Color.ga,以此类推~
注:表示分量处理可以用.rgba,我们还可以使用xyzw,它们的意义是一样的,你可以使用Vector.rgba,也可以使用Color.xyzw,这两者并没有什么区别,只是我们通常在颜色上用rgba,在向量上用xyzw,这样比较直观方便理解。
再说下矩阵,在Shader中,矩阵是一个按照长方形阵列排序的浮点数集合。
你可以想象成事一队站列整齐的士兵,横向又M人,竖向又N人。就可以用floatMN来表示。如果是44矩阵,就是float44(同样支持其他精度),不过有一点要注意,在某些平台上是不支持非方矩阵的(比如float32),特别是 OpenGL ES 2.0平台。
原文链接: https://mp.weixin.qq.com/s/NPdmWIPmwzWl29rqIZb5jQ