ID3DXEffect接口
上面介绍了很多fx文件相关内容,但是在程序中如何读取和分析这些fx文件呢?在程序中对于读取fx文件,控制渲染状态、设置Shader程序等工作都是通过D3DX库中的ID3DXEffect接口来实现的。ID3DXEffect接口提供了大量的方法,基本上分为几个方面:
- 获得Effect参数变量信息
- 设置Effect参数变量
- 获得technique信息
- 设置当前使用的technique
- 开始和结束使用当前的technique
- 执行一个pass(渲染绘制遍)
ID3DXEffect接口的创建: 通过D3DX库中的D3DXCreateEffectFromFile()函数,可以根据一个指定的文件的内容来创建一个ID3DXEffect接口。在该函数执行成功后,所创建的接口中就包含了文件里所对应的 所有内容,包括参数变量表、Shader程序、technique和pass等。
ID3DXEffect接口的使用: 通过该接口的方法可以获得FX文件中的所有信息,并设置参数变量和当前的technique。所有的参数变量、technique、pass、shader等等都有自己的名称,根据这些名称,通过调用ID3DXEffect::GetParameterByName()、ID3DXEffect::GetTechniqueByName()和ID3DXEffect::GetPassByName()等方法就可以获得这些对象的句柄,从而在调用 ID3DXEFFECT::Set***()进行设置时使用句柄而不是字符串进行索引来提高效率。
通过ID3DXEffect::GetParameterDesc()、ID3DXEffect::GetTechniqueDesc()和GetPassDecs等方 法可以获得关于指定对象的所有细节描述信息。 D3DX库中定义了一个D3DXPARAMETER_DESC结构来专门表示参数的类型。通过ID3DXEffect::GetParameterDesc()方法,可以为一个参数获得这样一个结构的数据。
typedef struct _D3DXPARAMETER_DESC { LPCSTR Name; //参数变量名 LPCSTR Semantic; //参数变量的Semantic D3DXPARAMETER_CLASS Class; //参数变量的类别,可以是标量、矢量、矩阵、对象和结构 D3DXPARAMETER_TYPE Type; //参数变量的类型 UINT Rows; //数组型参数的行数 UINT Columns; //数组型参数的列数 UINT Elements; //数组中的元素个数 UINT Annotations; //参数变量的Annotation个数 UINT StructMembers; //结构型参数变量成员的个数 DWORD Flags; //参数属性 UINT Bytes; //参数大小,以字节记 } D3DXPARAMETER_DESC; |
其中的参数类型可以有下列几种:
typedef enum _D3DXPARAMETER_TYPE { D3DXPT_VOID, //Void型指针 D3DXPT_BOOL, //Bool型 D3DXPT_INT, //整型 D3DXPT_FLOAT, //浮点型 D3DXPT_STRING, //字符串 D3DXPT_TEXTURE, //纹理 D3DXPT_TEXTURE1D, //一维纹理 D3DXPT_TEXTURE2D, //二维纹理 D3DXPT_TEXTURE3D, //三维纹理 D3DXPT_TEXTURECUBE, //立方体环境纹理 D3DXPT_SAMPLER, //纹理取样器 D3DXPT_SAMPLER1D, //一维纹理取样器 D3DXPT_SAMPLER2D, //二维纹理取样器 D3DXPT_SAMPLER3D, //三维纹理取样器 D3DXPT_SAMPLERCUBE, //立方体环境纹理取样器 D3DXPT_PIXELSHADER, //Pixel Shader程序 D3DXPT_VERTEXSHADER, //Vertex Shader程序 D3DXPT_PIXELFRAGMENT, //Pixel Shader片断 D3DXPT_VERTEXFRAGMENT, //Vertex Shader片断 D3DXPT_FORCE_DWORD = 0x7fffffff } D3DXPARAMETER_TYPE; |
而真正要让Effect起作用,需要在绘制网格模型前后调用ID3DXEffect::BeginPass()和EndPass方法。在调用这两个函数之前和之后,还需调用ID3DXEffect::Begin()和 ID3DXEffect::End()方法来界定此次Effect设置的起止。大致的形式如下:
LPD3DXEffect pd3dEffect; //ID3DXEffect接口指针 UINT numPasses; //用于接受当前所使用的technique中的pass个数 |