0

GLM OpenGL 数学ライブラリを使用して OpenGL プログラムを作成しています。頂点位置、法線、テクスチャ座標を 1 つのクラスにまとめたいと思います。

class Vertex {
    public:
       glm::vec4 position;
       glm::vec4 normal;
       glm::vec2 texcoord;
};

次に、これらの配列を頂点バッファー オブジェクト (VBO) として使用します。ただし、VBO をマップするために呼び出すとき は、メンバーとメンバーglVertexAttribPointerの結合された Vertex 構造体にオフセットを与える必要があります。normaltexcoord

これらがPODだったら、次のようなものを使用できたはずです

offsetof(Vertex, position)

しかし、それは glm データ型では機能しません (または、少なくとも g++ 4.4.3 は救済されます)。

Vertex のメンバーのオフセットを取得するための推奨される方法は何ですか?

offsetof(任意の C++ オブジェクトを使用できない一般的な理由は理解していますが、この特定のケースでは、物事が明確に定義されているようです)。

4

1 に答える 1

0

(任意の C++ オブジェクトに対して offsetof を使用できない一般的な理由は理解していますが、この特定のケースでは、物事は明確に定義されているようです)

C++98/03 標準では、それらは明確に定義されていません。C++11 は、型が「標準レイアウト」と見なされる要件を緩和することでこれを改善しました。これは、ルールのはるかに弱いセットです( offsetofC++11 では、POD ではなく標準レイアウト型が必要です)。GLM のクラスが標準レイアウトの規則に従っているかどうかはわかりません。

もちろん、C++98/03 コンパイラを扱っているので、それはすべて無関係です。非 POD 型からメンバのオフセットを取得するために標準で必要とされるメカニズムはありません。GLM 型を使用せずに頂点データを POD にする標準に固執するか、目的のコンパイラで機能することだけを行うかを選択します。

後者のケースは、実用的な観点からは、実際にはそれほど悪くはありません。C++11 で POD の定義が変更された理由は、ほとんどのコンパイラが既に新しい規則に従っているためです。標準化委員会は、コンパイラ間で機能することが広く知られている動作を単に正当化していました。したがって、単にそれを行うことができます。a のサイズglm::vec4が 16 バイトになることがわかっているので、オフセットを手動で計算します。

于 2012-09-22T23:56:16.960 に答える