Dx effect 文件 .fx

这里简要说明一下 fx 文件, fx 文件是渲染管线的配置文件,

主要由三部分组成:变量声明,管道状态technique, pass,渲染函数, 

1.  变量声明在文件开始,这些变量可以在运行时操作,格式如下,

type id : tag = {initiliaze value} ;  

其中 type 必须是 HLSL 可识别的类型, id 必须唯一, tag 用来表示变量的用途,  后面是初始值

2. 管道状态, 一个 fx 文件可以配置多个 technique,  一个 technique 可以配置多个 pass 特殊如下,

technique (tch_uniqueId)

{

     pass (pass_uniqueId)

     {

          Texture[0] = <diffuseTexture>;

          VertexShader = compile vs_2_2 vsMain()

          PiexlShader = compile ps_2_2 psMain()

     }

}

配置的 technique , pass 可以根据 显卡的支持,以及应用程序的需求,选择性的激活相应的 technique 和 pass

3. 渲染函数,   这个就是传统意义上的着色程序,定点着色,片段着色等

创建

至此我们大概知道了 fx 目的是干嘛的,然后通过如下的方法使用,先需要创建一个Effect对应的对象,

LPD3DXEFFECT anEffect;
D3DXCreateEffectFromFile(gDevice,"fxfname.fx",NULL,NULL,0,NULL,&anEffect,NULL)

然后 找到对应的 technique, 可以用如下的方法

D3DXHANDLE hTech;
anEffect->FindNextValidTechnique(NULL,&hTech);

N3 把每个 technique 分解到不同的 特性组, 激活的时候根据特效组选择相应的 , 具体实现如下:

technique niqueId <string Mask  = "feature">

{

     pass uniqueId

     {

     }

}

D3DXHANDLE hFeatureAnnotation = this->d3d9Effect->GetAnnotationByName(this->hTechnique, "Mask");

hr = this->d3d9Effect->GetString(hFeatureAnnotation, &strPtr);

让一个 technique 和 一个 Mask 标注的 feature 绑定,然后通过 feature 来激活 technique。

使用

对于 D3DXEFFECT 按照 如下结构使用:

if (SUCCEEDED(anEffect->SetTechnique(hTech)))
{
   UINT numPasses;
   nEffect->Begin(&passes,0);

for (UINT i=0;i<numPasses;i++)

{
    anEffect->BeginPass(i); // Set the pass
    // render geometry e.g. DrawIndexedPrimitive
    anEffect->EndPass();
}

   anEffect->End();

}

交互

对于与EFFECT的交互,设置Effect文件中定义的变量,可以通过如下的接口:

anEffect->SetTexture("t0",texture1);
anEffect->SetMatrix("world",&worldMatrix);
anEffect->SetMatrix("camera",&viewMatrix);
anEffect->SetVector("var1", v);

这里有一个非常有用的特性,就是变量可以设置成共享的,共享的范围是一个 effect pool, 这样只用设置一次变量,pool 中的所有 effect 就都有了它的值。

总结

effect文件完全把渲染管线的状态设置解耦出来了,以前渲染流程中的各种状态都是根据资源类型先在代码中写死了的。现在全部在配置文件中。

dx的 .x 文件是可以包含 .fx 的。mesh 和 renderstate 的对应关系。

最后这里推荐几个用来编写fx和shader的软件

dx 的 effectEdit

nv 的 fx composer

atm 的 rendermonkey

posted @ 2016-04-22 16:32  何人之名  阅读(613)  评论(0)    收藏  举报