![aa9ba576a4ff31ead66918e5a33fb2f8.png](https://i-blog.csdnimg.cn/blog_migrate/28b49cac69417d2f9ae803e16ace71ec.jpeg)
前言
上一篇中我们讨论了顶点片断着色器,如果是刚刚接触Shader的话肯定还是会有很多的疑惑,那么这篇呢就是来详细讨论下其中的疑惑之一,变量的相关问题。
Cg/HLSL中的数据类型
在Shader中,我们在Properties中定义的变量是为了在材质面板中显示并方便我们调节,如果要在Cg/HLSL中使用的话就必须要重新声明一次(要求命名一样)。
To美术:声明的意思就是定义一个变量,告诉电脑我们会用这个变量去存储一些值,电脑就直接通过这个变量来获取相应的值就好了,而由于值是会变化的,所以被称为变量。
首先,我们先看下在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位,也就是说只支持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(高精度立方体纹理)
类型对应
好了,现在我们已经了解了Cg/HLSL中的数据类型,那么Properties中的与Cg/HLSL中的是如何对应的呢?
- Int/float/Range用浮点值表示,也就是float、half或者fixed,根据自己需要的精度来定义。
- Vector/Color用float4、half4或者fixed4表示。
- 2D类型用sampler2D表示。
- 3D类型sampler3D表示。
- CUBE类型用samplerCUBE表示。
单个浮点数值比较好理解,像Vector与Color的float4要如何理解呢?
其实不管是Vector还是Color,都是由四个同样精度的浮点数值组成的,所以我们在定义的时候才会写成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人。就可以用floatMxN来表示。如果是4x4矩阵,就是float4x4(同样支持其它精度),不过有一点要注意,在某些平台上是不支持非方矩阵的(比如float3x2),特别是OpenGL ES 2.0平台。
Shader语法大全工具
今天双11,咱也来点福利〜
虽说脚本编缉器中有语法提示功能,但是有时我们甚至会忘记命令的首字母是什么,又或者是想快速查阅Shader语法大全,以及某些常用的算法等等。这些需求也是我个人经常碰到的痛点,所以打算把这些功能整合成一个Unity内的小工具,在今后编写时可以快速打开查阅,就像个工具书一样。
目前功能还只有Properties与本文所讲的Cg/HLSL中的数据类型,计划与本入门系列保持同步功能添加。
打开方式:Window/taecg/Shader Reference...
界面如下:
![5b60728ff38c6d7c7a45e6fcabbbafbf.png](https://i-blog.csdnimg.cn/blog_migrate/b3b733cf020c0287a9cc59a3f244b065.jpeg)
需要此插件的,可以加入QQ群,在群文件中的“插件工具相关/ShaderReference.unitypackage”文件夹中可以找到此插件,同时后续更新也会直接发布在QQ群中.
最后
欢迎大家关注更多干货的公众号:Unity技术美术 ( ID:gh_8b69cca044dc )
![80d24a1424089005080f3d8e6a92b5c1.png](https://i-blog.csdnimg.cn/blog_migrate/ac4867e5db85b7cb2b545ff638457a02.jpeg)
Unity技术美术QQ交流分享群:19470667(1群已满)、763506271
![704aaf706884813888c89130cf815609.png](https://i-blog.csdnimg.cn/blog_migrate/24cf4a9e70e8b70b7685de746ad8e0c3.jpeg)