5

設計が弱いため、数学ライブラリ全体と数学に関連するものを書き直さなければなりませんでした。代わりに、GLM を使用できることがわかりました。以前の質問に遭遇した場合、私はスケルトン アニメーションを扱ってきたので、大量の mat4、vec3、vec2 をアップロードする必要があります。これが私の以前の頂点構造体です:

struct Vertex {
    Vec3 pos;
    Vec3 normal;
    Vec2 uv;
    Vec4 boneindex;
    Vec4 weightbias;
};

残念ながら、数学ライブラリが POD ではないことがわかり、構造体全体をアップロードしようとしたところ、奇妙な結果が得られました。次のように定義された最終的なボーン マトリックスについても同じです。

Mat4 bones[numBones];

それも一気にアップしてみました。

Vec3s、Vec2s、および Mat4s を glm::vec3、vec2、mat4 に置き換えて、Vertex 構造体全体 (頂点の数) を直接アップロードし、次を使用して各データのオフセットを設定するかどうか疑問に思います。

 glBindBuffer(GL_ARRAY_BUFFER,everythingVBO);
 glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(0)) // pos
 glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(sizeof(glm::vec3)) // norm
 ..
 ..

 same for matrix
 glUniformMatrix4fv(xx, numBones, xx, glm::mat4 value)

.

意図したとおりに動作しますか? 私はすべてを書き直したくありません。今回は、別の失敗に直面したくないので、それが機能することを確認する必要があります。

4

1 に答える 1

8

これは非常に単純で非常に複雑な質問です。なので、まずは簡単な方法から。

GLM 型からいくつかを構築structし、それらをバッファにアップロードし、glVertexAttribPointer. オフセットを適切に取得すると仮定します。「ポータブル C++」にはなりません。標準に関する限り、それは実装定義の動作になります (またはoffsetofマクロを使用しようとすると未定義の動作になります。確かに、代わりに使用する可能性のあるものはすべてoffsetof、標準によって十分に定義されています)。

しかし、それは一般的に機能します。

準拠する C++11 コンパイラでは、GLM 型は標準レイアウト型と見なされるため、offsetof明確に定義された動作を持ちます。Vertexまた、構造も標準レイアウトである限り、機能しますoffsetof

ただし、これは、これらの型の内部構造に任意のパディングがないという意味ではありません。Aglm::vec3は、OpenGL が期待するとレイアウト互換である必要はありません。float[3]C++ 標準では保護されません。

そうは言っても、遭遇するほとんどのコンパイラでは、GLM の型が配列と同等であると想定するのはかなり安全です。GLM はtype_ptr、コンパイラーが互換性を持たせることを期待して、その型の 1 つの内容へのポインターを配列として取得する関数も提供します。

同様に、C++ 標準では、float[16*n]が の配列とレイアウト互換性があるという保証はありませんglm::mat4[n]。しかし、繰り返しになりますが、それがうまくいくと仮定するのはかなり安全です.

于 2013-06-19T17:54:16.567 に答える