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

浙公网安备 33010602011771号