Rõ ràng so với ràng buộc thuộc tính tự động


7

Tôi là người mới bắt đầu sử dụng OpenGL và tôi đã thực hiện một số nghiên cứu về chủ đề bóng và thuộc tính. Hầu hết các nơi tôi đến đều nói rằng ràng buộc thuộc tính rõ ràng (cho dù đó là trong chính trình đổ bóng có layout(location=x)hoặc với glBindAttribLocation) tốt hơn là để OpenGL tạo một số số thuộc tính. Tuy nhiên, tôi đã không hoàn toàn hiểu TẠI SAO ràng buộc thuộc tính rõ ràng là tốt hơn.

Vì vậy, tôi đoán câu hỏi của tôi là, những ưu / nhược điểm của ràng buộc thuộc tính rõ ràng / tự động, và cái nào có lợi hơn cho thiết kế chương trình tổng thể tốt hơn?


1
Về nguyên tắc, tôi nghĩ tự động có một lợi thế: khi sử dụng cùng một shader đỉnh với nhiều shader mảnh khác nhau, một số thuộc tính có thể không phù hợp với đầu ra của một shader pixel nhất định và trình biên dịch có thể phát hiện ra điều này và thông báo cho ứng dụng, cho phép tối ưu hóa cách bố trí đỉnh. Trong thực tế, tôi không tận dụng điều này (vì một vài lý do). Tôi cũng tò mò muốn biết nhược điểm của tự động là gì ...
Daniel M Gessel

Câu trả lời được chấp nhận trên bài đăng này lập luận cho khía cạnh ủng hộ, có lẽ bạn có thể xem lý do tại sao anh ấy nghĩ như vậy. stackoverflow.com/questions/4635913/
hy

1
Tái sử dụng VAO với nhiều shader sử dụng cùng bố cục đỉnh. Nếu bạn để trình biên dịch quyết định, bạn có khả năng cần một VAO cho mỗi VB cho mỗi chương trình được biên dịch, ngay cả khi chúng sử dụng chính xác các thuộc tính giống nhau. Nghe có vẻ tốt với tôi! Tôi nên tìm kiếm những gì Vulkan làm, bây giờ thông số kỹ thuật đã hết ...
Daniel M Gessel

Câu trả lời:


2

Về cơ bản, nó cho phép bạn kiểm soát ngữ nghĩa của các chỉ số thuộc tính riêng lẻ . Điều này chủ yếu được đền đáp trong các dự án lớn hơn, nơi bạn có nhiều shader khác nhau, tuy nhiên, thường sử dụng các thuộc tính khá phổ biến, ví dụ như vị trí hoặc tọa độ kết cấu. Với các vị trí thuộc tính rõ ràng, bạn có thể thiết lập một ngữ nghĩa cho các thuộc tính đó và thực thi rằng trên tất cả các shader của bạn , ví dụ: các vị trí luôn ở thuộc tính 0, tọa độ kết cấu luôn ở thuộc tính 1, ...

Đầu tiên, điều này có lợi thế là không phải truy vấn chỉ số thuộc tính cho mỗi shader . Tất nhiên bạn có thể truy vấn nó một lần và tìm kiếm nó trong ví dụ bản đồ từ tên thuộc tính / ngữ nghĩa đến các chỉ mục, nhưng thiết lập trước đó thậm chí còn tốt hơn. Và nó mang lại cho chúng ta một lợi thế lớn hơn nhiều, nếu không ràng buộc thuộc tính rõ ràng, bạn sẽ phải liên kết các mảng đỉnh của một mô hình với các kênh thuộc tính riêng lẻ không chỉ cho mỗi mô hình, mà còn cho mỗi shader , vì mảng vị trí của bạn có thể đi đến thuộc tính 0 trong một shader và thuộc tính 1 trong một cái khác.

Đây không chỉ là một rắc rối lớn mà về cơ bản còn phá hủy lợi thế của Vertey Array Object (VAO) , đặc biệt ở đó để nắm bắt tất cả trạng thái thuộc tính đỉnh, bao gồm các chỉ số thuộc tính được bật và nguồn bộ đệm của chúng để bạn có thể vẽ đối tượng của mình bằng cách chỉ ràng buộc VAO và gọi hàm vẽ. Nếu không ràng buộc thuộc tính rõ ràng, bạn vẫn sẽ phải kích hoạt / liên kết các mảng riêng lẻ ít nhất cho mỗi shader khác nhau mà bạn sử dụng. Với ràng buộc thuộc tính rõ ràng, bạn biết rằng vị trí của mô hình của bạn luôn đi vào chỉ số thuộc tính 0 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.