1. ホーム
  2. c++

[解決済み] glGenVertexArraysとglGenBuffersの引数

2022-02-12 10:07:12

質問

OpenGL 3.0+のチュートリアルでは、この方法でVertex Array ObjectとVertex Buffer Objectを作成します。

GLuint VAO, VBO; 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

ここで、VAOは unsigned int ( GLuint ) にそのアドレスを渡し、関数 glGenVertexArray . しかし、ドキュメントによると、この関数の第2引数には の配列 unsigned int ( GLuint* ). 同じくVBOと glGenBuffers . なぜ、このような引数で上記のコードが動作するのか理解できません。

私は上記のコードをこのコードで置き換えることを試みました(そして、私のコードの他の場所で必要な修正を行います)。

GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);

最初の構文ではテクスチャ付きの矩形がレンダリングされますが、2番目の構文ではされません。なぜこのようなことが起こるのか理解できません。

EDIT : ありがとうございます。記載されているように、2番目のコードにインデックス付けのミスがあります。

解決方法は?

スペック上の関数シグネチャは

void glGenVertexArrays( GLsizei n,
                        GLuint *arrays);

だから arraysGLuint ポインタ と書くのが妥当なところ n * sizeof(GLuint) バイトのデータを送信します。

書いても全く問題なく、有効です。

GLuint VAO, VBO; 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

なぜなら glGenVertexArrays へのポインタを持ちたい。 GLuint を記述することが有効です。 n * sizeof(GLuint) バイトのデータ(あなたの場合 1 ) であり、かつ VAO がこれだけのデータを保持できるのだから、そのように書くのが正しい。また、1回の呼び出しで1つのidしか作らないのであれば、andが望ましい。

すでに他の人が言っているように、配列の最初の要素はインデックスが 0 . ということでなければならない。

GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);

一度の呼び出しでより多くの要素を作成したい場合は std::array オーバー [] .

std::array<GLuint,3> VAOs;
std::array<GLuint,3> VBOs;

glGenVertexArrays(VAOs.size(), &VAOs[0]);
glGenBuffers(VBOs.size(), &VBOs[0]);

ノートとして unsigned intGLuint は、必ずしも同じ種類や大きさである必要はありません。 unsigned int には最低保証数の範囲がありますが、それでもプラットフォームが異なればサイズは異なる可能性があります。 GLuint 一方、サイズは定義されています。