ShaderCompute的资料真难找,关于其中变量有如下的注意
如果我们想要定义Vector3的变量,在Shader中是不支持的,我们需要定义 float3等等
常见类型:
Color、Vector:float4,half4,fixed4
Range、Float:float, half, fixed
2D:sampler2D
3D:sampler3D
Cube:samplerCube
Int:int(32位整型数据)
例子我们可以看:https://blog.csdn.net/weixin_38884324/article/details/79284373?utm_source=blogxgwz0
对上补充:
1.变量
基本数据类型:Cg支持7种基本的数据类型,分别是:
float, 32 位浮点数据,一个符号位。浮点数据类型被所有的 profile 支持
half,16 为浮点数据
int,32 位整形数据,有些 profile 会将 int 类型作为 float 类型使用
fixed,12 位定点数,被所有的 fragment profiles 所支持
bool,布尔数据,通常用于 if 和条件操作符( ?: ) ,布尔数据类型被所有的 profiles 支持
simpler*, 纹理对象的句柄( the handle to a texture object ) ,分为 6 类: sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, 和 samplerRECT 。DirectX profiles 不支持 samplerRECT 类型, 除此之外这些类型被所有的 pixelprofiles 和 NV40 vertex program profile 所支持( CgUsersManual 30 页) 。
string,字符类型,该类型不被当前存在的 profile 所支持,实际上也没有必要在 Cg 程序中用到字符类型,但是你可以通过 Cg runtime API 声明该类型变量,并赋值;因此,该类型变量可以保存 Cg 文件的信息。
前6种类型为常用类型,string类型几乎不使用。
此外,Cg还提供了内置的向量数据类型 (built-in vector data types) ,内置的向量数据类型基于基础数据类型。 例如: float4, 表示 float 类型的 4 元向量; bool4, 表示 bool类型 4 元向量。
这一点尤其重要,我们经常会看到例如 int3,float4等等。
但是注意: 向量最长不能超过 4 元, 即在 Cg 程序中可以声明 float1 、 float2 、 float3 、float4 类型的数组变量,但是不能声明超过 4 元的向量。
向量初始化方式一般为:
float4 array = float4(1.0, 2.0, 3.0, 4.0);
较长的向量还可以通过较短的向量进行构建:
float2 a = float2(1.0, 1.0);
float4 b = float4(a, 0.0, 0.0);
此外,Cg还提供矩阵数据类型,不过最大的维数不能超过4*4阶,例如:
float1x1 matrix1;//等价于 float matirx1; x 是字符,并不是乘号!
float2x3 matrix2;// 表示 2*3 阶矩阵,包含 6 个 float 类型数据
float4x2 matrix3;// 表示 4*2 阶矩阵,包含 8 个 float 类型数据
float4x4 matrix4;//表示 4*4 阶矩阵,这是最大的维数
矩阵初始化:
float2x3 matrix5 = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
在Cg中,向量、矩阵与数组是完全不同的,向量和矩阵是内置的数据类型,而数组则是一种数据结构。
2.数组
数组数据类型在Cg中的作用:作为函数的形参,用于大量数据的传递,例如:顶点参数数组、光照参数数据等。
一维数组:
float a[10];//声明了一个数组,包含 10 个 float 类型数据
float a[4] = {1.0, 2.0, 3.0, 4.0}; //初始化一个数组
int length = a.length;//获取数组长度
多维数组:
float b[2][3] = {{0.0, 0.0, 0.0},{1.0, 1.0, 1.0}};
int length1 = b.length; // length1 值为 2
int length2 = b[0].length; // length2 值为 3
3.结构体
结构体的声明以关键字 struct 开始,然后紧跟结构体的名字,接下来是一个大括号,并以分号结尾(不要忘了分号) 。大括号中是结构体的定义,分为两大类:成员变量和成员函数。例如:
struct myAdd
{
float val;
float add(float x)
{
return val + x;
}
};
myAdd s;
使用符号“.”引用结构体的成员变量和成员函数:
float a = s.value;
float b = s.add(a);
一般来说 ,Cg 的源代码都会在文件首部定义二个结构体,分别用于定义输人和输出的类型,这二个结构体定义与普通的 C 结构定义不同,除了定义结构体成员的数据类型外,还定义了该成员的绑定语义类型( Binding Semantics) ,所谓绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的。 目前Cg 支持的绑定语义类型包括 POSTION 位置 ) , COLOR( 颜色 ) , NORMAL( 法向量 ) , Texcoord( 纹理坐标 ) 等类型。
4.类型转换
Cg 中的类型转换和 C 语言中的类型转换很类似。 C 语言中类型转换可以是强制类型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度转换。在 Cg 语言中也是如此。
float a = 1.0;
half b = 2.0;
float c = a+b; //等价于 float c = a + (float)b;
当有类型变量和无类型常量数据进行运算时,该常量数据不做类型转换,例如:
float a = 1.0;
float b = a + 2.0; //2.0 为无类型常量数据,编译时作为 float 类型
Cg 语言中对于常量数据可以加上类型后缀,表示该数据的类型,例如:
float a = 1.0;
float b = a + 2.0h; //2.0h 为 half 类型常量数据,运算是需要做类型转换
常量的类型后缀有3种:
f:表示float
h:表示half
x:表示fixed