แบบจำลองการสะท้อนแบบฟ็อง

แบบจำลองการสะท้อนแบบฟ็อง (Phong reflecion model) เป็นแบบจำลองการฉายแสงและการให้แสงเงา เพื่อสร้างภาพบนจุดบนพื้นผิวที่ได้ออกแบบไว้ในทางคอมพิวเตอร์กราฟิกส์สามมิติ
แบบจำลองนี้ได้รับการพัฒนาโดยบู่ย เตื่อง ฟ็อง ชาวเวียดนาม โดยได้ตีพิมพ์ในวิทยานิพนธ์ของเขาในปี 1973 ภายใต้ชื่อ "การให้แสงสำหรับรูปภาพที่สร้างจากคอมพิวเตอร์ " (Illumination for Computer-Generated Images) นอกจากนี้ บทความนี้ยังกล่าวถึงวิธีการคำนวณการประมาณค่าในช่วงสำหรับแต่ละพิกเซลจากแบบจำลองพื้นผิวโพลีกอน เทคนิคการประมาณค่าในช่วงนี้เรียกว่าการให้แสงเงาแบบฟ็อง
== ภาพรวม ==
แบบจำลองการสะท้อนแบบฟ็องช่วยให้สามารถจัดการสมการการเร็นเดอร์ทั่วไปได้ง่ายขึ้น ในการกำหนดแสงและเงาในแต่ละจุดบนผิว แบบจำลองนี้มีข้อได้เปรียบดังนี้
แบบจำลองนี้เป็นแบบจำลองสะท้อนเฉพาะที่ นั่นคือ ไม่จำเป็นต้องคำนวณการสะท้อนกลับทุติยภูมิแบบที่ทำในเรย์เทรสซิง อย่างในเรดิโอซิตี และเพื่อชดเชยการลดทอนของแสงที่สะท้อน จึงได้ได้มีการเพิ่มพจน์แสงโดยรอบ (ambient) ภายนอกไปด้วยตอนเร็นเดอร์
การสะท้อนจากพื้นผิวแบ่งออกเป็นสามประเภท: การสะท้อนแสงจัดจ้า, การสะท้อนแสงพร่า และ การสะท้อนแสงโดยรอบ (ambient reflection)
ก่อนอื่น สำหรับแต่ละแหล่งกำเนิดแสงภายในฉาก ให้ส่วนประกอบการสะท้อนแสงจัดจ้าเป็น i_s และส่วนประกอบการสะท้อนแสงพร่าเป็น i_d โดยปกติแต่ละค่าจะเป็นค่า RGB นอกจากนี้ยังให้แสงแวล้อมเป็น i_a ซึ่งอาจคำนวณเป็นผลรวมของผลกระทบจากแหล่งกำเนิดแสงทั้งหมด
ถัดมา สำหรับแต่ละวัสดุบนพื้นผิวให้กำหนดสิ่งต่อไปนี้:
k_s : ค่าสัมประสิทธิ์การสะท้อนแสงจัดจ้า
k_d : ค่าสัมประสิทธิ์การสะท้อนแสงพร่า (การสะท้อนแบบลัมแบร์ท)
k_a : ค่าสัมประสิทธิ์การสะท้อนแสงโดยรอบ
\alpha: ค่าคงที่ความมันวาวของวัสดุ
ค่าความมันวาว (shininess) \alpha ในที่นี้เป็นตัวกำหนดความสม่ำเสมอของแสงที่สะท้อนจากจุดที่หนึ่ง ๆ ยิ่งเป็นพื้นผิวที่เรียบลื่นก็จะยิ่งมีค่ามาก นอกจากนี้ค่าคงที่นี้ยิ่งมากส่วนสว่างจัดจ้าก็จะยิ่งเล็กและแรงขึ้นเท่านั้น
นอกจากนี้ เรายังอาจนิยามแสงของกลุ่มแหล่งกำเนิดแสงทั้งหมด ให้เวกเตอร์ทิศทางจากจุดบนพื้นผิววัตถุไปยังแหล่งกำเนิดแสงแต่ละแหล่งเป็น L และให้เวกเตอร์แนวฉาก ณ จุดหนึ่งบนพื้นผิวนี้เป็น N ทิศทางที่แสงสะท้อนอย่างสมบูรณ์ ณ จุดนั้นบนพื้นผิวเป็น R และ และทิศทางไปยังมุมสังเกตการณ์ (เช่นกล้องเสมือนจริง) คือ V
ความเข้มของเงาหรือแสงในแต่ละจุดบนพื้นผิว I_p สามารถคำนวณโดยใช้สมการต่อไปนี้:
I_p = k_a i_a + \sum_\mathrm{lights} (k_d (L \cdot N) i_d + k_s (R \cdot V)^{\alpha}i_s).
พจน์แสงพร่าทิศไม่ได้ขึ้นกับมุมสังเกตการณ์ V เนื่องจากพจน์แสงพร่ามีค่าเท่ากันสำหรับในทุกทิศทางจากจุดนั้น ซึ่งรวมถึงทิศทางการมองด้วย ในทางกลับกัน พจน์แสงจัดจ้าจะมีค่ามากเป็นพิเศษในกรณีที่เวกเตอร์สะท้อน R กับเวกเตอร์มุมมอง V นั้นใกล้กันมากเท่านั้น เพราะค่าโคไซน์ของมุมระหว่าง R และ V ภายในผลคูณจุดของเวกเตอร์ทั้งสองนี้ได้รับผลจากเลขยกกำลังโดย \alpha หาก \alpha มีค่ามาก การแสดงออกจะเกือบเหมือนกระจกเงา และพื้นที่ส่วนสว่างจัดจ้าที่สะท้อนออกมาจะเล็กมาก นั่นเป็นเพราะเนื่องจากหากทิศทางของมุมที่มองเบี่ยงเบนไปจากเวกเตอร์การสะท้อน ค่าโคไซน์จะน้อยกว่า 1 และจะเข้าใกล้ 0 เมื่อยกกำลังด้วยค่ามาก
เมื่อแสดงสีด้วยค่า RGB โดยทั่วไปสูตรนี้จะคำนวณแยกกันสำหรับแต่ละองค์ประกอบ R, G, B
การสะท้อนแบบฟ็องเป็นแบบจำลองเชิงประจักษ์ โดยอิงจากการสังเกตอย่างไม่เป็นทางการมากกว่าคำอธิบายทางกายภาพของปฏิสัมพันธ์ของแสง ฟ็องได้สังเกตเห็นว่าพื้นผิวที่มีความมันเงาสูงจะมีส่วนสว่างที่สว่างกว่าและความสว่างลดลงเร็ว ในขณะที่พื้นผิวที่มีความมันวาวน้อยกว่าจะมีส่วนสว่างที่สว่างกว่าและความสว่างจะค่อย ๆ ลดลง
ภาพด้านล่างนี้แสดงโดยแยกส่วนประกอบต่าง ๆ ในแบบจำลองการสะท้อนแบบฟ็องให้เห็นภาพชัด

สีของการสะท้อนแสงโดยรอบ (ambient) และ การสะท้อนแสงพร่า (diffuse) จะเหมือนกัน ให้ระวังว่า พจน์ของการสะท้อนแสงโดยรอบนั้นคงที่ตลอด ในขณะที่พจน์ของการสะท้อนแสงพร่ามีค่าแตกต่างกันไปตามมุมที่พื้นผิวหัน ส่วน การสะท้อนแสงจัดจ้า (specular) จะเป็นสีขาวและสะท้อนแสงส่วนใหญ่ที่ตกกระทบพื้นผิว แต่จะส่องสว่างแค่ในบริเวณที่แคบมาก
== ข้อดีและข้อเสีย ==
การเรนเดอร์ตามเวลาจริงโดยใช้ API กราฟิก เช่น OpenGL และ Direct3D มักจะใช้แบบจำลองการส่องสว่างเฉพาะที่เนื่องจากข้อจำกัด เช่น ความเร็วในการวาด แต่แบบจำลองการสะท้อนของฟ็องมีความเรียบง่ายในการคำนวณ และผลาญทรัพยากรน้อย จึงถูกใช้งานเป็นมาตรฐานสำหรับตัวให้แสงเงาแบบที่ให้ค่าคงท่ซึ่งทำงานด้วยซอฟต์แวร์ (CPU) หรือฮาร์ดแวร์ (GPU) (จนถึง OpenGL 2.1 และ Direct3D 9) แม้หลังจากที่ประสิทธิภาพของฮาร์ดแวร์เพิ่มสูงขึ้น และตัวให้แสงเงาแบบที่ตั้งโปรแกรมได้ถูกใช้ทั่วไปแล้ว บางครั้งแบบจำลองการสะท้อนของฟ็องก็ยังถูกนำมาใช้เนื่องจากความเบาในการคำนวณของมัน สำหรับใน OpenGL 3.1 และ Direct3D 10 นั้นได้เลิกใช้ฟังก์ชันแบบตายตัวแล้ว และใช้ตัวให้แสงเงาแบบที่ตั้งโปรแกรมได้เพื่อใช้แบบจำลองการสะท้อนแบบฟ็อง
อย่างไรก็ตาม เนื่องจากเป็นแบบจำลองการประมาณที่เรียบง่ายและหยาบมาก จึงไม่สามารถจำลองปรากฏการณ์โกลบอลอิลลูมิเนชัน ที่เกิดจากแสงสะท้อนกระจายที่ซับซ้อนและแสงโดยรอบ เช่น การกระเจิงใต้พื้นผิวและการบดบังแสงโดยรอบ
== การประมาณค่าในช่วงแบบฟ็อง ==
นอกจากแบบจำลองการสะท้อนซึ่งคำนวณสีที่จุดต่าง ๆ บนพื้นผิวแล้ว ฟ็องยังได้พัฒนาวิธีการประมาณค่าในช่วงสำหรับการคำนวณสีแต่ละพิกเซลในโพลีกอน แบบจำลองการสะท้อนและการประมาณค่าในช่วงในลักษณะนี้บางครั้งรวมกันด้วยคำว่า การให้แสงเงาแบบฟ็อง
== อ้างอิง ==
คอมพิวเตอร์กราฟิกส์สามมิติ