GLSL, tất cả trong một hoặc nhiều chương trình đổ bóng?


17

Tôi đang thực hiện một số bản demo 3D bằng OpenGL và tôi nhận thấy GLSL có phần "hạn chế" (hoặc đó chỉ là tôi?). Dù sao tôi có nhiều loại vật liệu khác nhau. Một số vật liệu có màu sắc xung quanh và khuếch tán, một số vật liệu có bản đồ che khuất môi trường xung quanh, một số vật liệu có bản đồ đặc trưng và bản đồ va chạm, v.v.

Là tốt hơn để hỗ trợ tất cả mọi thứ trong một cặp shader đỉnh / mảnh hoặc tốt hơn là tạo ra nhiều shader đỉnh / mảnh và chọn chúng dựa trên vật liệu hiện được chọn? Chiến lược đổ bóng thông thường trong OpenGL hoặc D3D là gì?



Đây là một sự phân đôi giả, rằng bạn phải chọn một hoặc cách tiếp cận khác để quản lý các shader. Trong mười lăm năm trong ngành, tôi chưa bao giờ làm việc trong một dự án mà chúng tôi tuân thủ một cách cực đoan, nhưng luôn cân bằng giữa hai cách tiếp cận để quản lý các shader, sử dụng từng cách hợp lý để làm như vậy.
Trevor Powell

Câu trả lời:


12

Câu trả lời là, nó hơi phụ thuộc.

Về cơ bản có hai trường phái tư tưởng; các shader nhỏ, tối ưu cho mọi thứ và trại uber-shader.

Các shader nhỏ chỉ có vậy; làm một việc, và làm tốt Uber shader kiểm soát chức năng của họ khi chạy thông qua đồng phục hoặc biên dịch thành một loạt các shader khác nhau thông qua các macro tiền xử lý (và / hoặc các nguồn shader được tạo).

Giải pháp tối ưu có lẽ là không, nhưng một số loại lai. Có lẽ một vài shuber-shader hoặc uber-shader kết hợp với shader chuyên dụng cho một số trường hợp.

Shader nhỏ

Ưu điểm:

  • Có khả năng nhanh hơn / tối ưu hơn
  • Có phải những gì bạn muốn nó làm
  • Có thể làm những điều kỳ lạ, tùy chỉnh dễ dàng

Nhược điểm:

  • Dễ dàng vượt khỏi tầm tay, đặc biệt là khi số lượng tính năng tăng lên
  • Có lẽ nhiều công việc hơn, trừ khi bạn có một số lượng rất ít shader

Uber-shader

Ưu điểm:

  • Mọi thứ ở một nơi
  • Thân thiện với nghệ sĩ hơn (lần đầu tiên sử dụng tính năng A với tính năng X không nhất thiết phải có thời gian mã hóa)

Nhược điểm:

  • Thời gian biên dịch shader dài hơn
  • Kết quả kém tối ưu hơn (đặc biệt nếu đồng phục được sử dụng để bật / tắt tính năng)
  • Có thể khó gỡ lỗi / tối ưu hóa hơn

Uber-shadertrong đại diện này không phải là một điều tốt :) Tôi sẽ đề xuất viết trình quản lý shader tốt dựa trên các tiền định - vì vậy chúng tôi sẽ có mã uber-shader với nhiều #ifdefs sẽ được bật cho các tài liệu khác nhau.
brigadir

2
Tôi muốn nói thêm rằng một chuyên gia khác của uber-shader là việc chuyển đổi shader có chi phí về hiệu suất, vì vậy nếu bạn chuyển đổi ít thường xuyên hơn, bạn có thể cải thiện hiệu suất.
Jherico
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.