Tôi có một số mã lặp qua một tập hợp các đối tượng và biểu hiện các thể hiện của các đối tượng đó. Danh sách các đối tượng cần được hiển thị được lưu trữ dưới dạng std :: map>, trong đó một đối tượng của lớp GridResource chứa các đỉnh và chỉ mục với dữ liệu thực tế và một đối tượng của classMeshRenderer xác định điểm trong không gian mà lưới sẽ là kết xuất tại.
Mã kết xuất của tôi như sau:
glDisable(GL_BLEND);
glEnable(GL_CULL_FACE);
glDepthMask(GL_TRUE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
for (std::map<MeshResource*, std::vector<MeshRenderer*> >::iterator it = renderables.begin(); it != renderables.end(); it++)
{
it->first->setupBeforeRendering();
cout << "<";
for (unsigned long i =0; i < it->second.size(); i++)
{
//Pass in an identity matrix to the vertex shader- used here only for debugging purposes; the real code correctly inputs any matrix.
uniformizeModelMatrix(Matrix4::IDENTITY);
/**
* StartHere fix rendering problem.
* Ruled out:
* Vertex buffers correctly.
* Index buffers correctly.
* Matrices correct?
*/
it->first->render();
}
it->first->cleanupAfterRendering();
}
geometryPassShader->disable();
glDepthMask(GL_FALSE);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
Hàm trong MeshResource xử lý việc thiết lập đồng phục như sau:
void MeshResource::setupBeforeRendering()
{
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); // Vertex position
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) 12); // Vertex normal
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) 24); // UV layer 0
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) 32); // Vertex color
glVertexAttribPointer(4, 1, GL_UNSIGNED_SHORT, GL_FALSE, sizeof(Vertex), (const GLvoid*) 44); //Material index
}
Mã làm cho đối tượng là thế này:
void MeshResource::render()
{
glDrawElements(GL_TRIANGLES, geometry->numIndices, GL_UNSIGNED_SHORT, 0);
}
Và mã làm sạch là đây:
void MeshResource::cleanupAfterRendering()
{
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
glDisableVertexAttribArray(4);
}
Kết quả cuối cùng của việc này là tôi nhận được một màn hình đen, mặc dù phần cuối của đường dẫn kết xuất của tôi sau mã kết xuất (về cơ bản chỉ là vẽ trục và đường thẳng trên màn hình) hoạt động chính xác, vì vậy tôi khá chắc chắn rằng đó không phải là vấn đề với đi qua đồng phục. Tuy nhiên, nếu tôi thay đổi mã một chút để mã kết xuất gọi thiết lập ngay trước khi kết xuất, như vậy:
void MeshResource::render()
{
setupBeforeRendering();
glDrawElements(GL_TRIANGLES, geometry->numIndices, GL_UNSIGNED_SHORT, 0);
}
Chương trình hoạt động như mong muốn. Tuy nhiên, tôi không muốn phải làm điều này vì mục đích của tôi là thiết lập dữ liệu đỉnh, vật liệu, v.v. một lần cho mỗi loại đối tượng và sau đó hiển thị mỗi phiên bản chỉ cập nhật thông tin chuyển đổi.
Đồng bộ hóaModelMatrix hoạt động như sau:
void RenderManager::uniformizeModelMatrix(Matrix4 matrix)
{
glBindBuffer(GL_UNIFORM_BUFFER, globalMatrixUBOID);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(Matrix4), matrix.ptr());
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
offsetof
khi chỉ định các thuộc tính đỉnh