管理HLSL效果

时间:2013-02-17 20:25:21

标签: c++ directx hlsl directx-10

让我们说,对于这个例子,我有世界类。 World收集了模型

class World
{
    public:
      map<string, Model*> Models;
};

模型将是应用程序中所有实体的抽象类,例如汽车,球,山或立方体。

问题是 - 管理该模型的效果的最佳实践是什么。比方说,我有4个效果文件: base1.fx,base2.fx,base3.fx,bas4.fx 。它们中的每一个都有类接口,可能与模型绑定( IBaseEffect1,IBaseEffect2,IBaseEffect3,IBaseEffect4 )。

现在,我应该考虑每个模型是否独立,并执行以下操作:

Cube1.Bind(IBaseEffect2);
Car.Bind(IBaseEffect3);

如果模型具有管理效果的能力,那么我会做:

World::Render()
{
    foreach model -> Render();
}

这是我的引擎的实际解决方案。

或者更好的方法是独立管理效果,并执行以下操作:

IBaseEffect1.SetAsActual();

foreach Model which should be considered for effect1 -> Render();

IBaseEffect2.SetAsActual();

foreach Model which should be considered for effect2 -> Render();

等...

也许我的观点是错误的,应该采取其他方式?

1 个答案:

答案 0 :(得分:2)

我认为你应该使用两种方法。那就是:

  1. 每个模型都有自己的效果界限:model->Bind(effect);
  2. 您可以单独管理效果(出于效率原因):
    1. 按照他们正在使用的效果对模型进行排序
    2. 对于每种效果:
      • 设置效果
      • 渲染与当前效果相关联的所有模型
  3. 必须以固定顺序呈现的模型(例如透明对象)应以不同的方式处理,除非所有模式都具有相同的效果。