Writing HLSL Shaders (汉语)

来源:互联网 发布:淘宝网毛线 编辑:程序博客网 时间:2024/06/09 16:09

Uniform Shader Inputs
顶点和象素着色器能接受2种数据输入:可变和不变的.可变输入就是shader每次执行数据的值都会发生改变的(可以想象:顶点shader每个顶点执行一次,象素则是每个象素片段执行一次),比如顶点位置,法线等.不变的就是一次DP中shader每次执行数据的值都是保持恒定的,比如变换矩阵,材质光照颜色.uniform数据是定义在常量积存器中的,而varying数据是定义在v和t积存器中.(v为顶点着色器中的输入积存器,t是纹理坐标积存器).

uniform数据有2种途径来指定.最常用的就是定义全局变量,然后在shader中使用.所有全局变量都是uniform变量.第2种方法是在最高一级shader函数中将输入数据定义为uniform类型.

uniform变量可以通过常量表使shader和应用程序进行通信.常量表就是一个符号表,它定义了uniform变量是如何分配到各个常量积存器的.uniform函数参数在常量表中名字前面有个$符号,这个是为了避免局部uniform变量名和全局变量名冲突.

常量表包含了shader使用的所有uniform变量在常量积存器中的位置.而且还包含了变量类型信息及默认值(如何显示指定了).

最高一级shader函数的varying输入参数必须标识一个语意,否则就要标记一个uniform关键字表示其为常量.如果最高一级shader函数的输入参数既没有标市语意又没有标市为uniform,编译就会出错啦.

输入语意就是一个用来联系图形管线上一阶段输出和本阶段输入的名字.比如语意POSITION0就是顶点shader用来指定顶点缓冲中position数据连接到哪个varying变量.

象素shader输入语意描述了由光栅化单元所提供的信息.象素shader的输入数据是顶点shader为primitive的每个顶点的输出之间的插值.基本的象素shader输入语意将光栅化单元输出的color和纹理坐标信息连接到输入参数上.

输入语意有2种方法来指定给shader的输入参数:
一种是在参数后直接写  类型 参数名:语意
二种是定义一个结构体

顶点和象素shader输出数据给后面的图形管线阶段.输出语意用来指定shader生成的数据如何绑定到下一个阶段的输入上.比如:顶点shader的输出语意就是用来将顶点shader的输出绑定到光栅单元的插值器上的,而光栅单元用这些数据为象素shader产生输入.象素shader的输出又是给alpha混合单元渲染每个render target或深度缓冲的.

顶点shader输出语意既用来连接象素shader又用来连接光栅化阶段.因为顶点shader至少必须生成顶点位置数据.光栅化单元隔离了顶点shader和象素shader,而光栅化单元用来插值产生更多的位置数据.顶点shader产生的纹理坐标和颜色数据经过插值后提供给了象素shader.

Output语意与D3DDECLUSAGE定义的值很相似.一个顶点shader的输出结构一般可以直接用做象素shader的输入结构,象素shader不会读取被标记为position/point size/fog 语意的变量.这些语意和没有被象素shader使用的顶点标量值联系在一起.假设这些值需要被象素shader用到,需要使用一个象素shader语意将他们拷贝到另外一个output变量.

全局变量被编译器自动分配到相应的寄存器.全局变量也被称为uniform参数,因为在一次shader渲染中变量的内容对于所有象素处理时都是不变的.寄存器都包含在常量表中,常量表可以通过ID3DXConstantTable接口访问.

象素shader的input语意将值映射到指定的硬件寄存器,这样可以在顶点shader和象素shader中传输这些值( 比如 float4 diff : Color0,这里的Color0实际上是将diff变量影射到指定的v0寄存器) .

我尚不明白对于pixel或vertex shader 没有输出,但下阶段必须要用到的值,在GPU中是如何处理的.