0

OpenGL で大量のオブジェクトを描画するためのテクニック

OpenGL で多くのオブジェクトを描画するために使用できる手法や方法を考えています。

たとえば、レンガを表すクラスと、木を表す別のクラス、または街灯柱のように描きたいランダムなものがあるとします。次に、描画するレンガや街灯などをたくさん持っているとします...それぞれに対して draw メソッドを呼び出すと、非常に長いコードになります。

現時点では、レンガや木のような世界の「もの」を描画するために、過剰なコールバック関数を使用しています。

グローバルにアクセス可能なベース ポインターのベクトルの使用

私が持っていた 1 つのアイデアは、すべてのクラスが基本クラスから継承され、基本ポインターをベクターに入れ、そのベクターをグローバルにすることでした。そうすれば、次のようなことができます:

for(int i = 0; i < vector_of_objects.size(); i ++)
    vector_of_objects[i]->draw();

各オブジェクトは、すべての OpenGL プリミティブを描画する draw 関数を持つことができます。

このようなクラスの例は、次のようなものです。(これは私が実験しているものです。)

class box {
    public:
        void draw() { // Do the drawing of a box }
    // Other members etc
}

代替案?

家のようなもののために新しいクラスを作成すると、ユーザーは「draw」と呼ばれる描画関数を追加することを覚えておく必要があるため、これは良い考えではないようです...これは些細な点ですが、必ずしも大きな問題ではありません問題。

業界やゲームの開発でさまざまな手法が使用されていますか? この方法の利点は、for ループが draw 関数に入れられると、それを忘れることができるということです。

より良い代替案について何か提案はありますか?

4

3 に答える 3

1

スタッフのインターフェースを作成し、そこからクラスを継承します。このようにして、描画メソッドを実装する必要があることを誰も忘れません。

于 2013-07-11T00:08:34.770 に答える
0

オブジェクトのレンダリングに使用される純粋仮想関数を含む抽象基本クラスを作成します。これにより、インスタンス化するために、派生クラスに関数を実装することが強制されます。

class shape
{
public:
    virtual void draw( /* parameters */ ) = 0; // pure virtual

    // other member functions 
};

class box : public shape
{
public:
    virtual void draw( /* parameters same as in shape */ )
    {
        // rendering code goes here
    }
};

こんな感じで使えるようになりました...

std::vector<shape*> vector_of_objects;

for(int i = 0; i < vector_of_objects.size(); i ++)
    vector_of_objects[i]->draw( /* arguments */ );
于 2013-07-11T00:24:35.173 に答える