管理HLSL效应

Managing HLSL effects

本文关键字:效应 HLSL 管理      更新时间:2023-10-16

例如,我有World类。世界有模型集合:

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

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

问题是,管理这些模型效果的最佳实践是什么。比方说,我有4个效果文件:base1.fx、base2.fx、base3.fx、bas4.fx。它们每个都有类接口,可能绑定到模型(IBaseEffect1、IBaseEffect2、IBaseEffects 3、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. 每个模型都有自己的效应边界:model->Bind(effect);
  2. 您单独管理效果(出于效率原因):
    1. 根据模型使用的效果对其进行排序
    2. 对于每种效果:
      • 设置效果
      • 渲染与当前效果关联的所有模型

必须以固定顺序渲染的模型(例如透明对象)应以不同的方式处理,除非所有模型都具有相同的效果。