【UnityShader】---数据类型和关键字
⼀、基本数据类型:Cg⽀持7种基本的数据类型
1、float,32位浮点数据,⼀个符号位。浮点数据类型被所有的图形接⼝⽀持;
2、half,16位浮点数据;
3、int,32位整形数据
4,fixed,12位定点数,
5、bool,布尔数据,被所有的图形接⼝⽀持;
6、sampler*,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。
⼆、内置的数据类型
基于基础数据类型,如float3,表⽰float类型的三维向量;同理,bool2表⽰布尔类型的⼆维向量。
注:向量最长不能超过四元,如float5 vector;//编译错误
向量的赋值:
float2 a=float(1.0,1.0); //编译通过
float2 a=float(1.0f,1.0f); //编译错误
float3 b=float(a,0.0); //编译通过
矩阵数据类型:
float1X1 m1; //即float m1,⼀维矩阵
float3X4 m34 //3*4阶矩阵
注:X是字符,不是乘号,最⼤的维数为4*4阶,矩阵的初始化 float 2*2 m22={1.0,2.0,3.0,2.3};
float3 x和floatx[3]是不同的,前者为向量是内置的数据类型,⽽数组则是⼀种,不是内置的数据类型。
三、类型转换
Cg中的类型转换有强制转换和隐式转换;如果是隐式转换则数据类型从低精度向⾼精度转换。如:
float a=1.0; half b=2.0; loat c=a+b; //等价于float c=a+(float)b;
Cg语⾔中可以对常量数据加上类型后缀表⽰该数据类型的数据,如:
float a=1.0h; //1.0h为half类型常量数据
这样的后缀类型有三种:
f:表⽰float;
h:表⽰half;
x:表⽰fixed;
四、Swizzle操作符
Cg语⾔中的其他操作符和⾼级CPU语⾔C++类似,包括关系操作符、逻辑操作符和位移操作符以及条件操作符。⽽Swizzle操作符是Cg 语⾔中特有的,它可以将⼀个向量的成员取出组成⼀个新的向量。对于坐标或者⾓度等其他多维向量,Swizzle操作符(.)后接x、y、z、w 分别表⽰原始向量的第⼀个、第⼆个、第三个和第四个元素;同样,对于颜⾊可以后接r、g、b和a来表⽰同样的索引。
例如:
float4(a,b,c,d).xwz 等价于 float(a,d,c)
float4(a,b,c,d).xxy 等价于 float(a,a,b)
注:Swizzle操作符只对结构体和向量使⽤,不能对数组使⽤。
五、输⼊数据关键字:Cg中输⼊数据流⼀般分为两类
1、varying 参数:在Cg程序中通过语义进⾏绑定变量, Cg语⾔提供了⼀组语义词,⽤以表⽰参数是由顶点的那些数据初始化的,⼀旦parameter数据类型
这个变量使⽤了语义词进⾏绑定,那么这个变量值被初始化的同时也意味着它有了特殊的含义,如表⽰位置、法线等含义。语义提供了⼀种使⽤随顶点变化或随⽚段变化⽽变化的值来初始化Cg程序参数的⽅法,这些数据都是从应⽤程序输⼊到GPU的数据,如顶点位置、法向量、纹理坐标数据等。
2、Uniform 参数:Uniform是⽤来限制⼀个变量的初始值的来源,当声明⼀个变量为Uniform类型的时候,表⽰这个变量的初始值来⾃于外部的其他环境。除了获取初始值的这点之外,Uniform关键字声明的变量和其他变量是完全⼀样的。通常⽤Uniform来定义⼀些与三维渲染有关的离散信息数据,并通常
不会随着图元信息的变化⽽变化,如材质对光的反射信息。Uniform表⽰⼀个参数,通常使⽤ uniform表⽰函数的形参,不能定义⼀个uniform表⽰的局部变量。
Unity的内置Uniform输⼊参数如下:
uniform float4 _Time, _SinTime, _CosTime; // 时间量
uniform float4 _ProjectionParams; // x = 1 or -1 (如果投影翻转就是-1)
// y = 近平⾯; z = 远平⾯; w = 1/远平⾯
uniform float4 _ScreenParams; // x = width; y = height; z = 1 +1/width; w = 1 + 1/height
uniform float3_WorldSpaceCameraPos;
uniform float4x4 _Object2World; //模型矩阵
uniform float4x4 _World2Object; // 模型矩阵的逆
uniform float4 _LightPositionRange; // xyz = pos, w = 1/range
uniform float4 _WorldSpaceLightPos0; // 光源的位置和⽅向
uniform float4x4 UNITY_MATRIX_MVP; // 模型视图投影矩阵
uniform float4x4 UNITY_MATRIX_MV; // 模型视图矩阵
uniform float4x4 UNITY_MATRIX_V; // 视图矩阵
uniform float4x4 UNITY_MATRIX_P; // 投影矩阵
uniform float4x4 UNITY_MATRIX_VP; // 视图投影矩阵
uniform float4x4 UNITY_MATRIX_T_MV; // 模型视图矩阵的转置矩阵
uniform float4x4 UNITY_MATRIX_IT_MV; // 模型视图矩阵的逆矩阵的转置矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE0; // 贴图纹理矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE1; //贴图纹理矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE2; //贴图纹理矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE3; //贴图纹理矩阵
uniform float4 UNITY_LIGHTMODEL_AMBIENT; // 环境⾊
六、输⼊输出
对于程图形渲染管线,可编程控制的部分只有两个,顶点着⾊器和⽚段着⾊器。对于编程控制这两个部分,⾸要的任务就是要怎么给它们传参数。Cg语⾔的参数传递同样也有“值传递”和“引⽤传递”之分。因为GPU不⽀持指针,所以Cg语⾔采⽤了如下的⽅式来修辞参数传递:
1、in:修辞⼀个形参只是⽤于输⼊,进⼊函数体时被初始化,且该形参值的改变不会影响实参值,传递⽅式为值传递。
2、out:修辞⼀个形参只是⽤于输出,进⼊函数体时没有被初始化,⼀般为函数的返回值。
3、inout:修辞⼀个形参即⽤于输⼊也⽤于输出,这是典型的引⽤传递。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论