计算机图形学笔记---Cg语言(二)

关于语义

语义词,表示输入图元的数据含义(是位置信息,还是法向量信息),也表明这些图元数据存放的硬件资源(寄存器或者纹理缓冲区)。
顶点着色程序和片段着色程序中Varying inputs 类型的输入,必须和一个语义词相绑定,这称之为绑定语义(binding semantics)。
在高级语言中,数据从接口的一端流向另一端依靠了指针信息(提供数据存放的内存位置);在Cg中,数据通常暂存在寄存器里,故引入语义绑定的机制来指定数据存放位置 实际上就是将输入/输出数据和寄存器做一个映射关系(在OpenGL Cg profiles是这样,在DirectX-based Cg profiles中没有)
根据输入语义,图形处理器从某个寄存器取数据;然后再将处理好的数据根据输出语义放到指定的寄存器
==>语义是两个处理阶段之间的输入/输出数据和寄存器之间的桥梁;同时语义也表示数据的含义(eg. POSITION一般表示参数存放的数据是顶点位置
语义只对两个处理阶段的输入/输出数据有意义===只在入口函数中才有效,在内部函数(一个阶段的内部处理函数,和下一个阶段没有数据传递关系)的无效,被忽略。

区分!语义,分为输入语义和输入语义;输入语义和输出语义是有区别的。虽然一些参数经常会使用相同的绑定语义词,例如:顶点Shader 的输入参数,POSITION指应用程序传入的顶点位置,而输出参数使用POSITION 语义就表示要反馈给硬件光栅器的裁剪空间位置,光栅器把POSITION 当成一个位置信息。虽然两个语义都命名为POSITION,但却对应着图形流水线上不同的寄存器。

顶点着色程序的输入语义

下面这组绑定语义关键字被Cg 语言的所有vertex profile 所支持
POSITION
BLENDWEIGHT
NORMAL
TANGENT
BINORMAL
PSIZE
BLENDINDICES
TEXCOORD0—TEXCOORD7
举例如下:
in float4 modelPos: POSITION
in float4 modelNormal: NORMAL
注意:都被声明为四元向量(齐次坐标) 顶点位置坐标传入顶点着色程序中转化为四元向量最后一元数据为1,顶点法向量传入顶点着色程序中转化为四元向量最后一元数据为0

顶点着色程序的输出语义

下面这些语义词适用于所有的Cg vertex profiles作为输出语义和Cg fragment profiles的输入语义:
POSITION
PSIZE
FOG
COLOR0-COLOR1
TEXCOORD0-TEXCOORD7
顶点着色程序必须声明一个输出变量,并绑定POSITION语义词,该变量数据只被用于光栅化!若没有声明,就报错
顶点着色程序的绑定语义(POSITION除外)的输出形参中数据会传递到片段中绑定相同语义的输入形参中

片段着色程序的输入语义

片段着色程序的输出语义词较少,通常是COLOR。这是因为片段着色程序运行完毕后,就基本到了GPU流水线的末端了。 片段程序必须声明一个out向量
(三元或四元),绑定语义词COLOR,这个值将被用作该片断的最终颜色值。

语义绑定的语法方法可以见这篇博客这里
我做一种补充情况,这种情况不利于代码的维护和阅读,所以不常用
4.将绑定语义词放在全局非静态变量的声明后

<type><identifier>【:<binding-semantic>】[=<initializer>];

猜你喜欢

转载自blog.csdn.net/zys91011_muse/article/details/75350125