พยายามที่จะเข้าใจแสงบน OpenGL วิธีการจำลองแสงดวงอาทิตย์ที่เหมือนจริง?


13

ฉันไม่รู้ว่าฉันกำลังทำอะไรผิดพลาดหรือไม่ทำอะไรเลย แต่ฉันต้องการจำลองแสงของดวงอาทิตย์เช่นในวันแดดจ้า

เมื่อวัตถุหันหน้าไปทางแสงไฟส่องสว่างและไม่มีปัญหาเกิดขึ้น ถ้าฉันเดินไปรอบ ๆ วัตถุแล้วมองกลับมันมืด มันไม่มืดมากเพราะฉันใช้GL_AMBIENTแต่มันมืดเกินไปสำหรับวันที่แดดจัด ถ้าฉันเพิ่มมูลค่ามันจะไม่ดูดีไปกว่านี้เพราะด้านของวัตถุที่หันหน้าไปทางแสงจะสว่างเกินไป

และยังมีอีกปัญหาที่น่ารำคาญกับแสงโดยรอบเมื่อมองที่ด้านหลังของวัตถุฉันไม่เห็นรูปร่างใด ๆ เพียงสีธรรมดา ยากที่จะอธิบายนี่คือภาพบางส่วน:

หน้าวัตถุ: http://i.stack.imgur.com/YW53X.png
กลับด้านวัตถุ: http://i.stack.imgur.com/Qufha.png

อย่างที่คุณเห็นได้ง่ายด้านหน้าด้านหน้าดูดีคุณสามารถเห็นรูปร่างของสิ่งแดงนั้น ด้านหลังมันธรรมดาคุณไม่สามารถเห็นรูปร่างเดียวกัน

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

ฉันจะมีผลเหมือนกัน (หรือคล้ายกัน) ใน OpenGL ได้อย่างไร

ปัจจุบันแสงของฉันถูกกำหนดเช่นนี้:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

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

คำตอบ:


11

เมื่อแสงโดยรอบวัตถุของคุณปรากฏสว่างเกินไปเนื่องจากแสงกระจายถูกเพิ่มเข้ากับแสงโดยรอบและค่าแสงกระจายเป็นค่าเริ่มต้นที่ 1.0 สิ่งนี้เพิ่มได้มากถึง 1.5 และทุกอย่างที่สูงกว่า 1.0 ถูกบีบ ตั้งค่าแสงกระจายเป็น 0.5:

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

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

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

ลองพิจารณาการเพิ่มไฮไลท์ที่เจาะจงให้กับแอปพลิเคชันของคุณ มันจะทำให้วัตถุมันวาว

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

นอกจากนี้คุณยังสามารถระบุแสงและวัสดุสีแยกกันโดยเฉพาะอย่างยิ่งหากค่าเริ่มต้นไม่เหมาะสำหรับคุณ


ดังนั้นจึงไม่มีวิธีที่ง่ายและตรงไปตรงมาเพื่อทำสิ่งที่ฉันต้องการใน OpengGL ... แย่มาก บางทีฉันอาจลองเพิ่มแหล่งกำเนิดแสงอื่น แต่ฉันจะระบุความเข้มของแสงได้อย่างไร
rfgamaral

GL_SPECULARและGL_SHININESSดูเหมือนจะไม่ผลิตผลกระทบใด ๆ แต่ ... ฉันไม่ได้เปลี่ยนแปลงglMaterialfvไปglMaterialiเพราะมันไม่ได้รวบรวม และลองใช้ค่าที่มากขึ้นเช่น 128 ดูเหมือนกันสำหรับฉัน ... บางทีปัญหาอาจเกิดจากรุ่นที่โหลดของฉัน (obj / mtl) จะต้องดู
rfgamaral

1
@Nazgulled เพิ่งตรวจสอบว่าค่าเริ่มต้นของไลท์ 0 เป็น 1.0 แต่ค่าเริ่มต้นของวัสดุจะเป็น 0.0 ดังนั้นเปลี่ยน glLightfv (GL_LIGHT0, GL_SPECULAR, specLight0); ถึง glMaterialfv (GL_FRONT, GL_SPECULAR, specLight0); นอกจากนี้ยังเป็นการดีที่จะตั้งค่า glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); หรือ specular อาจคำนวณอย่างไม่ถูกต้องเมื่อกล้องหมุน
msell

1
@Nazgulled สำหรับแสงรองตั้งรอบและ specular เป็นศูนย์และค่าเล็ก ๆ เช่น 0.2 สำหรับการกระจาย คุณยังสามารถตั้งค่าสภาพแวดล้อมของแสงทั้งหมดให้เป็นศูนย์และใช้สภาพแวดล้อมแบบโกลบอลด้วย GL_LIGHT_MODEL_AMBIENT แทน
msell

2

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

สิ่งที่คุณควรทำคือเขียน shader ที่คำนวณแสงต่อพิกเซล แต่การไปถึงจุดที่คุณจะใช้เวลาสักครู่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.