2011-08-12 30 views
5

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.

+1

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. –

+0

@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! –

Trả lời

0

Nếu bạn đang chuyển cùng một dữ liệu đến glDrawElements khi bạn không sử dụng VBO và cùng dữ liệu với bộ đệm VBO. Sau đó, các thông số hơi khác, không có FBO bạn đã sử dụng GL_UNSIGNED_SHORT và với FBO bạn đã sử dụng GL_UNSIGNED_BYTE. Vì vậy, tôi nghĩ rằng cuộc gọi VBO sẽ trông giống như sau:

glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_SHORT, 0); 

Cũng xem this tutorial, có bộ đệm VBO được giải thích rất tốt.

+0

Vẫn khiến trình điều khiển đồ họa của tôi không phản hồi. Và toàn bộ BUFFER_OFFSET (0) được trình bày trong nhiều hướng dẫn. Dù sao cũng cảm ơn bạn! –

+0

Bạn cũng có thể đăng các khai báo cho mọi biến mà bạn chuyển vào các hàm gl không? – kravemir

2

Bên cạnh đó những gì Miro nói (các GL_UNSIGNED_BYTE nên GL_UNSIGNED_SHORT), tôi không nghĩ rằng bạn muốn sử dụng numVertices nhưng numIndices, giống như trong cuộc gọi không VBO của bạn.

glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0); 

Nếu không, mã của bạn có vẻ không hợp lệ và nếu điều này không khắc phục được sự cố thì có thể là lỗi khác.

Và bằng cách điều BUFFER_OFFSET(i) là usuaully chỉ là một định nghĩa cho ((char*)0+(i)), vì vậy bạn cũng có thể chỉ cần vượt qua trong byte bù đắp trực tiếp, đặc biệt là khi nó là 0.

EDIT: Chỉ cần phát hiện một số khác. Nếu bạn sử dụng cấu trúc dữ liệu chính xác mà bạn sử dụng cho phiên bản không phải VBO (mà tôi đã giả định ở trên), thì tất nhiên bạn cần sử dụng sizeof(Vertex) làm thông số sải chân trong glVertexPointer.

0

Làm cách nào để khai báo đỉnhchỉ số?

Tham số kích thước cho glBufferData phải là kích thước của bộ đệm theo byte và nếu bạn vượt qua sizeof (đỉnh) nó sẽ trả về tổng kích thước của mảng được khai báo (không chỉ phân bổ).

Hãy thử một cái gì đó giống như sizeof (Vertex) * numVerticessizeof (chỉ số [0]) * numIndices để thay thế.

+1

Giả sử anh ta sử dụng mảng (thay vì lưu trữ được cấp phát động), 'sizeof (vertices)' phải hoàn toàn hợp lệ. Othwerise đây tất nhiên là một vấn đề. –

Các vấn đề liên quan