Tôi nên sử dụng bao nhiêu chương trình OpenGL để kết xuất nhiều đối tượng?


10

Cảnh của tôi có nhiều đối tượng trong đó. (Giả sử 3 hình khối, 1 hình trụ, 8 hình cầu.) Tôi giả sử tôi nên tạo một bóng đổ đỉnh cho mỗi hình. Tôi nên có bao nhiêu chương trình?

Lựa chọn thay thế:

  • Một chương trình cho mỗi đối tượng
  • Một chương trình cho tất cả các hình khối và một chương trình khác cho tất cả các hình cầu (giả sử chúng sử dụng cùng một shader)
  • Một chương trình lớn cho mọi thứ

Cách tiếp cận đúng là gì?


1
"Tôi giả sử tôi nên tạo một shader đỉnh cho mỗi cái." Tại sao bạn lại giả định điều này? Một shader đỉnh sẽ biến đổi các đỉnh theo mô hình của bạn và xem ma trận và bạn hầu như luôn muốn nó giống nhau cho mọi thứ.
usm

Câu trả lời:


8

Bạn nên coi các chương trình đổ bóng là một phần tương tự của trạng thái như kết cấu. Thay đổi trạng thái là tốn kém, vì vậy bạn có thể thoát khỏi việc kết hợp một số kết cấu thành một để tránh thay đổi kết cấu; điều tương tự cũng áp dụng cho các shader - bạn có thể kết hợp một vài shader để tránh thay đổi trạng thái.

Tương tự như kết hợp họa tiết, kết hợp các shader đi kèm với chi phí hoạt động - nếu bạn chỉ hiển thị vùng 16x16 pixel trong kết cấu 4096x4096, thì bạn không sử dụng phần cứng một cách hiệu quả. Tương tự, nếu đối tượng bạn kết xuất chỉ sử dụng 10% mã trong trình đổ bóng của bạn, thì có thể (và thậm chí có khả năng) rằng card đồ họa đang tính toán rất nhiều thứ không cần thiết.

Nói tóm lại, "phụ thuộc".


4
Ngoài ra, trong nhiều trường hợp, bạn có thể thoát khỏi chỉ với một shader. Sự khác biệt chỉ có ở đồng phục bạn chuyển cho shader, như, màu sắc, họa tiết, bản đồ bình thường, v.v.
rioki

Yup, ví dụ, bạn có thể có một shader "Scaly" tạo ra các mảnh trông có vảy và hoạt động theo cách như vậy (hầu hết các shader làm ...) mà bạn có thể kết xuất cả 3 hình khối, 1 hình trụ và 8 hình cầu bằng cách sử dụng một shader (tất nhiên với các nguyên thủy hình học tương ứng). Một bộ đồng phục hợp lý ở đây có thể là giá trị vectơ xác định màu sắc và có thể một vài số vô hướng hoặc thứ gì đó ảnh hưởng đến mức độ "vảy" hoặc "sáng bóng" của hiệu ứng hình ảnh. Sau đó, bạn có một shader và bạn thay đổi cách shader tô màu các mảnh bằng cách thay đổi đồng phục giữa các hình vẽ của các hình học riêng lẻ.
Steven Lu

5

Tốt nhất là giữ mọi thứ đơn giản nhất có thể. Sao chép cùng một shader cho mọi đối tượng là không cần thiết và sẽ nhanh chóng bị đầy hơi. Bạn cũng không muốn có một shader khổng lồ bao gồm mọi trường hợp sử dụng có thể, vì điều này gây ra chi phí không cần thiết.

Có một số ý kiến ​​về quản lý shader và không có cách "tối ưu" nào để tiếp cận điều này. Tôi thậm chí đã nhìn thấy một số triển khai shader trong đó mọi shader được tạo khi đang chạy đều dựa trên các tham số (ví dụ: trong Unreal engine ).

Đối với một người chỉ mới bắt đầu trong lĩnh vực này, có thể tốt để loại bỏ các shader cơ bản trước. Ví dụ: tôi có một trình tạo bóng cho các đối tượng không có họa tiết, trình tạo bóng có kết cấu cơ bản và hỗ trợ chiếu sáng theo pixel, v.v ... Sau đó, mỗi lần tôi muốn có một hiệu ứng khác nhau không thể thực hiện được bằng cách sử dụng trình tạo bóng trước đó, thì tôi sẽ Sẽ tạo một cái mới cho hiệu ứng mới.

Mục đích của một hệ thống như vậy là để giữ cho mọi thứ đơn giản. Chỉ. Giữ. Nó. Đơn giản.


+1 vì bạn đã đề cập đến những gì ngành công nghiệp hiện tại đang làm.
Krythic
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.