Tôi biết một lý do chính đáng để thích xác định vị trí rõ ràng .
Cân nhắc rằng bạn giữ dữ liệu hình học của mình trong Đối tượng Mảng Vertex. Đối với một đối tượng nhất định, bạn tạo một VAO theo cách mà các chỉ số tương ứng với, ví dụ:
- chỉ số 0 : vị trí,
- chỉ số 1 : tiêu chuẩn,
- chỉ mục 2 : texcoords
Bây giờ hãy xem xét rằng bạn muốn vẽ một đối tượng với hai bóng đổ khác nhau . Một bộ đổ bóng yêu cầu vị trí và dữ liệu bình thường làm đầu vào, bộ còn lại - vị trí và các cuộn kết cấu .
Nếu bạn biên dịch các bộ đổ bóng đó, bạn sẽ nhận thấy rằng bộ đổ bóng đầu tiên sẽ mong đợi các vị trí ở chỉ số thuộc tính 0 và chuẩn ở mức 1. Cái còn lại sẽ mong đợi các vị trí ở 0 nhưng kết cấu ở 1.
Trích dẫn https://www.opengl.org/wiki/Vertex_Shader :
Tuyển tự động
Nếu cả hai phương thức trước đều không gán đầu vào cho chỉ mục thuộc tính thì chỉ mục đó sẽ được OpenGL tự động gán khi chương trình được liên kết. Chỉ mục được gán là hoàn toàn tùy ý và có thể khác đối với các chương trình khác nhau được liên kết, ngay cả khi chúng sử dụng cùng một mã bộ tạo bóng đỉnh.
Điều này có nghĩa là bạn sẽ không thể sử dụng VAO của mình với cả hai trình tạo bóng. Thay vì có một VAO cho mỗi đối tượng, giả sử, bạn cần - trong trường hợp xấu nhất - một VAO riêng biệt cho mỗi đối tượng trên mỗi bộ đổ bóng .
Việc buộc các trình tạo bóng sử dụng quy ước đánh số thuộc tính của riêng bạn thông qua glBindAttribLocation
có thể giải quyết vấn đề này một cách dễ dàng - tất cả những gì bạn cần làm là giữ mối quan hệ nhất quán giữa các thuộc tính và ID đã thiết lập của chúng và buộc các trình tạo bóng sử dụng quy ước đó khi liên kết.
(Đó không thực sự là một vấn đề lớn nếu bạn không sử dụng các VAO riêng biệt, nhưng vẫn có thể làm cho mã của bạn rõ ràng hơn.)
BTW:
Khi thiết lập vị trí thuộc tính cho chương trình đổ bóng OpenGL, bạn phải đối mặt với hai tùy chọn
Có một tùy chọn thứ ba trong OpenGL / GLSL 3.3: Chỉ định vị trí trực tiếp trong mã đổ bóng . Nó trông như thế này:
layout(location=0) in vec4 position;
Nhưng điều này không có trong GLSL ES shader ngôn ngữ.
glBindAttribLocation
công cụ đồ họa của mình, công cụ này hoạt động tốt trên linux. Khi tôi chuyển đến cửa sổ, nó đã được sử dụng normals của tôi như là đỉnh - Tôi phải dứt khoát nói với nó thứ tự của các biến trong shader của tôi quaglBindAttribLocation
để làm cho nó làm việc ...