GPU编程入门(7) 效果(effect)基础 2

这次我们结合directx的例子程序 EffectParam来解释一下参数块和共享参数的概念,例子位于:directx安装目录/Samples/C++/Direct3D/EffectParam ,这两个东西一起说,自然是他们之间有关系的,一般一起用的。。。下面开始.

首先是共享参数,效果的参数就是效果里头申明的所有非静态的变量,包括全局变量和注释,如果在申明的时候技术上“shared”关键字

shared float4x4 g_mWorld;                      //  World view matrix
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参数,就可以在不同效果间共享参数。创建效果池代码如下

ID3DXEffectPool  *  g_pEffectPool = NULL;     // 共享池
D3DXCreateEffectPool(  &  g_pEffectPool);

对于一个在多个effect中共享的参数,他们必须是相同的名字,类型和语义

由于贡献参数的effect必须使用同一个设备(device),所以那些依赖于渲染设备的参数是不能共享的,比如说texture,当含有共享参数的effect背释放时,共享参数从共享池中释放。既然是共享参数,那么当在某个地方改变参数值的时候,所有使用该参数的effect中的参数值都改变,这个太明显了吧。。。。

例子程序中共享的参数就是上面那些。。。。

然后是参数块(parameter blocks),它是一组effect状态改变块,一个参数块可以记录状态的改变,从而可以在后面通过调用某个函数设置这些状态,创建参数块的代码:

m_pEffect -> BeginParameterBlock();          // 开始设置参数块
......... // 使用相应函数设置参数,比如m_pEffect->SetVector(xxxx);什么的
m_pEffect -> EndParameterBlock();           // j结束参数块的设置

一般在结束参数块设置的时候会返回一个句柄,这个句柄(假设是m_hParam,上面的代码里头忘记了,哈哈。。)在调用参数块的时候使用,具体就是

m_pEffect -> ApplyParameterBlock( pMat -> m_hParam )     // 其中,pMat是材质对象

调用了这个之后,效果就把参数块中的所有参数作为一个整天一起操作了,就好像一次是使用了多个API函数设置参数的效果一样。实例EffectParam为一个标准的Direct3D材质属性设置了一个包含环境光,漫反射,镜面放射,自发光和镜面反射强度的参数块,具体代码。。。还是贴出来吧。。。叮咚,不知道怎么了,代码块不见了,那就不贴了,自己找去,就算是我督促大家去看例子吧。

好了,今天的内容就是这些了,其实directx自带的例子都是很漂亮的,对初学者都是很难得的资源,好好研究,一定会有很大收获的。。。。。bye~~!

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页