Tôi không biết bạn đang lập trình cái gì, nhưng đây là cách tôi xử lý nó trong XNA:
- Trên lệnh vẽ, một
List<Light>
đối tượng được tạo / xóa.
- Trong vòng lặp vẽ ngói, mỗi ô được kiểm tra để xem liệu nó có bất kỳ Đèn nào được liên kết với nó không. Nếu có, các
Light
đối tượng được gắn vào List<Light>
.
- Các gạch được vẽ lên của riêng mình
RenderTarget2D
.
- Sau vòng lặp gạch, danh sách
Light
s được lặp đi lặp lại và tự vẽ RenderTarget2D
bằng cách sử dụng một kết cấu mà tôi đã tạo như sau:
(Lưu ý: Tôi đã sử dụng các giá trị R, G và B ở đây nhưng có lẽ bạn nên sử dụng kênh alpha trong kết cấu thực tế.)
- Sử dụng trình đổ bóng tùy chỉnh, tôi hiển thị bề mặt ô vuông cho màn hình và chuyển vào bề mặt chiếu sáng dưới dạng tham số được lấy mẫu cho giá trị "bóng tối" ở mỗi pixel.
Bây giờ, có một vài điều cần lưu ý:
Về điểm 4:
Tôi thực sự có hai shader tùy chỉnh, một để vẽ đèn cho mục tiêu kết xuất ánh sáng (bước 4) và một để vẽ mục tiêu kết xuất gạch lên màn hình bằng cách sử dụng mục tiêu kết xuất ánh sáng (bước 5).
Trình tạo bóng được sử dụng tại điểm 4 cho phép tôi thêm (giá trị mà tôi gọi) vào giá trị "độ sáng". Giá trị này là một giá trị float
được nhân với mỗi pixel trong kết cấu trước khi nó được thêm vào mục tiêu kết xuất để tôi có thể làm cho đèn sáng hơn hoặc tối hơn.
Tại thời điểm này, tôi cũng tính đến giá trị "tỷ lệ" của ánh sáng, điều đó có nghĩa là tôi có thể có đèn lớn hoặc nhỏ chỉ bằng một kết cấu.
Về điểm 5:
Hãy nghĩ về mục tiêu kết xuất ánh sáng về cơ bản là có một giá trị cho mỗi pixel từ 0 (đen) đến 1 (trắng). Shader về cơ bản nhân giá trị đó với giá trị RGB cho một pixel trong mục tiêu kết xuất ô để tạo hình ảnh được vẽ cuối cùng.
Tôi cũng có thêm một số mã ở đây nơi tôi chuyển vào (cho trình đổ bóng) một giá trị được sử dụng làm màu lớp phủ ngày / đêm. Điều này cũng được nhân lên thành các giá trị RGB và được bao gồm trong các tính toán mục tiêu kết xuất ánh sáng.
Bây giờ, điều này sẽ không cho phép bạn làm những việc như chặn ánh sáng đi xung quanh các vật thể và không có gì, nhưng, ít nhất là cho mục đích của tôi, nó đơn giản và hoạt động tốt.
Tôi đã viết bài viết chi tiết hơn trên blog ở đây và ở đây có thể giúp bạn. Tôi không có thời gian ngay bây giờ, nhưng nếu bạn muốn tôi có thể đi vào chi tiết hơn ở đây trên gamedev.
Ồ, và đây là một cái nhìn về nó trong trình chỉnh sửa bản đồ của tôi: