ID3DXEffect接口[转载]

 

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个数
pd3dEffect->Begin( & numPasses, 0 ) //开始使用当前的technique
for( UINT iPass = 0; iPass < numPasses; iPass ++ )
{
    //遍历所有的pass
    pd3dEffect->BeginPass( iPass ); //调用BeginPass
    DrawMesh();                     //然后进行模型的绘制。
    pd3dEffect->EndPass();          //调用EndPass
}
pd3dEffect->End();                  //不要忘记结束当前technique

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值