首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

D3D中shader类的封装疑问解决方法

2012-03-11 
D3D中shader类的封装疑问首先我先介绍一下我的封装想法,暂时先只管理一个effect。其中疑问就是参数handle的

D3D中shader类的封装疑问
首先我先介绍一下我的封装想法,暂时先只管理一个effect。其中疑问就是参数handle的管理(不用参数句柄效率太低)。
class Shader
{
public:
  Shader();
  ~Shader();
  bool LoadEffect(char* _filename);
  bool AddParameters(char* _p);
  bool SetParameters(char* _p,D3DXMATRIX* _m);
  bool SetParameters(char* _p,D3DXVECTOR3* _v);
  bool SetParameters(char* _p,D3DXVECTOR2* _v);
  bool SetParameters(char* _p,Spotlight* _l);
  ...//多个重载函数
  void Lost();
  void Reset();
  void Destroy();
public:
  list<D3DXHANDLE*> handlelist;
};

下面我再发一段在XNA中shader的用法:
render(){
...
expEffect.CurrentTechnique = expEffect.Techniques["Explosion"];
expEffect.Parameters["World"].SetValue(Matrix.Identity);
expEffect.Parameters["Projection"].SetValue(camera.ProjectionMatrix);
expEffect.Parameters["View"].SetValue(camera.ViewMatrix);

expEffect.Parameters["CamPos"].SetValue(camera.Position);
expEffect.Parameters["ExplosionTexture"].SetValue(myTexture);
expEffect.Parameters["CamUp"].SetValue(camera.UpVector);
expEffect.Parameters["Time"].SetValue((float)gameTime.TotalGameTime.TotalMilliseconds);
...
}

XNA在设置参数的时候直接根据参数名就完成了参数设置,没有handle一说,不知内部怎样高效的找到参数地址?
我之所以加了一个addParameters()函数是因为想在这个过程中获得handle,以后用的时候直接调用该handle,问题是怎么调用,是根据名称查找吗(效率- -),还是之前设置ID作为索引(这样跟没封装一样麻烦,并且id当做索引页不大好)。。。

[解决办法]
当然是根据名称查询,否则呢? 不要担心效率问题,看看 D3DX 的 Effect 库,根本就没啥效率跑的不还挺欢的么

热点排行