Trì hoãn bóng - làm thế nào để kết hợp nhiều đèn?


9

Tôi đang bắt đầu với GLSL và tôi đã triển khai tính năng tạo bóng hoãn lại đơn giản, tạo ra bộ đệm G với các vị trí, quy tắc và suất phản chiếu.

Tôi cũng đã viết một shader điểm đơn giản.

Bây giờ tôi vẽ một hình cầu cho ánh sáng điểm và đầu ra đi vào một bộ đệm ánh sáng.

Vấn đề là, làm thế nào để tôi kết hợp các kết quả của bộ đệm ánh sáng khi vẽ nhiều đèn?

Ví dụ: khi tôi vẽ ánh sáng thứ hai cho bộ phát sáng bằng cách sử dụng bộ đổ bóng điểm, làm cách nào để thêm ánh sáng thứ nhất vào ánh sáng thứ hai trong bộ đệm chiếu sáng. Ý tôi là, bạn không thể đọc và ghi vào cùng một bộ đệm đầu ra?

Câu trả lời:


12

Pha trộn phụ gia, tức là glBlendFunc (GL_ONE, GL_ONE) và glEnable (GL_BLEND).


kiểm tra độ sâu có phải bị vô hiệu hóa cho điều này?
woojoo666

1
@ woojoo666 Không. Thực tế, nó nên được kích hoạt với kiểm tra độ sâu được đặt thành ít bằng nhau, để các bề mặt khớp chính xác với đường chuyền trước sẽ đi qua. Nếu kiểm tra độ sâu bị tắt, thì các bề mặt sẽ tích lũy ánh sáng không chính xác từ bất cứ thứ gì phía sau chúng. :)
Nathan Reed

hmm, có vẻ như đó chính xác là những gì đang xảy ra bật pha trộn làm cho mặt trước hòa trộn với mặt sau, mặc dù tôi vẫn bật kiểm tra độ sâu. Tôi có cần phải làm gì với mặt nạ sâu không?
woojoo666

đã thử nghiệm nhiều hơn một chút, có vẻ như là vấn đề thứ tự vẽ (vẽ mặt trước làm cho thử nghiệm độ sâu hoạt động chính xác và pha trộn chỉ xảy ra nếu các mặt được trang bị, mặt sau làm cho mọi thứ hòa trộn với nhau). Có cách nào để làm điều này mà không cần sắp xếp mọi thứ?
woojoo666

2
@ woojoo666 Aha, có vẻ như bạn đã tự mình giải quyết nó. Có, bạn phải đặt độ sâu xuống trong một đường mờ đục trước khi bạn có thể sử dụng bất kỳ loại pha trộn nào. Nó có thể là một z-preass với màu ghi bị vô hiệu hóa, hoặc một cách phổ biến khác là làm ánh sáng xung quanh / định hướng trong lần đầu tiên không có pha trộn, sau đó thêm đèn điểm / điểm trong các lần sau với pha trộn.
Nathan Reed

2

Đối với trình kết xuất bị trì hoãn của tôi, tôi tổng hợp tất cả các đèn thành một mục tiêu kết xuất ánh sáng bằng cách sử dụng thông tin từ bộ đệm g và sau đó lấy mẫu đó làm cho mục tiêu có cường độ ánh sáng trong khi tạo ra hình ảnh chụp ngược sáng cuối cùng của tôi.

Về cơ bản, tôi chạy tất cả hình học trò chơi của mình thông qua thẻ hình học của mình để xây dựng bộ đệm g. Từ đó tôi cho các bộ đệm g vào bộ đổ bóng ánh sáng của tôi. Mỗi ánh sáng được chạy qua đường chuyền bằng cách sử dụng một quad toàn màn hình. Bằng cách này, trình tạo bóng pixel của tôi có thể tính toán cường độ ánh sáng cho tất cả các bề mặt có thể nhìn thấy từ bộ đệm g và sau đó thêm chúng vào mục tiêu kết xuất ánh sáng. Bạn chỉ cần thêm cường độ ánh sáng cho mỗi ánh sáng vào bộ đệm ánh sáng nhưng đảm bảo bạn kẹp cường độ từ 0 đến 1.

Tất cả những gì bạn cần làm để xử lý các loại đèn khác nhau (điểm, đèn chiếu, song song) là làm cho ánh sáng truyền mạnh hơn bằng cách sử dụng bộ đệm liên tục để chỉ định quy trình chiếu sáng nào được thực hiện.


Vâng, và câu hỏi là - làm thế nào để bạn thêm vào mục tiêu kết xuất ánh sáng? Sử dụng pha trộn alpha như đề xuất của Nathan Reed? Bởi vì theo như tôi biết thì bạn không thể đọc và ghi vào cùng một bộ đệm đầu ra (đó là bộ đệm nhẹ trong trường hợp này).
JBeur

Rất tiếc, vâng. Tôi để việc sáp nhập đầu ra xử lý việc đó với sự pha trộn phụ gia. Khi lấy mẫu cho hình ảnh cuối cùng là khi bạn muốn kẹp giá trị với giá trị phù hợp với tôi vì cường độ ánh sáng tối đa có thể mà một bề mặt có thể nhận được. Từ đó bạn chỉ có thể mở rộng quy mô đèn của bạn khi cần thiết.
KlashnikovKid

Làm thế nào để bạn xử lý các trường hợp ánh sáng ở phía sau bức tường và không nên chiếu sáng những thứ ở phía bên kia của bức tường?
jjxtra

@PologistsoDad Đó là miền của bóng tối, đó là ... một chủ đề phức tạp hơn. :)
Nathan Reed

0

Có khả năng có một câu trả lời tốt hơn câu này, nhưng tôi biết, nếu trong shader của bạn, bạn lặp lại mã cần thiết để làm đèn thứ hai, thì bạn có thể xử lý hai đèn trên một đối tượng thay vì một. Nó đòi hỏi phải thu thập rất nhiều mã cho ánh sáng thứ hai và các đường nối hơi dư thừa, nhưng tôi biết nó hoạt động được. Tuy nhiên, tôi tin rằng, vì ai đó sẽ hy vọng chỉ ra cho bạn, có thể có một giải pháp thanh lịch hơn.


Không, điều đó không hoạt động theo cách đó. Tôi vẽ một quả cầu cho mỗi điểm sáng. Trừ khi ánh sáng điểm thứ hai nằm trong phạm vi ảnh hưởng của ánh sáng thứ nhất, ánh sáng thứ hai đơn giản sẽ không bị hút. Phương pháp của bạn sẽ hoạt động nếu tôi vẽ một quad toàn màn hình cho tất cả các đèn chiếu, tuy nhiên, đó không phải là phương pháp đúng bởi vì các quads toàn màn hình được sử dụng để làm sáng tỏ toàn cầu. Giả sử tôi có 16 đèn điểm nhỏ, điều đó sẽ buộc tôi phải đi qua chúng cho từng pixel ngay cả khi pixel đó không sáng. Và thông thường tôi sẽ nói mỗi pixel được thắp sáng bởi một hoặc hai đèn. Và nếu tôi có 100 đèn thì sao? KHÔNG
JBeurer

Lý do chính tôi đã nêu điều này, là nếu bạn chỉ sử dụng hai hoặc một vài đèn, nó có thể giúp ích. Đặc biệt, nếu bạn đang điều khiển nhiều đối tượng, sử dụng hỗn hợp có nghĩa là bạn cần vẽ lại cảnh cho mỗi ánh sáng, vì vậy nếu bạn có nhiều hình dạng, giả sử một triệu, hoặc mười triệu hoặc một tỷ, mỗi lần vẽ sẽ tốn nhiều hơn để làm . Làm điều đó trong shader gây ra vấn đề nếu bạn muốn nhiều ánh sáng, nhưng pha trộn gây ra vấn đề nếu bạn muốn nhiều hình dạng. Nếu bạn có nhiều cả hai, bạn cần tìm một khu vực giữa, nhưng thường thì bạn có một vài đèn và nhiều đồ vật trong các trò chơi.
CodeNeko

Không, bóng mờ hoãn lại không hoạt động theo cách đó. Tôi phải vẽ cảnh chỉ một lần và lưu trữ thông tin liên quan trong G-Buffer. Sau đó, một phạm vi ảnh hưởng cho mỗi ánh sáng và pha trộn nó với bộ đệm ánh sáng. Và cuối cùng kết hợp bộ đệm ánh sáng với colorbuffer tôi có được bộ đệm màu cuối cùng. Lượng tính toán ánh sáng không phụ thuộc vào độ phức tạp của cảnh. Đó là lợi thế chính của bóng mờ hoãn lại ở nơi đầu tiên.
JBeurer

Ah, điều đó có ý nghĩa hơn nhiều và sẽ tốt hơn đáng kể.
CodeNeko
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.