พื้นฐานทางกายภาพของสีของคราบน้ำมันนั้นเป็นสีรุ้งและเกี่ยวข้องกับวงแหวนของนิวตันด้วย โดยเฉพาะความหนาของชั้นน้ำมันนั้นขึ้นกับความยาวคลื่นของแสง เนื่องจากแสงสะท้อนจากพื้นผิวด้านบนและด้านล่างของน้ำมันในช่วงความยาวคลื่นใดก็ตามในบางมุมการสะท้อนทั้งสองจะออกจากเฟสและยกเลิกซึ่งกันและกัน ในอีกมุมหนึ่งการสะท้อนกลับจะอยู่ในเฟสและรวมเข้าด้วยกัน สิ่งนี้เกิดขึ้นในมุมที่แตกต่างกันสำหรับทุกความยาวคลื่นดังนั้นการส่องสว่างน้ำมันด้วยแสงสีขาวทำให้เกิดสีเหล่านั้นทั้งหมด หากคุณส่องแสงด้วยความถี่เดียว (เช่นแสงเลเซอร์) คุณจะเห็นเฉพาะชุดของแสงและแหวนมืด
หากคุณไม่สนใจการหักเหของแสงในชั้นน้ำมันเพียงแค่คำนวณเรขาคณิตของสถานการณ์คุณจะพบว่าความสว่างของแสงสะท้อนสำหรับความยาวคลื่นใดก็ตามควรแตกต่างกันเช่น
sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5
ในทางทฤษฎีแล้วสิ่งนี้ควรถูกรวมเข้ากับความยาวคลื่นทั้งหมด แต่ในทางปฏิบัติคุณอาจทำได้แค่สีแดงสีเขียวและสีน้ำเงินสมมุติว่า 700, 550 และ 400 นาโนเมตรตามลำดับ การเปลี่ยนความหนาของน้ำมันจะเปลี่ยนรัศมีของวงแหวนสี ฉันอาจจะตัด2.0 * pi * oilThickness / wavelength
เป็นค่า RGB เดียวที่ให้แก่ shader เป็นค่าสม่ำเสมอ คุณสามารถคูณมันด้วยพื้นผิวเพื่อจำลองความหนาของน้ำมันที่แตกต่างกันได้หากต้องการ - นั่นอาจเป็นสิ่งที่ให้พื้นผิวที่น่าสนใจที่สุดในภาพด้านบน
สิ่งนี้จะสร้างค่าสี RGB ซึ่งคุณสามารถนำไปคูณกับ BRDF ของคุณได้ dot(L, H)
ปัจจัยที่จะนำมาใช้สำหรับจุดไฟ / ทิศทางและคุณสามารถใช้แทนdot(N, V)
ในการมีสำหรับการใช้นี้เพื่อแผนที่สะท้อนสภาพแวดล้อมได้เป็นอย่างดี
ข้อจำกัดความรับผิดชอบ: ฉันยังไม่ได้ลองสิ่งนี้ใน shader เพียงแค่วาดไดอะแกรมและโน้มน้าวตัวเองว่า "ควรจะทำงาน" ... ดังนั้นให้ฉันรู้ผลลัพธ์ถ้าคุณลองทำดู! :)