目录
1.Cg关键字
-如int,float,struct等照搬c\c++的关键字
-语义词semantics : 1.用于指定输入图元的数据含义(位置,法向量...)
2.本质对应图元数据存放的硬件资源(寄存器,纹理...)
3.通常可根据其用法称之为绑定语义词 binding semantics
4.语义词使用很关键,再小的Cg程序都要用到语义词
-表示函数输入参数的传递方式的关键字: in, out, inout. 称为输入\输出关键字.
这组关键词可以和语义词合用,表达硬件上不同的存储位置.即同一个语义词,用in或out修饰,表示图形硬件上不同的寄存器
-uniform: 用于指定变量的数据初始化方式
-const : 被修饰的变量为常量变量
2.uniform
Cg语言将输入数据流分为两类:
1.varying inputs,数据流输入图元信息的各种组成要素.如应用程序向GPU输入的顶点位置,法线向量,纹理坐标等.
2.uniform inputs, 一些与三维渲染有关的离散数据信息.由应用程序输入,通常不会随图形信息变化,如材质对光的反射信息,运动矩阵等.uniform修饰一个参数,表示该参数的值由外部应用程序初始化并输入,如uniform float brightness,表示从外部传入一个float类型数据.用uniform修饰,除了表示数据变量来源不同以外,与其他变量没有差异.
常用uniform修饰函数形参,不能修饰局部变量.
3.const:
-同c\c++,初始化了后就不能再修改值.
-uniform与const修饰不冲突,可以用一个,可以都不用,可以都用.
4.输入\输出修饰符 in\out\inout
-Cg中用不同是输入\输出修饰符,来区别值传递与引用传递(类比于形参,指针).
1.in:修饰一个形参只用于输入,进入函数体时被初始化,形参不影响实参,类比如不同的值传递.
2.out;修饰一个形参只用于输出,进入函数体时并没有被初始化,一般表示一个函数运行的结果.
3.inout:修饰一个形参既用于输入也用于输出,类比于引用传递.
5.语义词与语义绑定
1.输入与输出语义区别:
根据输入语义,图形处理器从某个寄存器取数据;将处理好的数据根据输出语义,放到指定的寄存器.语义是两个处理阶段(顶点阶段,片元阶段)之间输入\输出数据和寄存器之间的桥梁.语义通常也表示数据的含义,如POSITION表示参数存放数据是顶点的位置.
语义只对两个处理阶段的输入\输出数据有意义(函数入口),在内部函数无效.
虽然一些参数会使用命名相同的语义,但如POSITION,在输入语义表示应用程序传入的顶点位置,对于输出而言,表示要反馈给光栅器的裁剪空间位置.两者对应不同寄存器.
2.顶点着色器的输入语义
被所有profile支持的语义
顶点坐标和法向量为三维,但通常用四维表示,又称齐次坐标.向量为0,点为1.
3.顶点着色器输出语义
顶点程序输出数据被传入片段程序,所以顶点程序输出语义通常是片段程序输入语义,当然页由例外,如POSITION.
顶点程序必须声明一个输出变量并绑定POSITION语义,该变量中的数据将仅被用于光栅化.
4.片段程序输出语义
片段程序必须声明一个out向量,绑定语义COLOR,作为该片段最终颜色.
一些片段程序支持输出语义DEPTH,与之绑定的变量会设置片段的深度值.还有一些支持额外颜色输出,用于多渲染目标.
5.语义绑定
语义绑定放在参数后,用冒号分开,如 float4 pos : POSITION.
通常格式:
-作为函数的参数:[const][in\out\inout]<type><identifier> : <binding-semantic>,const,in\out\inout作为可选项.
-放在结构体
struct <struct-tag>
{
<type><identifier>[:<binding-semantic>];
};
-放在函数声明后
<type><identifier>(<parameter-list>)[:<binding-semantic>]
{
}
资料来源: <GPU编程与CG语言之阳春白雪下里巴人>第七章