顶点着色器其实就是我们自己编写的一段在GPU中运行的程序,有了顶点着色器,我们就可以从固定的功能流水线中代替一些模块,
从而获得更多的顶点操作的灵活性。
对于顶点位置进行操作的的能力具有广泛的应该场合:织物模拟、粒子系统的点尺寸处理等。
可编程流水线中的顶点结构比固定的流水线具有更加丰富的数据。
首先我们应该检测一下,硬件是否支持顶点着色器:
//如果设备支持的版本低于2.0版
if(caps. VertexshaderVersion <D3DVS_VERSION(2,0))
//然后此设备不支持顶点着色器版本2.0
顶点声明(比灵活顶点格式更牛逼的一种格式)
之前使用的都是灵活顶点格式来表示顶点,在可编程的流水线中,我们使用比灵活顶点格式表示的内容更丰富,功能更强大的顶点声明
顶点声明的描述
我们将顶点声明描述为一个D3DVERTEXELEMENT9类型的一个数组,该数组中的没有一个元素都描述了一个顶点结构的分量
所以如果你的顶点结构具有3个分量(位置,颜色,法线),则相对应的顶点声明就可以用一个维数为3的D3DVERTEXELEMENT9类型数组来描述
D3DVERTEXELEMENT9结构定义:
typedef struct D3DVERTEXELEMENT9{
WORD Stream;
WORD Offset;
BYTE Type;
BYTE Method;
BYTE Usage;
BYTE UsageIndex;
)D3DVERTEXELEMENT9,*LPD3DVERTEXELEMENT9;
Stream:指定与顶点分量相关的数据流
Offset:自地顶点数据起始点到特定数据类型的偏移量
比如:
顶点结构:
struct Vretex{
D3DVECTOR3 pos;
D3DVECTOR3 normal;
}
当前位置存放到的是法线normal,由于sizeof(pos) = 12,所以normal相对于顶点结构起始点偏移量就是12,该参数的值就是12
Type 指定数据类型。该参数可取枚举类型D3DDECLTYPE的任何一个成员,一些常用的类型如下:
D3DDECLTYPE_FLOATI浮点类型的标量。
D3DDECLTYPE_FLOAT2浮点类型的2D向量。
D3DDECLTYPE_FLOAT3浮点类型的3D向量。
D3DDECLTYPE_FLOAT4浮点类型的4D向量。
D3DDECLTYPE_D3DCOLOR 一个被扩展为RGBA浮点类型颜色向量(r,g,b,a)的D3DCOLOR类型,
其中颜色向量的每个分量都被规范化至区间[0,]内。
Method 指定了顶点分量的用途,比如:某一分量是作为位置向量,法向量还是纹理向量
主要取自下面的枚举类型: