5

したがって、OpenGL プログラミングの重要な要件は、連続したメモリを保証する方法で頂点を格納することです。私は最近、プロのグラフィック プログラマーによるまともな本を 2 冊読みましたが、どちらも同じアイデアのバリエーションを使用していました。頂点をstruct3 floats、x、y、z にパッケージ化し、複数の頂点をいずれかの c-style にパッケージ化するというものです。配列またはstd::vectorこれらのstructs。そして、それは機能します。

structしかし、このサイトでは、aはメモリの連続性を保証しないと何度も言っているのを見てきました。構造体にすべてが含まれている場合、floatsそれらはおそらく連続していると言われていますが、保証されていません。arrayandは それstd::vectorを保証しますが、配列またはベクトルに入れているものが連続していない場合は関係ありません。

生産コードの場合、「おそらく」はそれをカットしないと思います。したがって、これらの 2 冊の本の提案にもかかわらず、これらは明らかに学習に適していますが、連続したメモリを保証する方法で頂点データを簡単に整理するための他の優れた手法を知りたいです。または、アドバイスを受け入れます。私はこれについて心配する必要はありません。おそらくそれで十分です。

グラフィック分野で使用される他の一般的で優れた方法は何ですか?

4

2 に答える 2

2

OpenGL数学ライブラリglmは、そのベクトルがメモリ内で連続していて単純であることを保証しており、私は個人的に頂点を格納するために使用しています:

std::vector<glm::vec3> positions;
std::vector<glm::vec2> texCoords;

また、OpenGLglXXXv関数でその構造体のアドレスを安全にキャストするためのユーティリティもあります。

std::tuple<glm::vec3, glm::vec2> すべてを 1 つの VBO にまとめたい場合は、ある種の複合構造体を作成する必要があります。


どうやら、glm の動作標準によってサポートされていませんが、C++ 11 で変更された可能性がありalignas()ます。ただし、構造体を整列させるという点では、これ以上のことはほとんどできないと思いstatic_assertます。

于 2013-04-12T10:05:47.477 に答える