CG语言基础:
(摘抄自《GPU编程与CG语言GPU-Programming-AndCgLanguage-Primer》)
概述:
Cg(C for Graphcis)语言,是NVIDIA 与Microsoft 合作研发,旨在为开发
人员提供一套方便、跨平台(良好的兼容性),控制可编程图形硬件的高级语言。
Cg 是一个可以被OpenGL 和Direct3D 广泛支持的图形处理器编程语言。
数据类型:
Cg 支持7 种基本的数据类型:
1. float,32 位浮点数据,一个符号位。浮点数据类型被所有的profile 支持
(但是DirectX8 pixel profiles 在一些操作中降低了浮点数的精度和范围);
2. half,16 为浮点数据;
3. int,32 位整形数据,有些profile 会将int 类型作为float 类型使用;
4. fixed,12 位定点数,被所有的fragment profiles 所支持;
5. bool,布尔数据,通常用于if 和条件操作符(?:),布尔数据类型被所有的
profiles 支持;
6. sampler*,纹理对象的句柄(the handle to a texture object)
7. string,字符类型,该类型不被当前存在的profile 所支持,实际上也没有
必要在Cg 程序中用到字符类型。
向量:
Cg 程序中可以声明float1、float2、float3、
float4 类型的数组变量,但是不能声明超过4 元的向量。
向量还可以通过较短的向量进行构建:
float2 a = float2(1.0, 1.0);
float4 b = float4(a, 0.0, 0.0);
Cg 中向量、矩阵与数组是完全不同,向量和矩阵是内置的数据类型
(矩阵基于向量),而数组则是一种数据结构,不是内置数据类型!
矩阵:
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};
数组:
和C里基本一模一样。
要获取数组长度,可以调用“.length”,例如:
float a[10]; //声明一个数组
int length = a.length;//获取数组长度
结构体:
结构体:
目前的Cg 语言中的结构体以展现“封装”功能为主,并不支持继承机制。
struct myAdd
{
float val;
float add(float x)
{
return val + x;
}
};
myAdd s;
使用符号“.”引用结构体中的成员变量和成员函数。例如:
float a = s.value;
float b = s.add(a);
注意:在当前的所有的profile 版本下,如果结构体的一个成员函数使用了
成员变量,则该成员变量要声明在前。此外,成员函数是否可以重载依赖于使用
的profile 版本。
struct VertexIn
{
float()函数 float4 position : POSITION;
float2 textureCoordinates : TEXCOORD0;
};
输入结构体,带有绑定语义:
( Binding Semantics),所谓
绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的。目前
Cg 支持的绑定语义类型包括POSTION 位置),COLOR(颜),NORMAL(法向
量),Texcoord(纹理坐标)等类型。
表达式与控制语句:
与C语言相同之处:
<,<=,!=,==,>=,>,&&,||,!,:*乘法;
/除法;-取反;+加法;—减法;%求余;++;——;*=;/=;+=;-=
注意:
1.逻辑操作符也可以对向量使用,返回的变量类型是同样长度的内置bool向量。)
2.:Cg中的逻辑与(&&)和逻辑或(||)不存在C中的短路现
象(short-circuiting,即只用计算一个操作数的bool值即可),而是参与运算的操
作数据都进行bool分析。
3.Cg语言对向量的数学操作提供内置支持,即所有数学操作都可以直接用在向量上。
4.求余操作符%。只能在int类型数据间进行
5.Cg语言中的移位操作符,功能和C语言中的一样,也可以作用在向量上,但
是向量类型必须是int类型
----
不同的是:
1.Cg允许在向量类型变量上使用操作符,例如>操作符可以用来比较两个向量各个分量的大小关系
例如:
float3 a = float4(0.5, 0.0, 1.0);
float3 b = float4(0.6, -0.1, 0.9);
bool3 c = a<b;
运算后向量c的结果为float3(true, false, true);
2.可以使用Cg语言中的swizzle操作符(.)将一个向量的成员取出组成一个新
的向量。swizzle操作符被GPU硬件高效支持。swizzle操作符后接x、y、z、w,
分别表示原始向量的第一个、第二个、第三个、第四个元素;swizzle操作符后接
r、g、b和a的含义与前者等同。不过为了程序的易读性,建议对于表示颜值的
向量,使用swizzle操作符后接r、g、b和a的方式。
例如:
float4(a, b, c, d).xyz 等价于 float3(a, b, c)
float4(a, b, c, d).xyy 等价于 float3(a, b, b)
float4(a, b, c, d).wzyx 等价于 float4(d, c, b, a)
float4(a, b, c, d).w 等价于 float d
注意 :swizzle操作符只能对结构体和向量使用,不能对数组使用。
条件操作符 :
expr1 ? expr2 : expr3;
Cg中的条件操作符一个独特的性能是:支持向量运算。即,expr1的计算结果可以是bool型向量,expr2和expr3必须是与expr1长度相同的向量
控制流语句:
Cg中的控制流语句和循环语句与C语言类似:条件语句有:if、if-else;循环语句有:while、for。break语句可以和在for语句中使用。
Cg语言中的控制流语句要求其中的条件表达式返回值都是bool类型,这一点是与C语言不同之处
因此,如果没有确切的把握,不要在低级的profiles中使用循环控制语句。
函数的递归调用(recursion)在Cg语言中是被禁止的。
Switch 、case和default在Cg中作为保留关键字存在,但是它们目前不被任何profile所支持。
绑定语义词(binding semantics):
一系列独特的关键字,这些关键字不但用于指定输入图元的数据含义(是位置信息,还是法向量信息),本质也则对应着这些图元数据存放的硬件资源(寄存器或者纹理)。
除语义词外,Cg 中还提供了三个关键字,in、out、inout,用于表示函数的输入参数的传递方式,称为输入\输出关键字,这组关键字可以和语义词合用表达硬件上不同的存储位置,即同一个语义词,使用in 关键字修辞和out 关键词修辞,表示的图形硬件上不同的寄存器。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论