Có một số lượng lớn các cách để làm điều này. Những thứ này sẽ yêu cầu sử dụng một shader và tôi cho rằng bạn đang thực hiện chiếu sáng theo pixel. Sau đây là một số gợi ý, tuy nhiên việc tìm ra kỹ thuật phù hợp với bạn có thể cần nhiều nghiên cứu hơn.
Nhanh chóng và hèn hạ
Bạn có thể chỉ định các hộp giới hạn xác định các khu vực bên trong. Nếu ánh sáng ở bên ngoài các hộp, nhưng hình học (không có trong bóng tối) nằm trong hộp, thì ánh sáng phải bị ảnh hưởng khi đi qua cửa sổ (điều này cũng đúng nếu hình học nằm ngoài hộp và ánh sáng là bên trong). Vấn đề duy nhất ở đây là làm thế nào để truyền thông tin hộp cho shader và trạng thái ảnh hưởng đến ánh sáng.
Một tùy chọn khác là chỉ định các cửa sổ là các đối tượng nằm trên các mặt phẳng. Thử nghiệm đầu tiên để xem hình học và ánh sáng có ở hai phía đối diện của mặt phẳng không và sau đó nếu cách giữa chúng giao nhau với mặt phẳng tại một điểm trong ranh giới của cửa sổ. Điều này sẽ chính xác hơn phương pháp đầu tiên và sẽ dễ dàng hơn khi có các cửa sổ vào cùng một nội thất với các màu kính khác nhau.
Tiếp tục chi tiết hơn với biểu diễn hình học của các cửa sổ và bạn sẽ nhận được kết quả chính xác hơn, nhưng tính toán cũng sẽ nặng hơn.
Những kỹ thuật này sẽ hoạt động hợp lý tốt cho một game bắn súng hành lang, nhưng không tốt cho một thế giới năng động hoặc mở vì rất nhiều điều chỉnh có thể sẽ được yêu cầu để làm cho nó trông ổn mà không cần quá nhiều tạo tác. Ngoài ra, những kỹ thuật này có thể nhanh chóng trở nên hơi dữ dội, do đó, việc chuyển sang đường ống che bóng bị trì hoãn sẽ được khuyến khích.
Bản đồ bóng
Một lựa chọn khác là làm một cái gì đó tương tự như ánh xạ bóng.
Trong ánh xạ bóng, bạn tạo ra một số hình ảnh bitmap của thế giới bị ảnh hưởng bởi ánh sáng. Mỗi pixel, trong khi vẫn là một màu, thực sự là khoảng cách của mảnh hình học không trong suốt gần nhất (bạn sử dụng bốn byte cho 1 float thay vì 4 màu). Nếu bạn tính khoảng cách từ ánh sáng đến một mảnh hình học và nó xa hơn giá trị tương ứng trong bản đồ bóng thì mảnh hình học của bạn nằm trong bóng tối (bạn thường sử dụng tia giữa hình học và ánh sáng để lập chỉ mục cho bản đồ).
Nếu bạn áp dụng ý tưởng này cho vấn đề của mình thì điều bạn sẽ làm là lưu trữ bản đồ khoảng cách từ ánh sáng của mảnh hình học trong suốt gần nhất, và sau đó tạo bản đồ thứ hai về màu sắc của ánh sáng sau khi đi qua hình học đó ( chỉ đơn giản là màu của hình học nếu ánh sáng là màu trắng).
Nếu mảnh hình học của bạn ở xa hơn khoảng cách trong bản đồ này, thì hãy sử dụng màu bản đồ, nếu không thì hãy sử dụng màu sáng ban đầu.
Chức năng tính toán màu cho từng pixel trong bản đồ nên đại khái là; lightColor - đảo ngượcWindowColor. Vì vậy, đối với một ánh sáng trắng tinh khiết và một cửa sổ màu đỏ tinh khiết không hấp thụ quang phổ màu đỏ nào chúng ta có được; (255,255,255) - (0,255,255) = (255,0,0). Vì vậy, màu sắc của ánh sáng ở phía bên kia là màu đỏ tinh khiết. Đối với một vật thể trong suốt phức tạp hơn, chẳng hạn như cửa sổ kính màu, bạn có thể muốn có một tra cứu kết cấu để có được màu vật liệu.
Nếu bạn đang tìm kiếm một cái gì đó tương tự thì hãy xem Bản đồ bóng phản chiếu .
Kỹ thuật này cung cấp một lượng lớn độ trung thực và có thể là tốt nhất nếu bạn muốn sử dụng hình học trong suốt phức tạp như cửa sổ kính màu.
Cố gắng giải pháp chung
Gần đây nó đã trở nên phổ biến để mã hóa thông tin chiếu sáng trong một đại diện của voxel (chúng không chỉ dành cho hình học). Động cơ crytek mới nhất sử dụng loại chiến lược này để chiếu sáng tiên tiến ( khối lượng truyền ánh sáng ).
Đây là ý tưởng chung:
- Tạo một bản đồ các hình khối cách đều nhau bao gồm cảnh của bạn (xem xét sử dụng các đường cong z-order ).
- Tìm cách lưu trữ thông tin chiếu sáng sự cố cho mỗi voxel (biểu diễn điều hòa hình cầu rất hữu ích ở đây).
- Tìm voxel chứa ánh sáng và biểu thị ánh sáng đó trong voxel.
- Truyền ánh sáng ra bên ngoài qua các voxels liền kề (giống như nước minecraft)
- Tính toán làm thế nào hình học trong mỗi voxel sẽ ảnh hưởng đến ánh sáng đi qua nó (hấp thụ, phản xạ, truyền đi)
- lặp lại cho đến khi ánh sáng mờ dần
Có nhiều cách để xây dựng thông tin voxel này, nhưng danh sách trên đưa ra một ý tưởng chung. Ví dụ; bạn có thể bắt đầu bằng cách tạo bản đồ / khối lượng bóng và sau đó chiếu thông tin đó vào bản đồ voxel để bạn có thể nhanh chóng tạo bản đồ chiếu sáng trực tiếp. Sau đó, bạn bắt đầu việc nhân giống từ các voxels dọc theo rìa của khu vực bị ảnh hưởng. Hãy lưu ý rằng, trong trường hợp này, bạn sẽ muốn bỏ qua liệu hình học có trong suốt hay không khi tạo bản đồ / khối lượng bóng.
Trong lần cuối cùng của trình kết xuất bị hoãn, khi tính toán độ chiếu sáng của một điểm hình học, bạn chỉ cần sử dụng vị trí hình học để lập chỉ mục bản đồ voxel của bạn để tìm ra ánh sáng tới như thế nào tại điểm đó trong không gian. Sau đó, bạn có thể xây dựng một bản đồ màn hình bên cpu chiếu sáng sự cố, hoặc có thể làm điều này với cuda.