Tôi chắc chắn rằng nếu bạn liên kết bộ đệm qua glBindBuffer()
, bạn có thể giả định rằng nó vẫn bị ràng buộc, cho đến khi mục tiêu được phục hồi qua một cuộc gọi khác tới glBindBuffer()
. Vì vậy, tôi đã khá ngạc nhiên khi tôi phát hiện ra rằng gọi glBindVertexArray()
đặt đệm ràng buộc với mục tiêu GL_ELEMENT_ARRAY để 0.OpenGL 3: glBindVertexArray vô hiệu hóa GL_ELEMENT_ARRAY_BUFFER
Đây là C tối thiểu ++ mẫu mã:
GLuint buff;
glGenBuffers(1, &buff);
std::cout << "Buffer is " << buff << "\n";
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buff);
GLuint vao;
glGenVertexArrays(1, &vao);
GLint bound_buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound before glBindVertexArray: " << bound_buff << "\n";
glBindVertexArray(vao);
// ^- an implicit glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); ?
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound after glBindVertexArray: " << bound_buff << "\n";
tôi chạy mã này ngay sau khi khởi tạo một OpenGL 3.2 bối cảnh thiết bị và nhận được kết quả như sau:
Buffer is 1
Bound before glBindVertexArray: 1
Bound after glBindVertexArray: 0
các GL_ARRAY_BUFFER mặt khác là không thay đổi bởi các cuộc gọi. Tôi đã kiểm tra OpenGL 3.2 spec (2.10) cho glBindVertexArray
và không tìm thấy đề cập đến tác dụng phụ bất ngờ đó.
- Hành vi này có tuân thủ Spec không?
- Nếu có, những tác dụng phụ nào khác có thể được mong đợi từ một cuộc gọi đến
glBindVertexArray
? - Lý do đằng sau điều này là gì?
Tôi đã thử nghiệm thẻ này trên thẻ nvidia trên máy Win XPx64 với trình điều khiển 296,15 WHQL. Một thử nghiệm nhanh chóng trên OS X Lion với một nvidia GT330M cho kết quả tương tự.
Tôi nghĩ rằng ràng buộc một VAO là hoàn toàn ràng buộc phần tử và bộ đệm mảng đỉnh. Đó là những gì VAO đang làm. Nếu bạn liên kết một VAO và sau đó liên kết một bộ đệm chỉ mục và đỉnh, các bộ đệm này sau đó sẽ bị ràng buộc hoàn toàn bất cứ khi nào bạn liên kết VAO sau này. Vì vậy, ràng buộc VAO ở trên có lẽ đã ngầm thiết lập các phần tử và các mảng đỉnh bằng không vì chúng chưa được bao gồm bởi bạn trong đối tượng VAO. Điều đó có ý nghĩa không? :-) – Robinson
Nhưng tại sao nó chỉ thay đổi GL_ELEMENT_ARRAY_BUFFER chứ không phải GL_ARRAY_BUFFER? – ComicSansMS
Vì bộ đệm mảng là bộ đệm đỉnh (ít nhất là các glEnableVertexAttribArray khác nhau và glVertexAttribPointer gọi thực hiện của bạn với nó), và nó bao gồm một phần tử đệm như một phần của trạng thái đó. – Robinson