Làm cho dầu / nước bị ô nhiễm?


19

Bất kỳ pháp sư shader nào ngoài kia đều có ý tưởng làm thế nào để đạt được hiệu ứng nước nhờn / ô nhiễm, tương tự như sau:

dầu nhớt

Lý tưởng nhất là nước sẽ không có dầu đồng đều, mà thay vào đó, dầu có thể được tạo ra từ một số nguồn (như cống thoát ô nhiễm từ nhà máy hóa chất) và sau đó khuếch tán khắp cơ thể nước. Tôi nghĩ phần này sẽ là giữ một "bản đồ dầu" dưới dạng kết cấu 2D xác định mật độ dầu tại mỗi điểm trên mặt nước. Nó sẽ khuếch tán và di chuyển tự nhiên với vận tốc nước tại điểm đó (tôi có một mô phỏng hạt sóng cho sóng động, và tôi đã làm một cái gì đó tương tự cho bọt trên mặt nước). Tuy nhiên, tôi không chắc điều đó sẽ đúng như thế nào, vì dầu có thể không di chuyển với cùng vận tốc với nước.

Và tôi không biết làm thế nào để tạo ra tất cả những màu trippy đó :-). Suy nghĩ?


Sử dụng một kết cấu ..? Độ dốc xuyên tâm màu sắc, áp dụng một số biến dạng ..
bobobobo

@bobobobo - Hướng bạn nhìn vào nó ảnh hưởng đến màu sắc nào được hiển thị, mặc dù ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser

1
Bạn sẽ muốn áp dụng một shader dựa trên en.wikipedia.org/wiki/Thin-film_interference nhưng tôi không biết làm thế nào để viết về nó.
jzx

2
( gamedev.net/page/resource/_/t kỹ thuật / từ ) Tôi không thể chắt lọc câu trả lời vì tôi không biết chủ đề này
horatio

Câu trả lời:


25

Cơ sở vật lý của màu sắc của vết dầu là ánh kim , và cũng liên quan đến các vòng của Newton . Cụ thể, độ dày của lớp dầu theo thứ tự bước sóng ánh sáng. Vì ánh sáng phản xạ từ cả bề mặt trên và dưới của dầu, ở bất kỳ bước sóng nhất định nào, ở một số góc, hai phản xạ sẽ lệch pha nhau và triệt tiêu lẫn nhau; ở các góc khác, các phản xạ sẽ cùng pha và cộng lại với nhau. Điều này xảy ra ở các góc khác nhau cho mọi bước sóng, vì vậy chiếu sáng dầu bằng ánh sáng trắng tạo ra tất cả các màu đó. Nếu bạn chiếu sáng nó với một tần số duy nhất (ví dụ như ánh sáng laser), bạn sẽ chỉ thấy một loạt các vòng sáng và tối.

Nếu bạn bỏ qua khúc xạ trong lớp dầu, chỉ cần xử lý hình học của tình huống, bạn có thể thấy rằng độ sáng của ánh sáng phản xạ cho bất kỳ bước sóng nhất định nào sẽ khác nhau như

sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5

Về mặt lý thuyết, điều này nên được tích hợp trên tất cả các bước sóng, nhưng trong thực tế, bạn có thể chỉ cần làm điều đó cho màu đỏ, xanh lá cây và xanh lam - giả sử lần lượt là 700, 550 và 400nm. Thay đổi độ dày dầu sẽ thay đổi bán kính rõ ràng của các vòng màu. Tôi có thể sẽ bọc 2.0 * pi * oilThickness / wavelengthmột giá trị RGB duy nhất được cung cấp cho trình đổ bóng dưới dạng giá trị đồng nhất. Bạn có thể nhân nó với một kết cấu để mô phỏng độ dày khác nhau của dầu, nếu muốn - đó có lẽ là thứ mang lại hầu hết các kết cấu thú vị trong hình trên.

Điều đó tạo ra một giá trị màu RGB mà bạn có thể nhân vào BRDF của mình. Các dot(L, H)yếu tố sẽ được sử dụng cho đèn điểm / hướng, và bạn có thể thay thế dot(N, V)vào đó để áp dụng này để một sự phản ánh bản đồ môi trường là tốt.

Tuyên bố miễn trừ trách nhiệm: Tôi đã không thử điều này trong một shader, chỉ cần vẽ một số sơ đồ và tự thuyết phục bản thân rằng "nó nên hoạt động" ... vì vậy hãy cho tôi biết kết quả nếu bạn thử! :)


Công cụ mát mẻ. Lý do tại sao có các phản xạ trên bề mặt dầu trên và dưới là vì một số sóng được phản xạ trên đỉnh trong khi các sóng khác chỉ bị khúc xạ. Những sóng khúc xạ này tiến đến bề mặt bedd, nơi chúng có thể bị khúc xạ lại hoặc phản xạ.
DSilva.vinicius
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.