1

この例では、私がWorldクラスを持っているとしましょう。世界にはモデルのコレクションがあります:

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

モデルは、車、ボール、山、立方体など、アプリケーション内のすべてのエンティティの抽象クラスになります。

問題は、そのモデルの効果を管理するためのベスト プラクティスは何かということです。base1.fx、base2.fx、base3.fx、bas4.fx の4 つのエフェクト ファイルがあるとします。それぞれにクラス インターフェイスがあり、モデルにバインドされる可能性があります ( 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();

等...

たぶん、私の視点全体が間違っているので、別の方法で作成する必要がありますか?

4

1 に答える 1

2

両方の方法を使用する必要があると思います。あれは:

  1. 各モデルには独自のエフェクト バウンドがあります。model->Bind(effect);
  2. エフェクトは個別に管理します (効率上の理由から)。
    1. 使用しているエフェクトでモデルを並べ替える
    2. 各効果について:
      • 効果を設定する
      • 現在の効果に関連付けられているすべてのモデルをレンダリングします

一定の順序でレンダリングする必要があるモデル (透明なオブジェクトなど) は、すべてが同じ効果を共有しない限り、別の方法で処理する必要があります。

于 2013-02-20T15:11:47.920 に答える