Open GLでの頂点のベストプラクティス


8

Open GLに頂点データを格納することに関して、ベストプラクティスは何ですか?すなわち:

struct VertexColored {
    public:
        GLfloat position[];
        GLfloat normal[];

        byte colours[];
}

class Terrian  {
    private:
        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;

        VertexColored vertices[];
} 

または、次のように必要なクラスに個別に格納する:

class Terrian  {
    private:
        GLfloat vertices[];
        GLfloat normals[];
        GLfloat colors[];

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}

頂点ごとの値を絡み合わせることがパフォーマンスにとって重要であると聞いていますが、誰かがその理由を正確に説明できれば
すばらしいと思い

1
2番目の例には間違ったコードがあります:GLfloat [] ...-> GLfloat ... []
kravemir

申し訳ありませんが、私は例を示すためにホイップしました。C#のバックグラウンドから来たので、次のように配列を宣言しています。GLfloat [] array;
Darestium

回答:


11

ベストプラクティスはありません。すべては開発中のアプリケーションによって異なります。

ゲームレンダラーの場合、RAMとVRAMの両方に頂点を格納する必要はありません。つまり、vbo IDのみを保持する必要があります。例外は、高さのプレーヤーの配置/衝突のために位置にアクセスする必要がある地形です。

すべての頂点データを一緒にする必要がありますか?同じ頂点の複数の色を同じプレーヤーモデルの異なる色のようにしたい場合は、すべてをまとめても開発に支障はほとんどありません。

クラス外のデータにアクセスしますか?いいえの場合、最終的vertices->position[i]にのようなコードが増えるだけですpositions[i]。ゲーム/モデルデザイナーでは、外部からそれらにアクセスする必要がありますが、モデリングしているときに位置にアクセスし、カラーリングしているときにカラーにアクセスしているときに、すべてのデータに同時にアクセスしているわけではありません。

私がまとめるのはxyzrgb)値を1つの構造にしてより良いコードにすることだけです:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

編集:私が付け加えたいのは、一部の人々がunionsglVertex * 3v、glVertex * 4v、glUniform * v ...を使用して、分離された変数の代わりに配列が渡される場所を呼び出すことです。

union Vector3f {
   GLfloat v[3];
   struct {
      GLfloat x,y,z;
   };
};

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};

同じモデルに異なる色が必要な場合は、テクスチャを変更するか、すべてをグレースケールにして、ピクセルシェーダーで色(またはカラーテクスチャマップ)を乗算します。ただし、必要がない場合はCPUデータを保持しないでください。しかし、場合によっては、たとえばレイキャスティングのようにそれらを保持したい場合がありますが、それは頂点のみを保持します。
Notabene 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.