Kết xuất hiệu quả với nhiều nguồn sáng


10

Để hiển thị cảnh với một nguồn sáng duy nhất bằng cách sử dụng bóng râm, người ta có thể tính toán màu cuối cùng của từng mảnh được chuyển vào bộ đổ bóng mảnh dựa trên các thành phần xung quanh / khuếch tán / đặc trưng của cả vật liệu và nguồn sáng.

Điều này có thể dễ dàng được mở rộng để phù hợp với nhiều nguồn sáng bằng cách cộng các kết quả của việc áp dụng từng nguồn sáng riêng lẻ vào đoạn như sau:

final_color = (0, 0, 0, 1)
for each light:
    final_color += apply_light(material, light)
final_color = clamp(final_color, (0,0,0,1), (1,1,1,1))

Tuy nhiên, với số lượng nguồn sáng rất lớn, quá trình này khá chậm; với Nánh sáng, cách tiếp cận này đòi hỏi tính toán cho bóng râm được thực hiện Nlần trên mỗi mảnh.

Có cách tiếp cận nào tốt hơn để dựng cảnh với số lượng nguồn sáng rất lớn (hàng trăm, hàng nghìn, v.v.) không?

Câu trả lời:


15

Có, nhưng bạn cần một sự thay đổi mô hình.

Những gì bạn đã quen được gọi là kết xuất phía trước. Bạn gửi hình học của bạn và sau đó bạn tiến hành ngay lập tức với bóng đổ. Trong kết xuất chuyển tiếp cơ bản, bạn có thể lặp bên trong shader cho mỗi ánh sáng hoặc thực hiện một lần cho mỗi ánh sáng và trộn kết quả lại với nhau (với sự pha trộn phụ gia).

Nhưng mọi thứ đã phát triển khá nhiều. Enters: Trì hoãn kết xuất

Bây giờ có rất nhiều biến thể mô tả tất cả chúng một cách chi tiết sẽ diễn ra nhiều hơn mức chấp nhận được cho một câu trả lời ở đây. Vì vậy, ở đây tôi chỉ mô tả ý chính của bóng mờ Trì hoãn, có rất nhiều tài nguyên khác mà bạn có thể dễ dàng tìm thấy bằng cách sử dụng google, hy vọng sau khi đọc xong, bạn sẽ có từ khóa phù hợp để tìm thấy những gì bạn cần.

Ý tưởng cơ bản là trì hoãn việc đổ bóng đến sau khi xuống đường ống. Bạn có hai bước chính:

  1. Kết xuất hình học của bạn và tất cả thông tin cần thiết để đổ bóng vào nhiều mục tiêu kết xuất. Điều này có nghĩa là thông thường trong một triển khai cơ bản, bạn sẽ có một bộ đệm độ sâu, một bộ đệm chứa các quy tắc hình học của bạn và màu albedo. Bạn sẽ sớm thấy rằng bạn cần thông tin khác của các vật liệu (ví dụ độ nhám, yếu tố "kim loại", v.v.).

Hình ảnh này từ wikipedia cho thấy ba bộ đệm (màu sắc, độ sâu và quy tắc)

nhập mô tả hình ảnh ở đây

Một lần nữa, số lượng, loại và nội dung của bộ đệm được sử dụng thay đổi khá nhiều giữa các dự án khác nhau. Bạn sẽ tìm thấy bộ đệm với tên GBuffers.

  1. Sau đây là thời gian áp dụng ánh sáng thực tế. Trong suốt thời gian chiếu sáng cho mỗi ánh sáng, bạn muốn vẽ một khối lượng ánh sáng phụ thuộc vào loại ánh sáng:
    • Đối với ánh sáng định hướng, bạn kết xuất một màn hình đầy đủ quad.
    • Đối với ánh sáng điểm, bạn kết xuất một hình cầu trong đó bán kính dựa trên sự suy giảm của ánh sáng điểm của bạn.
    • Đối với ánh sáng tại chỗ, bạn kết xuất một hình nón có kích thước một lần nữa phụ thuộc vào đặc điểm của ánh sáng.

Trong pixel shader của pass này, bạn vượt qua GBuffers của bạn và thực hiện ánh sáng và bóng của bạn bằng cách sử dụng thông tin trong đó. Bằng cách này, bạn chỉ xử lý các pixel bị ảnh hưởng bởi mỗi đèn có tốc độ tăng tốc hợp lý nếu so với kết xuất chuyển tiếp cổ điển.

Nó cũng có những nhược điểm khác nhau, đáng chú ý nhất là việc xử lý các đối tượng trong suốt và tiêu thụ băng thông và bộ nhớ video cao hơn. Nhưng cũng khó hơn để xử lý các mô hình khác nhau cho các vật liệu.

Bạn có những lợi thế phụ khác (vì có nhiều thông tin sẵn sàng để xử lý hậu kỳ) và cũng khá dễ thực hiện. Nhưng đây không phải là điều thú vị nhất xung quanh cho nhiều ánh sáng nữa.

Các kỹ thuật mới hơn là ví dụ các kết xuất Tiled . Ý tưởng chính của những thứ đó là chia nhỏ cảnh trong "gạch" không gian màn hình và gán cho mỗi ô đèn các đèn ảnh hưởng đến nó. Điều này tồn tại cả trong một thời gian trì hoãn và chuyển tiếp. Những kỹ thuật này dẫn đến một số vấn đề khi bạn có sự gián đoạn độ sâu khác nhau trong một ô, nhưng thường nhanh hơn so với phương pháp trì hoãn cổ điển và nó giải quyết các vấn đề khác nhau của nó. Ví dụ, trong số các ưu điểm, với độ trễ được lát gạch, bạn đọc GBuffers một lần trên mỗi mảnh sáng và pixel trong cùng một ô kết hợp xử lý cùng một ánh sáng.

Sự tiến hóa hơn nữa ở phía này là bóng mờ Clustered tương tự về mặt khái niệm với các phương pháp dựa trên lát gạch, thay vì các ô không gian màn hình, các cụm với phạm vi 3D. Phương pháp này xử lý tốt hơn vấn đề gián đoạn độ sâu và thường thực hiện tốt hơn các phương pháp lát gạch.

LƯU Ý QUAN TRỌNG: Tôi đã mô tả những điều cơ bản của bóng mờ bị trì hoãn. Có nhiều biến thể, tối ưu hóa và cải tiến xung quanh vì vậy tôi khuyên bạn nên thử nghiệm một phiên bản đơn giản và sau đó thực hiện một số nghiên cứu về các kỹ thuật khác như cách tôi đã đề cập ở trên.


1
Dưới đây là hai tài nguyên mã nguồn cho TiledClustered
RichieSams
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.