这次我们结合directx的例子程序 EffectParam来解释一下参数块和共享参数的概念,例子位于:directx安装目录/Samples/C++/Direct3D/EffectParam ,这两个东西一起说,自然是他们之间有关系的,一般一起用的。。。下面开始.
首先是共享参数,效果的参数就是效果里头申明的所有非静态的变量,包括全局变量和注释,如果在申明的时候技术上“shared”关键字
shared float4x4 g_mView; // World * View * Projection matrix
shared float4x4 g_mProj; // World * View * Projection matrix
shared float4 g_vLight = float4( 0.0f , 0.0f , - 10.0f , 1.0f ); // Light position in view space
shared float4 g_vLightColor = float4( 1.0f , 1.0f , 1.0f , 1.0f );
texture g_txScene;
float4 Diffuse;
在创建effect时传入LPD3DEFFECTPOOL参数,就可以在不同效果间共享参数。创建效果池代码如下
D3DXCreateEffectPool( & g_pEffectPool);
对于一个在多个effect中共享的参数,他们必须是相同的名字,类型和语义
由于贡献参数的effect必须使用同一个设备(device),所以那些依赖于渲染设备的参数是不能共享的,比如说texture,当含有共享参数的effect背释放时,共享参数从共享池中释放。既然是共享参数,那么当在某个地方改变参数值的时候,所有使用该参数的effect中的参数值都改变,这个太明显了吧。。。。
例子程序中共享的参数就是上面那些。。。。
然后是参数块(parameter blocks),它是一组effect状态改变块,一个参数块可以记录状态的改变,从而可以在后面通过调用某个函数设置这些状态,创建参数块的代码:
......... // 使用相应函数设置参数,比如m_pEffect->SetVector(xxxx);什么的
m_pEffect -> EndParameterBlock(); // j结束参数块的设置
一般在结束参数块设置的时候会返回一个句柄,这个句柄(假设是m_hParam,上面的代码里头忘记了,哈哈。。)在调用参数块的时候使用,具体就是
调用了这个之后,效果就把参数块中的所有参数作为一个整天一起操作了,就好像一次是使用了多个API函数设置参数的效果一样。实例EffectParam为一个标准的Direct3D材质属性设置了一个包含环境光,漫反射,镜面放射,自发光和镜面反射强度的参数块,具体代码。。。还是贴出来吧。。。叮咚,不知道怎么了,代码块不见了,那就不贴了,自己找去,就算是我督促大家去看例子吧。
好了,今天的内容就是这些了,其实directx自带的例子都是很漂亮的,对初学者都是很难得的资源,好好研究,一定会有很大收获的。。。。。bye~~!