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 / wavelength
mộ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ử! :)