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 库,根本就没啥效率跑的不还挺欢的么