Trên tất cả các hướng dẫn tôi có thể tìm thấy về VAO (Đối tượng mảng Vertex), họ chỉ ra cách sử dụng chúng bằng cách định cấu hình các thuộc tính đỉnh và ràng buộc VBO (Đối tượng đệm của Vertex). Nhưng tôi muốn tạo một VAO sẽ được cấu hình cho một bộ VBO kết hợp với một shader cố định, trong đó mỗi bộ đệm sử dụng cùng một mẫu dữ liệu (đỉnh, uv, màu, v.v.). Vì vậy, tôi muốn tạo một VAO cho nhiều VBO sẽ được rút ra bằng một shader.
Tôi không thể tìm thấy bất kỳ bản demo nào về điều này, vì vậy tôi quyết định chỉ dùng thử. Nhưng nó không hoạt động và gặp sự cố trong glDrawArray
cuộc gọi. Có vẻ như VBO không bị ràng buộc. Đây là mã tôi đang sử dụng:
Kết xuất:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
Sáng tạo VAO:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
Trường hợp ls
đơn giản struct
chứa các vị trí thuộc tính.
Trong phần Kết xuất, hoán đổi glBindBuffer
và glBindVertexArrayOES
xung quanh cũng không hoạt động.
Vì vậy, câu hỏi là: Thậm chí có thể làm như vậy hay tôi sẽ phải tạo cho mỗi bộ đệm một VAO? Và nếu tôi phải tạo VAO cho mỗi VBO, có thể cập nhật dữ liệu của VBO bằng cách sử dụng glBufferSubData
kết hợp với VAO không?