Tôi đang chuyển các hàm mảng đỉnh của mình sang VBO để tăng tốc độ ứng dụng của tôi.Sự cố khi sử dụng VBO để hiển thị các đỉnh - OpenGL
Dưới đây là gốc mảng đỉnh lao động chức năng của tôi render:
void BSP::render()
{
glFrontFace(GL_CCW);
// Set up rendering states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u);
// Draw
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices);
// End of rendering - disable states
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
Làm việc tuyệt vời!
Bây giờ tôi chuyển chúng sang VBO và chương trình của tôi thực sự đã khiến card đồ họa của tôi ngừng phản hồi. Các thiết lập trên đỉnh và chỉ số của tôi là chính xác như nhau.
mới thiết lập:
vboId được thiết lập trong bsp.h như vậy: GLuint vboId [2];
Tôi không gặp lỗi khi tôi chỉ chạy hàm createVBO()!
void BSP::createVBO()
{
// Generate buffers
glGenBuffers(2, vboId);
// Bind the first buffer (vertices)
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Now save indices data in buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}
Và mã hiển thị cho VBOS. Tôi khá chắc chắn nó ở đây. Chỉ muốn render whats trong VBO như tôi đã làm trong mảng vertex.
Render:
void BSP::renderVBO()
{
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]); // for vertex coordinates
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); // for indices
// do same as vertex array except pointer
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr
// draw the bsp area
glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex array
// bind with 0, so, switch back to normal pointer operation
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
Không chắc gì lỗi là nhưng tôi khá chắc chắn tôi có chức năng vẽ của tôi sai. Muốn có một hướng dẫn thống nhất hơn về điều này vì có một bó trực tuyến nhưng họ thường mâu thuẫn với nhau.
Bạn vẫn đang theo dõi câu hỏi này và chờ câu trả lời đúng hay bạn đã bỏ nó (hoặc giải quyết 2 phút sau khi đăng)? Trong trường hợp cũ, bạn có thể tự do cập nhật câu hỏi hoặc hỏi những gì bạn không hiểu. Trong trường hợp thứ hai, thực hành không tốt để từ bỏ một câu hỏi (ngay cả khi bạn tự giải quyết nó). Nếu bạn phát hiện lỗi là một điều hoàn toàn khác với các câu trả lời đã đăng, hãy đăng và chấp nhận câu trả lời của riêng bạn. –
@Christian Rau Tôi đã từ bỏ việc này cho đến khi tôi hiểu rõ hơn về các mảng đỉnh. Sau đó, tôi sẽ đi cho VBOs như tôi nghĩ rằng họ là tương tự. Cảm ơn bạn! –