2011-09-28 42 views
11

Đây có thể là câu hỏi noob. Như tôi đã hiểu, glBindAttribLocation (..., AAA, ...) sẽ liên kết một thuộc tính trong chương trình với ID vị trí của AAA, miễn là AAA là duy nhất. Nếu tôi có đoạn mã sau:GLES2 Là glBindAttribLocation() Cần thiết?

glBindAttribLocation(..., 0, "XXX"); 
glBindAttribLocation(..., 1, "YYY"); 

này sẽ ràng buộc hai biến tôi đến vị trí ID 0 và 1. Sau đó tôi sẽ gọi:

glBindBuffer(GL_ARRAY_BUFFER, VBId); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBId); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void *) 0 + sizeof(float) * 3); 
glEnableVertexAttribArray(1); 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 

Tính đến thời điểm này, tôi hiểu rằng các ID của 0 và 1 được chuyển vào glVertexAttribPointer() làm tham số đầu tiên. Có thể an toàn để giả định rằng nếu tôi nhận được ID vị trí của các thuộc tính (như trên) thông qua các cuộc gọi glGetAttribLocation(), sao cho các ID được trả lại là 5 và 6 thay vì 0 và 1, tôi có thể vượt qua 5 và không 6 vào glVertexAttribPointer() và glEnableVertexAttribArray() thay vì 0 và 1 ??

Trả lời

13

glGetAttribLocation() trả về chỉ mục chính xác. Vì vậy, có, nó là an toàn để sử dụng những giá trị trong glVertexAttribPointer() và glEnableVertexAttribArray().

Nhưng gọi glGetAttribLocation cho mỗi trình đổ bóng có thể tốn kém nếu bạn không lưu vào bộ nhớ cache. Sử dụng glBindAttribLocation() cho phép sử dụng một quy ước, vị trí luôn bằng 0, bình thường trong 1 và cứ tiếp tục như vậy.

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