# แบบจำลองการสะท้อนแบบฟ็อง
แบบจำลองการสะท้อนแบบฟ็อง (Phong reflecion model) เป็นแบบจำลองการฉายแสงและการให้แสงเงา เพื่อสร้างภาพบนจุดบนพื้นผิวที่ได้ออกแบบไว้ในทางคอมพิวเตอร์กราฟิกส์สามมิติ

แบบจำลองนี้ได้รับการพัฒนาโดยบู่ย เตื่อง ฟ็อง ชาวเวียดนาม โดยได้ตีพิมพ์ในวิทยานิพนธ์ของเขาในปี 1973 ภายใต้ชื่อ "การให้แสงสำหรับรูปภาพที่สร้างจากคอมพิวเตอร์ " (Illumination for Computer-Generated Images)Bui Tuong Phong, Illumination for computer generated pictures, Communications of ACM 18 (1975), no. 6, 311–317.University of Utah School of Computing, http://www.cs.utah.edu/school/history/#phong-ref นอกจากนี้ บทความนี้ยังกล่าวถึงวิธีการคำนวณการประมาณค่าในช่วงสำหรับแต่ละพิกเซลจากแบบจำลองพื้นผิวโพลีกอน เทคนิคการประมาณค่าในช่วงนี้เรียกว่าการให้แสงเงาแบบฟ็อง

 ภาพรวม 
แบบจำลองการสะท้อนแบบฟ็องช่วยให้สามารถจัดการสมการการเร็นเดอร์ทั่วไปได้ง่ายขึ้น ในการกำหนดแสงและเงาในแต่ละจุดบนผิว แบบจำลองนี้มีข้อได้เปรียบดังนี้

 แบบจำลองนี้เป็นแบบจำลองสะท้อนเฉพาะที่ นั่นคือ ไม่จำเป็นต้องคำนวณการสะท้อนกลับทุติยภูมิแบบที่ทำในเรย์เทรสซิง อย่างในเรดิโอซิตี และเพื่อชดเชยการลดทอนของแสงที่สะท้อน จึงได้ได้มีการเพิ่มพจน์แสงโดยรอบ (ambient) ภายนอกไปด้วยตอนเร็นเดอร์
 การสะท้อนจากพื้นผิวแบ่งออกเป็นสามประเภท: การสะท้อนแสงจัดจ้า, การสะท้อนแสงพร่า และ การสะท้อนแสงโดยรอบ (ambient reflection)

ก่อนอื่น สำหรับแต่ละแหล่งกำเนิดแสงภายในฉาก ให้ส่วนประกอบการสะท้อนแสงจัดจ้าเป็น  และส่วนประกอบการสะท้อนแสงพร่าเป็น  โดยปกติแต่ละค่าจะเป็นค่า RGB นอกจากนี้ยังให้แสงแวล้อมเป็น  ซึ่งอาจคำนวณเป็นผลรวมของผลกระทบจากแหล่งกำเนิดแสงทั้งหมด

ถัดมา สำหรับแต่ละวัสดุบนพื้นผิวให้กำหนดสิ่งต่อไปนี้:

  : ค่าสัมประสิทธิ์การสะท้อนแสงจัดจ้า
  : ค่าสัมประสิทธิ์การสะท้อนแสงพร่า (การสะท้อนแบบลัมแบร์ท)
  : ค่าสัมประสิทธิ์การสะท้อนแสงโดยรอบ
 : ค่าคงที่ความมันวาวของวัสดุ 

ค่าความมันวาว (shininess)  ในที่นี้เป็นตัวกำหนดความสม่ำเสมอของแสงที่สะท้อนจากจุดที่หนึ่ง ๆ ยิ่งเป็นพื้นผิวที่เรียบลื่นก็จะยิ่งมีค่ามาก นอกจากนี้ค่าคงที่นี้ยิ่งมากส่วนสว่างจัดจ้าก็จะยิ่งเล็กและแรงขึ้นเท่านั้น

นอกจากนี้ เรายังอาจนิยามแสงของกลุ่มแหล่งกำเนิดแสงทั้งหมด ให้เวกเตอร์ทิศทางจากจุดบนพื้นผิววัตถุไปยังแหล่งกำเนิดแสงแต่ละแหล่งเป็น  และให้เวกเตอร์แนวฉาก ณ จุดหนึ่งบนพื้นผิวนี้เป็น  ทิศทางที่แสงสะท้อนอย่างสมบูรณ์ ณ จุดนั้นบนพื้นผิวเป็น  และ และทิศทางไปยังมุมสังเกตการณ์ (เช่น กล้องเสมือนจริง) คือ 

ความเข้มของเงาหรือแสงในแต่ละจุดบนพื้นผิว  สามารถคำนวณโดยใช้สมการต่อไปนี้:

 

พจน์แสงพร่าทิศไม่ได้ขึ้นกับมุมสังเกตการณ์  เนื่องจากพจน์แสงพร่ามีค่าเท่ากันสำหรับในทุกทิศทางจากจุดนั้น ซึ่งรวมถึงทิศทางการมองด้วย ในทางกลับกัน พจน์แสงจัดจ้าจะมีค่ามากเป็นพิเศษในกรณีที่เวกเตอร์สะท้อน  กับเวกเตอร์มุมมอง  นั้นใกล้กันมากเท่านั้น เพราะค่าโคไซน์ของมุมระหว่าง  และ  ภายในผลคูณจุดของเวกเตอร์ทั้งสองนี้ได้รับผลจากเลขยกกำลังโดย  หาก  มีค่ามาก การแสดงออกจะเกือบเหมือนกระจกเงา และพื้นที่ส่วนสว่างจัดจ้าที่สะท้อนออกมาจะเล็กมาก นั่นเป็นเพราะเนื่องจากหากทิศทางของมุมที่มองเบี่ยงเบนไปจากเวกเตอร์การสะท้อน ค่าโคไซน์จะน้อยกว่า 1 และจะเข้าใกล้ 0 เมื่อยกกำลังด้วยค่ามาก

เมื่อแสดงสีด้วยค่า RGB โดยทั่วไปสูตรนี้จะคำนวณแยกกันสำหรับแต่ละองค์ประกอบ R, G, B

การสะท้อนแบบฟ็องเป็นแบบจำลองเชิงประจักษ์ โดยอิงจากการสังเกตอย่างไม่เป็นทางการมากกว่าคำอธิบายทางกายภาพของปฏิสัมพันธ์ของแสง ฟ็องได้สังเกตเห็นว่าพื้นผิวที่มีความมันเงาสูงจะมีส่วนสว่างที่สว่างกว่าและความสว่างลดลงเร็ว ในขณะที่พื้นผิวที่มีความมันวาวน้อยกว่าจะมีส่วนสว่างที่สว่างกว่าและความสว่างจะค่อย ๆ ลดลง

ภาพด้านล่างนี้แสดงโดยแยกส่วนประกอบต่าง ๆ ในแบบจำลองการสะท้อนแบบฟ็องให้เห็นภาพชัด

link=ファイル:Phong_components_version_4.png|alt=Phong方程式を説明した絵図|655x655px|แผนภาพแสดงสมการพงษ์

สีของ การสะท้อนแสงโดยรอบ (ambient) และ การสะท้อนแสงพร่า (diffuse) จะเหมือนกัน ให้ระวังว่า พจน์ของการสะท้อนแสงโดยรอบนั้นคงที่ตลอด ในขณะที่พจน์ของการสะท้อนแสงพร่ามีค่าแตกต่างกันไปตามมุมที่พื้นผิวหัน ส่วน การสะท้อนแสงจัดจ้า (specular) จะเป็นสีขาวและสะท้อนแสงส่วนใหญ่ที่ตกกระทบพื้นผิว แต่จะส่องสว่างแค่ในบริเวณที่แคบมาก

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

อย่างไรก็ตาม เนื่องจากเป็นแบบจำลองการประมาณที่เรียบง่ายและหยาบมาก จึงไม่สามารถจำลองปรากฏการณ์โกลบอลอิลลูมิเนชัน ที่เกิดจากแสงสะท้อนกระจายที่ซับซ้อนและแสงโดยรอบ เช่น การกระเจิงใต้พื้นผิวและการบดบังแสงโดยรอบ

 การประมาณค่าในช่วงแบบฟ็อง 

นอกจากแบบจำลองการสะท้อนซึ่งคำนวณสีที่จุดต่าง ๆ บนพื้นผิวแล้ว ฟ็องยังได้พัฒนาวิธีการประมาณค่าในช่วงสำหรับการคำนวณสีแต่ละพิกเซลในโพลีกอน แบบจำลองการสะท้อนและการประมาณค่าในช่วงในลักษณะนี้บางครั้งรวมกันด้วยคำว่า การให้แสงเงาแบบฟ็อง