840 likes | 1.4k Views
คอมพิวเตอร์กราฟิกส์ใช้ OpenGL (Computer Graphics using OpenGL). บทที่ 10 แสง และการจัดแสง ( Light & Lighting ). นอกจากออปเจ็กต์ที่แสดงเป็นสีบนจอภาพแล้ว ยังมีแสงที่แสดงบนจอภาพเพื่อให้ออปเจ็กต์นั้นสะท้อนหรือดูดซับแสงเหล่านี้ไว้ เช่น มหาสมุทรที่ให้สีสดและสว่างในเวลากลางวันมากกว่าในเวลากลางคืน
E N D
คอมพิวเตอร์กราฟิกส์ใช้ OpenGL(Computer Graphics using OpenGL)
บทที่ 10แสง และการจัดแสง(Light & Lighting)
นอกจากออปเจ็กต์ที่แสดงเป็นสีบนจอภาพแล้ว ยังมีแสงที่แสดงบนจอภาพเพื่อให้ออปเจ็กต์นั้นสะท้อนหรือดูดซับแสงเหล่านี้ไว้ เช่น มหาสมุทรที่ให้สีสดและสว่างในเวลากลางวันมากกว่าในเวลากลางคืน ในความเป็นจริง เราไม่สามารถเห็นออปเจ็กต์เป็น 3 มิติได้ ถ้าไม่มีแสงเข้าช่วย ดังนั้นแสงจึงมีความสำคัญในการแสดงภาพ 3 มิติ แสง และการจัดแสง
แสง และการจัดแสง รูปทรงกลม ก) ใช้แสดงช่วยในการแสดงผล ข) ไม่ใช้แสงช่วยในการแสดงผล
เมื่อมองที่ผิวของออปเจ็กต์ทั่วไป การรับสีของดวงตาขึ้นอยู๋กับการกระจายของพลังงานที่เข้ามา และกระตุ้นเซลล์รูปกรวยในดวงตาคน แสงเหล่านั้นมาจากแหล่งกำเนิดแสง หรือการรวมตัวกันของแหล่งกำเนิดแสงหลายแหล่ง บ้างก็มาจากการดูดซับ บ้างก็มาจากการสะท้อนจากพื้นผิวอื่น ความแตกต่างของพื้นผิวอาจทำให้คุณสมบัติแตกต่างกันไป บ้างก็สว่างจ้าและมีการสะท้อนที่มีทิศทางแน่นอน บ้างก็กระจายไปทุกทิศทางในลักษณะที่เท่าเทียมกัน แสง
แสงประกอบด้วยองค์ประกอบของสีแดง, สีเขียว และสีน้ำเงิน ดังนั้นสีของแหล่งกำเนิดแสงมีคุณสมบัติในเรื่องของปริมาณของแสงสีแดง, แสงสีเขียว และแสงสีน้ำเงินที่แพร่กระจายออกมา รวมทั้งพื้นผิวของวัสดุ (material) ก็มีคุณสมบัติเฉพาะของส่วนประกอบของแสงสีแดง, แสงสีเขียว และแสงสีน้ำเงินที่สะท้อนเข้ามาในทิศทางต่าง ๆ สมการสำหรับการส่องแสงใน OpenGL เป็นเพียงค่าโดยประมาณ ถ้าคุณต้องการความแม่นยำสูงต้องคำนวณรายละเอียดเพิ่มเติม แสง
โมเดลการส่องแสงของ OpenGL แสงมาจากหลายแหล่งกำเนิดที่อาจจะปิดหรือเปิดก็ได้ บ้างก็มาจากทิศทางหรือตำแหน่งโดยเฉพาะ บ้างก็กระจายมาจากที่อื่น เช่น เมื่อเราเปิดดวงไฟในห้อง แสงส่วนมากมาจากดวงไฟ แต่บางส่วนสะท้อนมาจากผนัง แสงที่มาจากรอบด้านนี้ (เรียกว่า ambient) สมมุติว่ากระจายมาโดยบอกไม่ได้ถึงทิศทางต้นกำเนิด แต่แสงเหล่านี้จะหายไปเมื่อปิดแหล่งกำเนิดแสง บนจอภาพอาจจะมีแสงกระจายเข้ามาแต่ไม่ทราบแหล่งที่แน่ชัดอาจเป็นเพราะกระจายมาหลายครั้งหลายหนจะไม่สามารถบอกแหล่งกำเนิดได้ แสง
ในโมเดลของ OpenGL แหล่งกำเนิดแสงจะมีผลเฉพาะเมื่อพื้นผิวมีการดูดซับ หรือสะท้อนแสง เท่านั้น แต่ละพื้นผิวอาจจะประกอบด้วยวัสดุที่แตกต่างกันทำให้มีคุณสมบัติที่ต่างกัน วัสดุเหล่านั้นอาจจะเปล่งแสงออกมาเอง หรืออาจจะกระจายแสงที่เข้ามาออกไปทุกทิศทาง หรืออาจจะสะท้อนบางส่วนออกไปเหมือนกระจก หรือพื้นผิวที่เรียบ ในโมเดลการส่องแสงของ OpenGL แบ่งองค์ประกอบเป็น 4 ส่วนคือ แสงเปล่ง (Emissive), แสงโดยรอบ (Ambient), แสงแพร่ (Defuse) และแสงกล้า (Specular) แสง
มีหลายโมเดลทางกายภาพที่กำหนดปฏิกริยาของแสงที่กระทำกับวัสดุ โมเดลเหล่านี้มีความซับซ้อนสำหรับกราฟิกแบบเรียลไทม์ โมเดลที่นิยมนำมาใช้งานคือโมเดล Phong ซึ่งเป็นโมเดลกำหนดการส่องแสงโดยประมาณที่คำนวณได้ง่ายและมีประโยชน์ในคอมพิวเตอร์กราฟิก OpenGL ใช้โมเดล Phong เข้ามาช่วยคำนวณในการให้แสงและเงา โมเดลนี้ยังรวมมากับฮาร์ดแวร์บนการ์ดแสดงผลอีกด้วย โมเดล Phong ได้กำหนดการกระจายของแสงเพื่อให้เกิดการปรับแสงเป็นจุดไว้ 4 ประเภทคือ การสะท้อนจากแสงแพร่ (Defuse reflection), การสะท้อนจากแสงกล้า (Specular reflection), การสะท้อนจากแสงโดยรอบ (Ambient reflection) และแสงเปล่ง (Emmissive) แสง
ในโลกความเป็นจริง แหล่งกำเนิดแสงเป็นพื้นที่อนันต์ และเห็นได้บ่อยครั้งบนจอภาพ บนพื้นผิวอาจจะมีทั้งแสงเปล่ง หรือแสงสะท้อนที่มากระทบวัสดุได้ ในโมเดล Phong เราสามารถเพิ่มแสงเปล่งซึ่งไม่ได้รับผลกระทบจากแสงที่ส่องเข้ามา และสามารถช่วยให้โมเดลเห็นแหล่งกำเนิดแสง หรือความสว่างของออปเจ็กต์ได้ การกระจายของแสงเปล่งจากพื้นผิวไม่ได้นำมาคำนวณการจัดแสง ดังนั้นพื้นผิวที่เปล่งแสงจะปรากฎเช่นเดียวกับแหล่งกำเนิดแสงอื่น หรือวัสดุอื่น แสงเปล่งจะไม่มีผลกระทบกับตำแหน่งของการมอง แสงเปล่ง (Emissive)
แสงโดยรอบไม่ได้มาจากทิศทางที่แน่นอน ถึงแม้จะมีแหล่งกำเนิด แต่ลำแสงมาโดยรอบห้องหรือจอภาพจนไม่มีทิศทางที่แน่นอน ความสว่างที่เกิดจากแสงโดยรอบนี้มีความสว่างทุกพื้นผิว และทุกทิศทาง เหมือนกับว่าในห้องนั้นเราเห็นออปเจ็กต์ที่ได้รับแสงหลายแสงที่แผ่กระจายออกมา แสงโดยรอบนี้มีบางส่วนที่ดูดซับ และบางส่วนที่สะท้อน รูปต่อไปแสดงออปเจ็กต์ที่ได้รับแสงโดยรอบ แสงโดยรอบ (Ambient)
แสงโดยรอบ (Ambient) แสงโดยรอบที่กระทำกับออปเจ็กต์
แสงแพร่มาจากทิศทางที่แน่นอน แต่สะท้อนออกจากพื้นผิวออปเจ็กต์ แสงแพร่ที่กระทบพื้นผิวก็มีทั้งส่วนที่ดูดซับ และส่วนที่สะท้อนออกไป การสะท้อนจะมีทุกทิศทาง ถึงแม้ว่าจะมีการสะท้อนแสงออกมา พื้นผิวของออปเจ็กต์ยังคงสว่างอยู่ ถ้าแสงนั้นพุ่งตรงที่พื้นผิวมากกว่าถ้าแสงส่องทำมุมกับพื้นผิว ตัวอย่างที่ดีของแหล่งกำเนิดแสงแพร่ก็คือแสงจากหลอดนีออน หรือลำแสงจากพระอาทิตย์ขอบหน้าต่างเวลากลางวัน รูปต่อไปเป็นออปเจ็กต์ที่สว่างอันเนื่องมาจากแสงแพร่ แสงแพร่ (Defuse)
แสงแพร่ (Defuse) แสงแพร่ที่กระทำกับออปเจ็กต์
แสงกล้ามีทิศทางที่แน่นอน ถึงแม้จะมีทั้งการดูดซับและการสะท้อน แต่การสะท้อนของแสงกล้านอกจากจะมีทิศทางที่แน่นอนแล้ว ยังมีความเข้มของแสงที่ชัดเจน แสงกล้าคุณภาพสูงทำให้เกิดความสว่างเป็นจุดที่พื้นผิวของออปเจ็กต์ แสงจากสปอตไลต์และแสงอาทิตย์เป็นตัวอย่างของแสงกล้า รูปต่อไปแสดงออปเจ็กต์ได้รับแสงจากแหล่งแสงกล้า แสงกล้า (Specular)
แสงกล้า (Specular) แสงกล้าที่กระทำกับออปเจ็กต์
แสงกล้า (Specular) ก) มีเฉพาะแสงโดยรอบ ข) มีเฉพาะแสงแพร่ ค) มีเฉพาะแสงกล้า ง) มีแสงทั้งสามประเภท
เราจะไม่สามารถมองเห็นออปเจ็กต์ใด ๆ ได้เลยถ้าปราศจากแสง แสงมีอิทธิพลต่องานศิลปะในงานด้านต่าง ๆ ตั้งแต่ ขนาด มิติ สีสัน อุณหภูมิ ความชัดเจน รายละเอียด เพราะสรรพสิ่งต่าง ๆ ที่เรามองเห็นล้วนอยู่ภายใต้อิทธิพลจากตัวแปรของแสง เช่น ตำแหน่งแสง อุณหภูมิแสง ความสว่าง ประเภทของแสง เป็นต้น เราสามารถกำหนดเงื่อนไขตัวแปรเหล่านี้ได้ด้วย การจัดแสง (lighting) ซึ่งเป็นศิลปะที่มีความละเอียด และอาศัยประสบการณ์จากการสังเกต และจินตนาการของศิลปิน หรือผู้ชม แหล่งกำเนิดแสง
แสงที่ส่องกระทบออปเจ็กต์ทำให้เรามองเห็นออปเจ็กต์ แสงเกิดจากแหล่งกำเนิดแสง (Light source) ช่วยให้เอฟเฟ็กต์ในการจัดแสงกับออปเจ็กต์ เราสามารถจำลองแหล่งกำเนิดแสงที่มีรูปทรงและคุณสมบัติที่หลากหลายได้ เราอาจจะต้องการสร้างออปเจ็กต์ที่เป็นได้ทั้งแหล่งกำเนิดแสงและตัวสะท้อนแสง ยกตัวอย่างเช่น ลูกกลมพลาสติกที่ล้อมรอบหลอดไฟจะทำหน้าที่ทั้งเปล่งแสงและสะท้อนแสงจากผิวของลูกกลมนั้น เป็นต้น แสงจากแหล่งกำเนิดแสง เช่น ดวงอาทิตย์ หรือหลอดไฟ แล้วมีปฏิสัมพันธ์ร่วมกับพื้นผิวของออปเจ็กต์ ทำให้ออปเจ็กต์แสดงคุณสมบัติที่พื้นผิวออกมา รวมทั้งการปรากฏตัวของเงาซึ่งเป็นพื้นที่ของช่องว่างที่ปราศจากแสง แหล่งกำเนิดแสง
ในการจัดแสง เราอาจแบ่งลักษณะของแสงออกได้เป็น 5 ประเภทคือ แสงปฐมภูมิ(Primary light) เป็นลำแสงที่สว่างที่สุด และมักเป็นแสงที่ส่องจากแหล่งกำเนิดแสง เช่น ดวงอาทิตย์ หรือหลอดไฟที่ให้แสงจ้าเป็นรัศมีทุกทิศทาง ทำให้ออปเจ็กต์ที่อยู่ภายใต้อิทธิพลของแสงประเภทนี้ปรากฏเงาอย่างชัดเจน แสงเสริม(Fill light) เป็นแสงที่มีกำลังน้อยไม่ค่อยกระด้าง มักเป็นแสงที่เกิดจากการสะท้อน เช่น แสงจากโคมไฟที่ส่องขึ้นบนเพดานห้องแล้วสะท้อนลงมาสู่พื้น ทำให้ห้องสว่างนุ่มนวล ถ้าใช้กับการถ่ายแบบมักมีวัตถุประสงค์เพื่อลบเงาเข้มที่เกิดจากแสงปฐมภูมิเพื่อทำให้พื้นผิวของออปเจ็กต์แลดูนุ่มนวลขึ้น แหล่งกำเนิดแสง
การแสงหลัง(Back light) เป็นการจัแสงให้ส่องจาก้านหลังออปเจ็กต์ โดยกล้องจะวางจะวางอยู่หน้าออปเจ็กต์ ทำให้ภาพออปเจ็กต์ปรากฏเป็ฯเงาดำของรูปร่างออปเจ็กต์นั้น หรือที่เรียกว่า ภาพโครงทึบ (Silhouette) เช่นเยวกับภาพหนังตะลุง แสงฉาย(Projector light) เป็นแสงที่เกิดจากการฉายไปยังออปเจ็กต์โปร่งแสงทำให้เกิดสีสันรูปร่างของออปเจ็กต์ที่แสงนั้นส่องผ่านไปตกบนฉาก ตัวอย่างเช่น แสงอาทิตย์ที่ส่องผ่านกระจกแก้วสีที่หน้าต่างไปกระทบลงบนพื้นภายในอาคาร หรือภาพที่เกิดจากเครื่องโปรเจ๊กเตอร์ แสงส่องเฉียง(Grazed light) เมื่อแหล่งกำเนิดแสงอยู่ใกล้กับออปเจ็กต์มาก จะทำให้ออปเจ็กต์แสงระดับที่ต่างกนของพื้นผิวออกมา แสงประเภทนี้มักเกิดกับพื้นผิวของออปเจ็กต์ที่มีความสาก หรือหยาบ หากแหล่งกำเนิดแสงทำมุมกับพื้นผิวไม่เกิน 45 จะปรากฏเงาบนตัวผิวออปเจ็กต์ แหล่งกำเนิดแสง
แหล่งกำเนิดแสงมี 2 ประเภทคือ แสงรอบทิศ หรือแสงออมนิ (Omni light) และแสงสปอตไลต์ (Spotlight)ออกมา รวมทั้งการปรากฏตัวของเงาซึ่งเป็นพื้นที่ของช่องว่างที่ปราศจากแสง แสงรอบทิศ หรือแสงออมนิ (Omni light) เป็นแหล่งกำเนิดแสงที่ส่องออกมารอบตัวเองมีลักษณะเป็นดวง หรือจุด เช่น ดวงอาทิตย์ ดวงดาว หลอดไฟ หรือแสงเทียน เป็นต้น แสงรอบทิศนี้จะมีอิทธิพลต่อออปเจ็กต์ต่าง ๆ ที่อยู่รอบแหล่งกำเนิดแสงนั้น โดยด้านของออปเจ็กต์ที่หันเข้าหาแหล่งกำเนิดแสงจะสว่างที่สุด ในขณะที่ด้านตรงข้ามจะมืดที่สุด แหล่งกำเนิดแสง
สำหรับภาพคอมพิวเตอร์กราฟิก พบว่าแสงรอบทิศนี้จะไม่ทำให้เกิดเงาที่ชัดเจนมากนักเมื่อเทียบกับแสงสปอตไลต์ในความสว่างที่เท่ากัน วัตถุประสงค์ของแสงรอบทิศนี้จึงนำมาใช้เป็นแสงเสริมประเภทหนึ่ง ซึ่งเราสามารถลบเงาที่เกิดขึ้นบนตัวออปเจ็กต์ได้ดี โดยเฉพาะเมื่อติดตั้งแสงรอบทิศไว้ในระยะไกล ๆ จะช่วยลดความกร้านของผิวออปเจ็กต์ได้อย่างดี ตัวอย่างของแสงรอบทิศก็คือแสงจากดวงอาทิตย์ แสงจากดวงจันทร์ และแสงเทียม เช่น แสงหลอดทังสะเตน แสงหลอฟลูออเรสเซนต์ หรือแสงหลอดไฟสี เป็นต้น แหล่งกำเนิดแสง
แสงสปอตไลต์(Spotlight) เป็นแสงที่ส่องออกมาเป็นลำเพื่อเน้นความสำคัญของออปเจ็กต์ที่ถูกส่อง แสงประเภทนี้จะมีความเข้มกว่าแสงประเภทอื่นเพื่อให้ออปเจ็กต์ที่ถูกส่องเป็นออปเจ็กต์หลัก และไม่ไปรบกวนออปเจ็กต์อื่นที่อยู่ในฉาก องค์ประกอบของแสงสปอตไลต์จะมีลักษณะที่คล้ายคลึงกับแสงรอบทิศ คือมีตำแหน่งในที่ว่าง 3 มิติ รวมทั้งมีความเกี่ยวข้องกับส่วนจำเพาะ HLS สิ่งที่เป็นลักษณะพิเศษของแสงสปอตไลต์ก็คือการฉายแสงออกมาเป็นลำโดยสามารถกำหนดความเข้มของแสงได้ ทำให้มี จุดเข้ม(Hotspot) ซึ่งเป็นส่วนที่มีความสว่างมากที่สุดของไฟสปอตไลต์ แหล่งกำเนิดแสง
สีของออปเจ็กต์ที่ปรากฏในจุดเข้มจะมีความสดใสและมีการตัดกันมาก รอบ ๆ จุดเข้มเป็นแสงที่มีกำลังอ่อนให้ความเข้มของแสงลดลง การใช้แสงสปอตไลต์ในงานคอมพิวเตอร์กราฟิกยังทำให้นักออกแบบสร้างเงาให้เกิดขึ้นกับออปเจ็กต์ได้อย่างงดงาม ในขณะที่แสงรอบทิศให้แต่ความสว่างโดยทั่วไปเท่านั้น แหล่งกำเนิดแสง
มีรูทีนมากมายใน OpenGL ให้คุณเลือกใช้เพื่อกำหนดแหล่งกำเนิดแสง, เลือกสัมประสิทธิ์การสะท้อนของพื้นผิว และเลือกค่าสำหรับพารามิเตอร์อื่น ๆ ในโมเดลการส่องสว่างพื้นฐาน เรายังสามารถจำลองความโปร่งใส และแสดงการเรนเดอร์พื้นผิวของออปเจ็กต์ได้อีกด้วย การกำหนดแสงใน OpenGL
ใน OpenGL สามารถใช้แหล่งกำเนิดแสงได้มากถึง 8 แหล่ง รวมทั้งสามารถกำหนดคุณสมบัติได้หลากหลาย เช่น ตำแหน่ง, ประเภท, สี, ความเข้มแสง และเอฟเฟ็กต์ของสปอตไลต์ให้แต่ละแหล่งกำเนิดแสงได้ เรากำหนดค่าให้แหล่งกำเนิดแสงด้วยฟังก์ชัน glLight* (lightName, lightProperty, propertyValue); รหัสนำหน้า i หรือ f นำมาใช้กับชื่อฟังก์ชัน ขึ้นอยู่กับประภทข้อมูล (i สำหรับจำนวนเต็ม และ f สำหรับจำนวนทศนิยม) สำหรับข้อมูลที่เป็นเวกเตอร์ จะใช้รหัส v เพิ่มเข้าไป ฟังก์ชันแหล่งกำหนดแสง
พารามิเตอร์ propertyValue เป็นพอยเตอร์ไปยังอาร์เรย์ แต่ละแหล่งกำเนิดแสงอ้างอิงด้วยตัวชี้เฉพาะ พารามิเตอร์ lightName ถูกกำหนดด้วยสัญลักษณ์เฉพาะ GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, …, GL_LIGHT7 ถึงแม้ว่าในบางครั้งจะใช้แหล่งกำเนิดแสงมากกว่า 8 แหล่งก็ตาม พารามิเตอร์ lightProperty ต้องกำหนดด้วยค่าสัญลักษณ์ของคุณสมบัติหนึ่งในสิบของ OpenGL ค่าของพารามิเตอร์จะเป็นGL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION และ GL_QUADRATIC_ATTENUATION ฟังก์ชันแหล่งกำหนดแสง
หลังจากกำหนดทุกคุณสมบัติให้กับแหล่งกำเนิดแสงแล้ว เราเปิดใช้ฟังก์ชันด้วยคำสั่ง glEnable (lightName); กระตุ้นรูทีนการจัดแสงของ OpenGL ด้วยคำสั่ง glEnable (GL_LIGHTING); หลังจากนั้นพื้นผิวออปเจ็กต์จะถูกเรนเดอร์โดยการคำนวณการใช้แสงที่รวมการกระจายจากแหล่งกำเนิดแต่ละแหล่งที่เปิดใช้งานอยู่ ฟังก์ชันแหล่งกำหนดแสง
ฟังก์ชันแหล่งกำหนดแสงฟังก์ชันแหล่งกำหนดแสง ตาราง 10-1 ค่าดีฟอลต์ของพารามิเตอร์ lightProperty ในฟังก์ชัน gllight*()
ค่าสัญลักษณ์ของคุณสมบัติใน OpenGL ในการกำหนดตำแหน่งแหล่งกำเนิดแสงคือ GL_POSITIONในพารามิเตอร์ lightProperty จริง ๆ แล้วสัญลักษณ์นี้ใช้ในการกำหนดคุณสมบัติแหล่งกำเนิดแสง 2 คุณสมบัติในเวลาเดียวกันคือตำแหน่งแหล่งกำเนิดแสง และประเภทแหล่งกำเนิดแสง มีการแบ่งแหล่งกำเนิดแสงใน OpenGL เป็น 2 กลุ่มเพื่อให้จอสว่าง แหล่งกำเนิดแสงที่เป็นจุดจะอยู่ใกล้ออปเจ็กต์ที่ต้องการให้สว่าง หรือใช้เมื่อแหล่งกำเนิดอยู่ระยะอนันต์จากจอภาพ และกลุ่มนี้มีความเป็นอิสระของตำแหน่งที่เรากำหนดแหล่งกำเนิดแสง การกำหนดตำแหน่งและประเภทของแหล่งกำเนิดแสง
สำหรับแหล่งกำเนิดที่อยู่ใกล้ แสงจะเปล่งออกมาในทุกทิศทาง และตำแหน่งของแหล่งกำเนิดจะรวมอยู่ในการคำนวณการใช้แสง แต่แสงที่เปล่งจากแหล่งกำเนิดที่อยู่ไกล ๆ จะกระจายเพียงทิศทางเดียว และทิศทางนี้ถูกประยุกต์ใช้กับทุกพื้นผิวบนจอภาพ ซึ่งเป็นอิสระในการกำหนดตำแหน่งของแหล่งกำเนิดแสง ทิศทางของแสงที่กำหนดเป็นแสงจากระยะไกลจะถูกคำนวณเป็นทิศทางจากตำแหน่งที่กำหนดของแหล่งกำเนิดแสงไปยังจุดกำเนิด การกำหนดตำแหน่งและประเภทของแหล่งกำเนิดแสง
ค่าเวกเตอร์ที่เป็นค่าทศนิยม 4 ค่าถูกนำมาใช้เพื่อกำหนดทั้งประเภทของแสง และค่าโคออร์ดิเนตสำหรับตำแหน่งแสง ค่า 3 ตัวแรกเวกเตอร์นี้ให้ค่าตำแหน่งโคออร์ดิเนตทางกายภาพ ค่าที่ 4 ใช้เพื่อกำหนดประเภทแหล่งกำเนิด ถ้าเรากำหนดค่าเป็น 0.0 ให้กับค่าที่ 4 ของตำแหน่งเวกเตอร์ จะเป็นแสงที่อยู่ไกลมาก ๆ (ใน OpenGL จะเป็นแสงแบบ directional) หลังจากนั้นตำแหน่งของแหล่งกำเนิดแสงจะใช้เพียงเพื่อกำหนดทิศทางของแสง นอกนั้นแสงจะเป็นแสงจากแหล่งใกล้ ๆ (ใน OpenGL จะเป็นแสงแบบ positional) การกำหนดตำแหน่งและประเภทของแหล่งกำเนิดแสง
ตำแหน่งแสงจะนำไปใช้ในรูทีนจัดแสงเพื่อกำหนดทิศทางของแสงไปยังแต่ละออปเจ็กต์บนจอภาพ ในตัวอย่างต่อไปนี้ light1 ถูกกำหนดเป็นแสงระยะใกล้ที่ตำแหน่ง (2.0, 0.0, 3.0) ในขณะที่ light2 เป็นแสงจากระยะไกลที่แสงเปล่งในทิศทาง –y GLfloat light1PosType [] = {2.0, 0.0, 3.0, 1.0}; GLfloat light2PosType [] = {0.0, 1.0, 0.0, 0.0}; glLightfv (GL_LIGHT1, GL_POSITION, light1PosType); glEnable (GL_LIGHT1); glLightfv (GL_LIGHT2, GL_POSITION, light2PosType); glEnable (GL_LIGHT2); การกำหนดตำแหน่งและประเภทของแหล่งกำเนิดแสง
ถ้าเราไม่ได้กำหนดตำแหน่งและประเภทของแหล่งกำเนิดแสง ค่าดีฟอลต์คือ (0.0, 0.0, 1.0, 0.0) ซึ่งบอกว่าเป็นแสงจากระยะไกลที่มีทิศทางของแสงในทิศทาง –z ตำแหน่งของแหล่งกำเนิดแสงถูกรวมอยู่ในรายละเอียดของออปเจ็กต์บนจอภาพ และถูกแปลงไปยังโคออร์ดิเนตการมองตามตำแหน่งของออปเจ็กต์โดยเมทริกซ์การแปลงทางเรขาคณิตและเมทริกซ์การแปลงการมอง ดังนั้นถ้าเราต้องการเก็บแหล่งกำเนิดแสงให้อยู่คงที่สัมพันธ์กับออปเจ็กต์บนจอภาพ เราต้องกำหนดตำแหน่งของออปเจ็กต์หลังจากการกำหนดการแปลงทางเรขาคณิตและการแปลงการมองในโปรแกรม แต่ถ้าเราต้องการให้แหล่งกำเนิดแสงย้ายไปตามที่การย้ายของจุดมอง ให้เรากำหนดตำแหน่งก่อนการแปลงการมอง และเราสามารถย้าย หรือหมุนแหล่งกำเนิดแสงไปรอบ ๆ จอภาพได้ การกำหนดตำแหน่งและประเภทของแหล่งกำเนิดแสง
แสงใน OpenGL จะต่างกับแสงจริงตรงที่ แสง OpenGL มีคุณสมบัติสี RGBA แตกต่างกัน 3 คุณสมบัติ ตามกฎที่ตั้งไว้ สี 3 สีจากแหล่งกำเนิดมีออปชันสำหรับเอฟเฟ็กต์ของแสงที่หลากหลายบนจอภาพ เรากำหนดสีเหล่านี้โดยใช้สัญลักษณ์ของคุณสมบัติ GL_AMBIENT, GL_DIFFUSE และ GL_SPECULAR แต่ละคุณสมบัติเหล่านี้ถูกกำหนดขึ้นด้วยชุดของค่าทศนิยม 4 ค่า องค์ประกอบของแต่ละสีกำหนดในรูปแบบ (R, G, B, A) ซึ่งค่า A เป็นค่าแอลฟ่าที่นำมาใช้เพื่อให้สีกลืนกันโดยจะต้องใช้ฟังก์ชัน glEnable(GL_BLEND) ร่วมกับฟังก์ชัน glBlendFunc() การกำหนดสีของแหล่งกำเนิดแสง
จากสัญลักษณ์ของคุณสมบัติพอจะเดาได้ว่า แสงแรกเป็นแสงที่รวมเป็นแสงแบ็คกราวนด์ (Ambient) บนจอภาพ อีกแสงหนึ่งใช้เพื่อคำนวณแสงที่แพร่ (Deffuse) ออกมา แสงสุดท้ายใช้เพื่อคำนวณเอฟเฟ็กต์ของแสงกล้า (Specular) ที่มีต่อพื้นผิวของออปเจ็กต์ เพื่อความสมจริงเราจะใช้แสงจากแหล่งกำเนิดเดียว แต่เราสามารถใช้แหล่งกำเนิดแสง 3 สีใน OpenGL เพื่อสร้างเอฟเฟ็กต์จากแสง ใน ตัวอย่างโค้ดข้างล่างนี้ เรากำหนดแสงโดยรอบให้กับแหล่งกำเนิดระยะใกล้ที่ชื่อ GL_LIGHT3 เป็นสีดำ และเรากำหนดแสงแพร่และแสงกล้าเป็นสีขาว การกำหนดสีของแหล่งกำเนิดแสง
GLfloat blackColor [] = {0.0, 0.0, 0.0, 1.0}; GLfloat whiteColor [] = {1.0, 1.0, 1.0, 1.0}; glLightfv (GL_LIGHT3, GL_AMBIENT, blackColor); glLightfv (GL_LIGHT3, GL_DIFFUSE, whiteColor); glLightfv (GL_LIGHT3, GL_SPECULAR, whiteColor); ค่าสีดีฟอลต์สำหรับแหล่งกำเนิด 0 คือสีดำสำหรับแสงโดยรอบ และสีขาวสำหรับแสงแพร่และแสงกล้า ส่วนแหล่งกำเนิดแสงอื่นทั้งหมดค่าสีดีฟอลต์ของทั้งแสงโดยรอบ, แสงแพร่ และแสงกล้าจะเป็นสีดำ การกำหนดสีของแหล่งกำเนิดแสง
เราสามารถประยุกต์ใช้การลดความเข้มของแสงจากแสงที่เปล่งจากแหล่งกำเนิดแสงระยะใกล้ของ OpenGL รูทีนการจัดแสงจะมีสูตรคำนวณเพื่อลดความเข้มแสง ค่าคงที่ที่เป็นคุณสมบัติของ OpenGL มี 3 ค่าในการลดความเข้มของแสงคือ GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION ซึ่งเป็นค่าที่สัมพันธ์กับสัมประสิทธิ์ในสูตรการคำนวณ เราสามารถใช้ค่าจำนวนเต็มบวก และค่าทศนิยมบวกเพื่อกำหนดเป็นค่าสัมประสิทธิ์ของการลดความเข้ม การกำหนดสัมประสิทธิ์การลดความเข้มของแหล่งกำเนิดแสง
เช่น เราสามารถกำหนดค่าสัมประสิทธิ์การลดความเข้มแสงเป็น glLightf (GL_LIGHT6, GL_CONSTANT_ATTENUATION, 1.5); glLightf (GL_LIGHT6, GL_LINEAR_ATTENUATION, 0.75); glLightf (GL_LIGHT6, GL_QUADRATIC_ATTENUATION, 0.4); เมื่อเรากำหนดค่าสัมประสิทธิ์การลดความเข้มเพียงครั้งเดียว ฟังก์ชันในการลดความเข้มจะใช้กับแสงทั้ง 3 (แสงโดยรอบ, แสงแพร่ และแสงกล้า) ค่าดีฟอลต์จะไม่มีการลดค่าความเข้ม ถึงแม้ว่าการลดความเข้มแสงจะสามารถสร้างภาพได้สมจริงก็ตาม แต่จะใช้เวลาในการคำนวณมากกว่า การกำหนดสัมประสิทธิ์การลดความเข้มของแหล่งกำเนิดแสง
ex10_01.cpp ใช้ฟังก์ชันเพื่อจัดแสงให้กับรูปทรงกลม การกำหนดสัมประสิทธิ์การลดความเข้มของแหล่งกำเนิดแสง
ex10_02.cpp ใช้เมาส์ปุ่มเพื่อเลื่อนตำแหน่งของแสงไปรอบ ๆ รูปโดนัท การกำหนดสัมประสิทธิ์การลดความเข้มของแหล่งกำเนิดแสง
สำหรับแสงจากระยะใกล้ (ไม่คิดที่ระยะอนันต์) เราสามารถกำหนดเอฟเฟ็กต์ของแสงสปอต์ไลต์ได้ ข้อจำกัดนี้เป็นของแสงที่ปล่อยออกจากแหล่งกำเนิดแสงพื้นที่รูปกรวย เรากำหนดพื้นที่รูปกรวยด้วยเวกเตอร์กำหนดทิศทางตามแกนของกรวยและมุมการแพร่ l จากแกนของกรวยแสดงดังรูปต่อไปนอกจากนี้ เรายังสามารถกำหนดค่า angular-attenuation exponent al สำหรับแหล่งกำเนิดที่กำหนดปริมาณความเข้มแสงที่ลดลงเมื่อเรายายออกจากศูนย์กลางของกรวยไปยังผิวของกรวย ตามทิศทางภายในกรวยของแสง การกำหนดแสงสปอตไลต์
ค่า angular attenuation factor คือ cosalโดย cos เป็นการคำนวณ dot product ของเวกเตอร์แกนของกรวย กับเวกเตอร์จากแหล่งกำเนิดไปยังตำแหน่งออปเจ็กต์ เราคำนวณค่าแต่ละส่วนของแสงโดยรอบ, แสงแพร่ และแสงกล้าที่มุม โดยการคูณองค์ประกอบความเข้มแสงด้วยค่าแฟคเตอร์นี้ ถ้า > lออปเจ็กต์นั้นอยู่นอกกรวยแหล่งกำเนิดแสง และออปเจ็กต์ไม่ได้สว่างเพราะแหล่งกำเนิดแสงนี้ สำหรับลำแสงที่อยู่ภายในกรวย เรายังสามารถลดทอนค่าความเข้มในการปล่อยแสงอีกด้วย การกำหนดแสงสปอตไลต์
การกำหนดแสงสปอตไลต์ การเปล่งแสงรูปกรวยวงกลมจากแหล่งกำเนิดแสงของ OpenGL
มีคุณสมบัติใน OpenGL 3 คุณสมบัติที่เป็นเอฟเฟ็กต์ในการใช้แสงสปอต์ไลต์คือ GL_SPOT_DIRECTION, GL_SPOT_CUTOFF และ GL_SPOT_EXPONENT เราสามารถกำหนดทิศทางของแสงเป็นเวกเตอร์ของโคออร์ดิเนตทางกายภาพได้ด้วยเลขจำนวนเต็มหรือเลขทศนิยมก็ได้ มุมของกรวย l เป็นค่ามุมที่กำหนดเป็นเลขจำนวนเต็ม หรือเลขทศนิยมก็ได้ มุมนี้อาจจะเป็น 180 หรือค่าที่อยู่ระหว่าง 0ถึง 90 เมื่อมุมของกรวยกำหนดเป็น 180 ลำแสงของแหล่งกำเนิดแสงมีทุกทิศทาง (360) การกำหนดแสงสปอตไลต์
เรากำหนดเลขชี้กำลังสำหรับการลดความเข้มแสงเป็นเลขจำนวนเต็ม หรือเลขทศนิยมในช่วงตั้งแต่ 0 ถึง 128 คำสั่งต่อไปนี้เป็นเอฟเฟ็กต์สำหรับแหล่งกำเนิดแสง 3 ดังนั้นแกนของกรวยอยู่ในทิศทาง +x มุมของกรวย l คือ 30 และเลขชี้กำลังของการลดทอนคือ 2.5 GLfloat dirVector [] = {1.0, 0.0, 0.0}; Gllightfv (GL_LIGHT3, GL_SPOT_DIRECTION, dirVector); Gllightf (GL_LIGHT3, GL_SPOT_CUTOFF, 30.0); Gllightf (GL_LIGHT3, GL_SPOT_EXPONENT, 2.5); การกำหนดแสงสปอตไลต์
ถ้าเราไม่ต้องการกำหนดทิศทางของแหล่งกำเนิดแสง ค่าดีฟอลต์ของทิศทางคือขนานกับแกน –z นั่นคือที่ (0.0, 0.0, -1.0) ค่าดีฟอลต์ของกรวยคือ 180 ค่าดีฟอลต์ของเลขชี้กำลังการลดความเข้มแสงคือ 0 ดังนั้นค่าดีฟอลต์คือแหล่งกำเนิดเป็นจุดที่ปล่อยแสงรอบทิศทางที่ไม่มีมุมการลดความเข้มแสง การกำหนดแสงสปอตไลต์
ex10_03.cpp แสดงการใช้แสงสปอต์ไลต์และคุณสมบัติต่าง ๆ การกำหนดแสงสปอตไลต์
มีพารามิเตอร์ในการจัดแสงของ OpenGL หลายพารามิเตอร์ที่อยู่ในระดับโกลบอล ค่าเหล่านี้ใช้ในการควบคุมวิธีการที่ใช้ในการคำนวณเพื่อการจัดแสง ค่าโกลบอลพารามิเตอร์ถูกกำหนดได้ด้วยคำสั่ง glLightModel*(paramName, paramValue); เราเพิ่มรหัสนำหน้า i หรือ f ขึ้นกับประเภทข้อมูลของค่าพารามิเตอร์ และสำหรับข้อมูลเวกเตอร์ สามารถเพิ่มรหัสนำหน้า v ได้ พารามิเตอร์ paramName เป็นสัญลักษณ์กำหนดคุณสมบัติทางโกลบอล พารามิเตอร์ paramValue กำหนดเป็นค่าเดี่ยว หรือค่าเป็นชุดก็ได้ การกำหนดโมเดลของแสง