Làm thế nào để đạt được ánh sáng thay đổi màu giữa chừng?


11

Tôi nghĩ đến việc tạo ra nguồn sáng và một số cửa sổ màu. Bây giờ, các cửa sổ là bán trong suốt. Làm thế nào tôi có thể làm cho nó để khi ánh sáng (giả sử, màu trắng tinh khiết) chiếu vào kính và tiếp tục xuyên qua nó, nhưng thay đổi màu thành màu giống như màu thủy tinh truyền qua?

Tôi biết hiệu ứng được mô tả ở đây có thể được làm giả bằng cách sử dụng đèn khu vực ở phía "màu" của cửa sổ, nhưng nếu tôi chỉ muốn có một điểm sáng trắng thì sao?


Thay vì thay đổi màu của ánh sáng, bạn có thể thay đổi màu cơ bản của các vật được chiếu sáng ở phía bên kia của kính không? Có lẽ đó sẽ làm những mẹo?
HumanCatfood 7/2/13

Cửa sổ trong suốt được hiển thị dưới dạng thông qua thứ hai, trình tạo bóng của nó chỉ đơn giản là sửa đổi cân bằng màu của từng đầu ra pixel. Điều này sẽ không làm việc?
Patrick Hughes

Dường như với tôi rằng điều này tương tự như vấn đề về bóng tối; nếu bạn có một thuật toán đẹp cho bóng đổ bởi các đối tượng bán trong suốt (tôi không biết điều đó có thực tế không), thì bạn chỉ cần chạy nó cho ba kênh màu song song.
Kevin Reid

Câu trả lời:


14

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.


Cảm ơn cho bài viết dài! Tôi hiện đang điều tra xem liệu tôi sẽ thực hiện chuyển tiếp hay trì hoãn kết xuất cho dự án hiện tại mà tôi đang thực hiện. Tại thời điểm này, nó có thể sẽ được hoãn lại. Bạn sẽ làm thế nào khi cửa sổ có nhiều màu (giả sử, kính màu trong nhà thờ)?
manabreak

@manabreak - Tôi sẽ sử dụng tiện ích mở rộng bản đồ bóng vì nó sẽ cung cấp mức độ trung thực tốt nhất cho trường hợp đó. Tôi sẽ chỉnh sửa bài để giải thích điều này.
OriginalDaemon

Được rồi, cảm ơn! Bài đăng này thực sự làm cho ngày của tôi, có lẽ tôi chưa bao giờ thấy quá nhiều nỗ lực vào bất kỳ bài đăng nào.
manabreak
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.