ゲームで使用する最新 (3.3) OpenGL を使用して単純なグラフィックス システムを作成しようとしています。動的オブジェクトには動的ジオメトリがあり、変更があるたびに VBO が更新されます。この部分は非常に簡単に実装できました。VAO が 1 つだけ使用されている限り、すべてがうまく機能しますが、glGenVertexArrays をさらに呼び出しても別のオブジェクトは作成されず (最初と 2 番目の両方の ID を出力すると 1 が返されます)、新しいオブジェクトの VAO 初期化の何かが最初のオブジェクトをレンダリングします。編集を実行できない人。すべての「最新の OpenGL」チュートリアルでは、1 つのオブジェクトのみを使用するか、かなり重大な競合が発生します (ほとんどの場合、glVertexAttribPointer の使用)。次のコードは、オブジェクトのグラフィック システムに関係しています。(これがどれほど重要かはわかりませんが、ウィンドウとコンテキストの作成に glfw3 を使用しています)。
ゲームオブジェクトの初期化 (グラフィックスニペット)
glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);
glGenBuffers(1, &vertexCoordBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
glBufferData(GL_ARRAY_BUFFER, 2000 * 3 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);
allocatedVerticies = 2000;
メッシュを更新
//generate mesh
std::vector<float> vertices;
vertices.reserve(voxels.size() * 3 * 12);
//Vertices are added to the vector. This part works. Removed this code for clarity.
vertexCount = vertices.size() / 3;
glBindVertexArray(vertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
//reallocate the buffers
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
allocatedVerticies = vertexCount;
}
else
{
/////////////////////////////
//reallocate the buffers- originally a reallocation was not going to be used, but glBufferSubData does not work
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
allocatedVerticies = vertexCount;
////////////////////////////////////////this does not work for some reason
//reset data
//glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(float), vertices.data());
}
edited = false;
レンダリング オブジェクト
glBindVertexArray(vertexArrayID);
glDrawArrays(GL_TRIANGLES, 0, vertexCount);
OpenGL の経験が豊富な人が私の間違い (またはその他の問題) を指摘できれば、それは素晴らしいことです。