ในการเริ่มต้นฉันขอแนะนำให้อ่านการนำเสนอ Siggraph ของ Naty Hoffman ซึ่งครอบคลุมถึงฟิสิกส์ของการเรนเดอร์ ที่กล่าวว่าฉันจะพยายามตอบคำถามเฉพาะของคุณยืมภาพจากงานนำเสนอของเขา
เมื่อมองไปที่อนุภาคแสงเดี่ยว ๆ ที่กระทบจุดหนึ่งบนพื้นผิวของวัสดุมันสามารถทำได้ 2 อย่างคือการสะท้อนหรือการหักเห แสงที่สะท้อนจะสะท้อนออกจากพื้นผิวคล้ายกับกระจก แสงที่หักเหจะกระดอนไปรอบ ๆ ด้านในของวัสดุและอาจออกจากวัสดุในระยะที่ห่างจากจุดที่มันเข้ามา ในที่สุดทุกครั้งที่แสงมีปฏิกิริยากับโมเลกุลของวัสดุมันจะสูญเสียพลังงานบางส่วน ถ้ามันสูญเสียพลังงานไปมากพอเราถือว่ามันดูดกลืนได้เต็มที่
เพื่ออ้างอิง Naty "แสงประกอบด้วยคลื่นแม่เหล็กไฟฟ้าดังนั้นคุณสมบัติทางแสงของสารจึงเชื่อมโยงอย่างใกล้ชิดกับคุณสมบัติทางไฟฟ้า" นี่คือเหตุผลที่เราจัดกลุ่มวัสดุเป็นโลหะหรือไม่ใช่โลหะ
โลหะที่ไม่ใช่จะแสดงทั้งการสะท้อนและการหักเห
วัสดุโลหะมีเพียงการสะท้อน แสงหักเหทั้งหมดจะถูกดูดซับ
มันจะมีราคาแพงในการพยายามทำแบบจำลองการโต้ตอบของอนุภาคแสงกับโมเลกุลของวัสดุ เราทำการตั้งสมมติฐานและเรียบง่ายแทน
หากขนาดพิกเซลหรือพื้นที่แรเงามีขนาดใหญ่เมื่อเทียบกับระยะทางเข้า - ออกเราสามารถสรุปได้ว่าระยะทางเป็นศูนย์ได้อย่างมีประสิทธิภาพ เพื่อความสะดวกเราได้แบ่งการตอบสนองแบบแสงเป็นสองคำที่แตกต่างกัน เราเรียกคำว่าการสะท้อนพื้นผิว "specular" และคำที่เกิดจากการหักเหการดูดกลืนการกระเจิงและการหักเหซ้ำที่เราเรียกว่า "การกระจาย"
อย่างไรก็ตามนี่เป็นข้อสันนิษฐานที่ค่อนข้างใหญ่ สำหรับวัสดุทึบแสงส่วนใหญ่สมมติฐานนี้ใช้ได้และไม่แตกต่างจากชีวิตจริงมากนัก อย่างไรก็ตามสำหรับวัสดุที่มีความโปร่งใสชนิดใด ๆ สมมติฐานจะล้มเหลว ตัวอย่างเช่นนมผิวสบู่ ฯลฯ
สีที่สังเกตได้ของวัสดุคือแสงที่ไม่ดูดซับ นี่คือการรวมกันของทั้งแสงสะท้อนเช่นเดียวกับแสงหักเหใด ๆ ที่ออกจากวัสดุ ตัวอย่างเช่นวัสดุสีเขียวบริสุทธิ์จะดูดซับแสงทั้งหมดที่ไม่ใช่สีเขียวดังนั้นแสงเดียวที่มาถึงดวงตาของเราคือแสงสีเขียว
ดังนั้นศิลปินจึงจำลองสีของวัสดุโดยให้ฟังก์ชั่นการลดทอนสำหรับวัสดุนั้นคือการดูดซับแสงของวัสดุ ในโมเดลกระจาย / specular ที่ง่ายของเราสามารถแสดงได้สองสี, สีกระจายและสี specular ก่อนที่จะมีการใช้วัสดุที่มีอยู่จริงศิลปินจะเลือกสีเหล่านี้แต่ละสีโดยพลการ อย่างไรก็ตามควรมีความชัดเจนว่าสีทั้งสองนี้ควรเกี่ยวข้องกัน นี่คือที่มาของสี albedo ตัวอย่างเช่นใน UE4 พวกเขาคำนวณสีแบบกระจายและแบบ specular ดังนี้:
DiffuseColor = AlbedoColor - AlbedoColor * Metallic;
SpecColor = lerp(0.08 * Specular.xxx, AlbedoColor, Metallic)
โดยที่ Metallic คือ 0 สำหรับอโลหะและ 1 สำหรับโลหะ พารามิเตอร์ 'Specular' ควบคุม specularity ของวัตถุ (แต่มักจะเป็นค่าคงที่ 0.5 สำหรับวัสดุ 99%)