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:
- 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)
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.
- 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.