OpenGL เป็นเครื่องมือการเขียนโปรแกรม 3 มิติที่ทรงพลังซึ่งใช้ในการวาดฉากสามมิติที่ซับซ้อนจากสิ่งพื้นฐานทั่วไป บทความนี้จะสอนวิธีการวาดลูกบาศก์ง่ายๆ ที่คุณสามารถหมุนดูในสามมิติได้!
สำหรับโครงการนี้ คุณจะต้องมีโปรแกรมแก้ไขโค้ดและมีความรู้เกี่ยวกับการเขียนโปรแกรม C
ขั้นตอน
ส่วนที่ 1 จาก 3: การตั้งค่าเริ่มต้น
ขั้นตอนที่ 1 ติดตั้ง OpenGL เพื่อเริ่มทำตามขั้นตอนเหล่านี้เพื่อติดตั้ง OpenGL บนระบบของคุณ
หากคุณมี OpenGL รวมถึงคอมไพเลอร์ C ที่เข้ากันได้ติดตั้งอยู่ คุณสามารถข้ามขั้นตอนนี้และไปที่ขั้นตอนถัดไป
ขั้นตอนที่ 2 สร้างเอกสาร
สร้างไฟล์ใหม่ในโปรแกรมแก้ไขโค้ดที่คุณชื่นชอบและบันทึกเป็น mycube.c
ขั้นตอนที่ 3 เพิ่ม #includes
นี่คือส่วนประกอบพื้นฐานที่จำเป็นสำหรับโปรแกรมของคุณ สิ่งสำคัญคือต้องตระหนักว่ามีความต้องการที่แตกต่างกันสำหรับระบบปฏิบัติการที่แตกต่างกัน อย่าลืมรวมสิ่งเหล่านี้ไว้ด้วยเพื่อให้แน่ใจว่าโปรแกรมของคุณใช้งานได้หลากหลายและสามารถใช้งานได้กับผู้ใช้ทุกคน
// รวม #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
ขั้นตอนที่ 4 เพิ่มฟังก์ชันต้นแบบและตัวแปรส่วนกลาง
ขั้นตอนต่อไปของคุณคือการประกาศต้นแบบฟังก์ชันบางตัว
// ฟังก์ชั่นต้นแบบเป็นโมฆะ display(); เป็นโมฆะ specialKeys(); // ตัวแปรโกลบอล doublerotating_y=0; หมุนสองครั้ง _x=0;
ขั้นตอนที่ 5. ตั้งค่าฟังก์ชัน main()
int main(int argc, char* argv){ // เริ่มต้น GLUT และประมวลผลพารามิเตอร์ผู้ใช้ glutInit(&argc, argv); // ขอหน้าต่างสีจริงบัฟเฟอร์สองเท่าด้วย Z-buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
ขั้นตอนที่ 6 สร้างหน้าต่าง
ขั้นตอนต่อไปคือการ สร้างหน้าต่าง ภายในที่คุณจะวาดลูกบาศก์ ในบทช่วยสอนนี้ หน้าต่างจะเรียกว่า "Awesome Cube"
// สร้างหน้าต่าง glutCreateWindow("Awesome Cube");
ขั้นตอนที่ 7 เปิดใช้งานการทดสอบความลึก
OpenGL เป็นภาษาที่เข้มงวดซึ่งไม่ถือว่าเปิดใช้งานคุณสมบัติพิเศษใด ๆ เพื่อให้โปรแกรมของคุณแสดงผลเป็น 3 มิติได้อย่างเหมาะสมโดยใช้ Z-buffer ที่คุณดูก่อนหน้านี้ คุณต้อง เปิดใช้งานการทดสอบเชิงลึก. ในขณะที่คุณสำรวจ OpenGL ต่อไป คุณจะค้นพบคุณลักษณะมากมายที่คุณจำเป็นต้องเปิดใช้งาน รวมทั้งการจัดแสง พื้นผิว หน้าตัด และอื่นๆ อีกมากมาย
// เปิดใช้งานการทดสอบความลึกของบัฟเฟอร์ Z glEnable(GL_DEPTH_TEST);
ขั้นตอนที่ 8 เพิ่มฟังก์ชันการโทรกลับ
นี่คือฟังก์ชันการโทรกลับที่คุณเขียนต้นแบบไว้ก่อนหน้านี้ ทุกครั้งที่ผ่านลูปหลัก ฟังก์ชันเหล่านี้จะถูกเรียก ฟังก์ชันการแสดงผลจะวาดฉากใหม่โดยอิงตามการเปลี่ยนแปลงใดๆ ของตัวแปรที่เกิดขึ้นตั้งแต่การเรียกครั้งก่อน ฟังก์ชัน specialKeys ช่วยให้เราโต้ตอบกับโปรแกรมได้
// ฟังก์ชันการโทรกลับ glutDisplayFunc(display); glutSpecialFunc(ปุ่มพิเศษ);
ขั้นตอนที่ 9 เริ่ม MainLoop
การดำเนินการนี้จะเรียกคืนฟังก์ชันหลักจนกว่าคุณจะปิดโปรแกรมเพื่อให้สามารถแสดงภาพเคลื่อนไหวและการโต้ตอบกับผู้ใช้ได้
// ส่งผ่านการควบคุมไปยัง GLUT สำหรับเหตุการณ์ glutMainLoop(); // กลับไปที่ OS คืนค่า 0; }
ส่วนที่ 2 จาก 3: ฟังก์ชัน display()
ขั้นตอนที่ 1 ทำความเข้าใจวัตถุประสงค์ของฟังก์ชันนี้
งานทั้งหมดของการวาดลูกบาศก์ของคุณจะเสร็จสิ้นในฟังก์ชันนี้ แนวคิดทั่วไปเบื้องหลังลูกบาศก์ของคุณคือการวาดทั้งหกด้านแยกกันและวางไว้ในตำแหน่งที่เหมาะสม
ตามแนวคิดแล้ว แต่ละด้านจะถูกวาดโดยการกำหนดมุมทั้งสี่และปล่อยให้ OpenGL เชื่อมต่อเส้นและเติมด้วยสีที่คุณกำหนด ด้านล่างนี้เป็นขั้นตอนในการทำเช่นนี้
ขั้นตอนที่ 2. เพิ่ม glClear()
ขั้นตอนแรกที่คุณต้องทำในฟังก์ชันนี้คือ ล้างสีและบัฟเฟอร์ Z. หากไม่มีขั้นตอนเหล่านี้ ภาพวาดเก่าอาจยังคงมองเห็นได้ภายใต้ภาพวาดใหม่และวัตถุที่วาดจะไม่อยู่ในตำแหน่งที่ถูกต้องบนหน้าจอ
การแสดงเป็นโมฆะ () { // ล้างหน้าจอและ Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ขั้นตอนที่ 3 เพิ่ม glBegin() และ glEnd()
OpenGL กำหนดวัตถุเป็นการรวมกันของรูปหลายเหลี่ยมที่แตกต่างกัน ใช้ glBegin() คำสั่ง คุณวางดินสออย่างมีประสิทธิภาพที่จะวาดรูปร่าง ในการยกดินสอขึ้นและเริ่มต้นรูปร่างใหม่ คุณต้องใช้ glEnd() สั่งการ. ในบทช่วยสอนนี้ คุณจะใช้ GL_POLYGON เพื่อวาดแต่ละด้านของลูกบาศก์ แต่คุณสามารถใช้ตัวเลือกพารามิเตอร์อื่นๆ เช่น GL_LINE, GL_QUAD หรือ GL_TRIANGLE เพื่อสร้างรูปร่างอื่นๆ
- ที่นี่คุณจะเริ่มต้นด้วยด้านหน้าของคิวบ์ของคุณ ต่อมาจะเพิ่มสีสันให้ทั้ง 6 ด้าน
// ด้านหลายสี - FRONT glBegin(GL_POLYGON); // จุดยอดจะถูกเพิ่มในขั้นตอนต่อไป glEnd();
ขั้นตอนที่ 4 เพิ่ม glVertex3f()
เมื่อคุณได้ระบุว่าคุณต้องการเริ่มรูปหลายเหลี่ยมของคุณแล้ว คุณต้อง กำหนดจุดยอด ของวัตถุ glVertex มีหลายรูปแบบขึ้นอยู่กับว่าคุณต้องการทำอะไรกับวัตถุของคุณ
- อย่างแรกคือจำนวนมิติที่คุณกำลังทำงานอยู่ 3 ด้านบนใน glVertex3f บอกว่าคุณกำลังวาดในสามมิติ นอกจากนี้ยังสามารถทำงานใน 2 หรือ 4 มิติ f ด้านบนใน glVertex3f บอกว่าคุณกำลังทำงานกับตัวเลขทศนิยม คุณยังสามารถใช้ shorts, integers or doubles.
- ขอให้สังเกตว่าจุดเหล่านี้ถูกกำหนดในa ทวนเข็มนาฬิกา มารยาท. สิ่งนี้ไม่ได้สำคัญมากในขณะนี้ แต่เมื่อคุณเริ่มทำงานกับการจัดแสง พื้นผิว และการตัดมุม สิ่งนี้จะมีความสำคัญอย่างไม่น่าเชื่อ ดังนั้นจงกำหนดจุดของคุณทวนเข็มนาฬิกาให้เป็นนิสัย
- เพิ่มจุดยอดระหว่างบรรทัด glBegin() และ glEnd()
// ด้านหลายสี - FRONT glBegin(GL_POLYGON); glVertex3f(-0.5, -0.5, -0.5); // P1 glVertex3f(-0.5, 0.5, -0.5); // P2 glVertex3f(0.5, 0.5, -0.5); // P3 glVertex3f(0.5, -0.5, -0.5); // P4 glEnd();
ขั้นตอนที่ 5. เพิ่ม glColor3f()
glColor ทำงานในลักษณะเดียวกันกับ glVertex คุณสามารถกำหนดจุดเป็น shorts, integers, doubles, or floats. แต่ละสีมีค่าตั้งแต่ 0 ถึง 1 ทั้งหมด 0 ทำให้จุดสีดำและ 1 ทั้งหมดจะทำให้จุดสีขาว 3 ใน glColor3f() หมายถึงระบบสี RGB ที่ไม่มีช่องอัลฟา อัลฟาของสีกำหนดความโปร่งใส หากต้องการเปลี่ยนระดับอัลฟา ให้ใช้ glColor4f() โดยพารามิเตอร์สุดท้ายเป็นค่า 0 ถึง 1 สำหรับทึบแสงถึงโปร่งใส
- เมื่อคุณเรียก glColor3f() ทุกจุดยอดที่ดึงมาจากจุดนั้นจะเป็นสีนั้น ดังนั้น หากคุณต้องการให้จุดยอดทั้งสี่เป็นสีแดง เพียงแค่ตั้งค่าสีหนึ่งครั้งก่อนคำสั่ง glVertex3f() และจุดยอดทั้งหมดจะเป็นสีแดง
- ด้านหน้าที่กำหนดไว้ด้านล่างแสดงวิธีการกำหนดสีใหม่สำหรับแต่ละจุดยอด เมื่อคุณทำเช่นนี้ คุณจะเห็นคุณสมบัติที่น่าสนใจของสี OpenGL เนื่องจากแต่ละจุดยอดของรูปหลายเหลี่ยมมีสีของมันเอง OpenGL จะผสมสีโดยอัตโนมัติ! ขั้นตอนต่อไปจะแสดงวิธีการกำหนดจุดยอดสี่จุดที่มีสีเดียวกัน
//ด้านหลายสี - FRONT glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); // P1 เป็นสีแดง glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5); // P2 เป็นสีเขียว glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5); // P3 เป็นสีน้ำเงิน glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5); // P4 เป็นสีม่วง glEnd();
ขั้นตอนที่ 6. จับอีกด้านหนึ่ง
หาตำแหน่งของจุดยอดแต่ละอันสำหรับอีกห้าด้านที่เหลือของลูกบาศก์ แต่เพื่อความง่าย สิ่งเหล่านี้ได้รับการคำนวณสำหรับคุณและรวมอยู่ใน ฟังก์ชั่นการแสดงผลสุดท้าย () ด้านล่าง.
// ด้านขาว - BACK glBegin(GL_POLYGON); glColor3f(1.0, 1.0, 1.0); glVertex3f(0.5, -0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); // ด้านสีม่วง - ขวา glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 1.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glEnd(); // ด้านสีเขียว - LEFT glBegin(GL_POLYGON); glColor3f(0.0, 1.0, 0.0); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); // ด้านสีน้ำเงิน - TOP glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, 0.5); glEnd(); // ด้านสีแดง - ด้านล่าง glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); glFlush(); glutSwapBuffers(); }
เราต้องการเพิ่มโค้ดสองบรรทัดสุดท้ายสำหรับฟังก์ชันนี้ด้วย เหล่านี้คือ glFlush();
และ glutSwapBuffers();
ซึ่งให้เอฟเฟกต์บัฟเฟอร์สองเท่าที่คุณเรียนรู้มาก่อนหน้านี้
ส่วนที่ 3 จาก 3: การโต้ตอบกับผู้ใช้
ขั้นตอนที่ 1 เพิ่มคีย์พิเศษ ()
คุณเกือบเสร็จแล้ว แต่ในขณะนี้ คุณสามารถวาดลูกบาศก์ได้ แต่ไม่มีวิธีหมุนมัน เมื่อต้องการทำเช่นนี้ คุณจะ สร้างคีย์พิเศษ () ฟังก์ชั่นที่ช่วยให้เราสามารถกดปุ่มลูกศรและหมุนลูกบาศก์ได้!
- ฟังก์ชันนี้เป็นสาเหตุที่คุณประกาศตัวแปรทั่วโลกว่าrotation_xและrotation_y เมื่อคุณกดแป้นลูกศรขวาและซ้ายrotation_y จะเพิ่มขึ้นหรือลดลง 5 องศา ในทำนองเดียวกัน เมื่อคุณกดแป้นลูกศรขึ้นและลง rotation_x จะเปลี่ยนไปตามนั้น
เป็นโมฆะ specialKeys (คีย์ int, int x, int y) {// ลูกศรขวา - เพิ่มการหมุน 5 องศาถ้า (คีย์ == GLUT_KEY_RIGHT) turns_y += 5; // ลูกศรซ้าย - ลดการหมุนลง 5 องศา ถ้า (คีย์ == GLUT_KEY_LEFT) turns_y -= 5; อื่นถ้า (คีย์ == GLUT_KEY_UP) หมุน_x += 5; อื่นถ้า (คีย์ == GLUT_KEY_DOWN) turns_x -= 5; // ขอแสดงการปรับปรุง glutPostRedisplay(); }
ขั้นตอนที่ 2. เพิ่ม glRotate()
คำสั่งสุดท้ายของคุณคือการเพิ่มคำสั่งที่จะหมุนวัตถุของคุณ กลับไปที่ฟังก์ชัน display() และก่อนถึง FRONT ให้เพิ่มบรรทัดเหล่านี้:
// รีเซ็ตการแปลง glLoadIdentity(); // หมุนเมื่อผู้ใช้เปลี่ยน turns_x และ turns_y glRotatef(rotation_x, 1.0, 0.0, 0.0); glRotatef (rotation_y, 0.0, 1.0, 0.0); // ด้านหลากสี - ด้านหน้า ….
ขั้นตอนที่ 3 เพิ่มคำสั่งต่อไปนี้เพื่อปรับขนาดลูกบาศก์ 2 ตามแนวแกน x 2 ตามแนวแกน y หมุนลูกบาศก์ 180 องศารอบแกน y และแปลลูกบาศก์ 0.1 ตามแนวแกน x
ตรวจสอบให้แน่ใจว่าได้จัดเรียงคำสั่งเหล่านี้รวมถึงคำสั่ง glRotate() ก่อนหน้านี้ในลำดับที่ถูกต้องตามที่อธิบายไว้ข้างต้น (หากคุณไม่แน่ใจ ให้ดำเนินการนี้ในโค้ดสุดท้ายที่ส่วนท้ายของบทช่วยสอน)
// การแปลงอื่น ๆ glTranslatef(0.1, 0.0, 0.0); glRotatef(180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);
ขั้นตอนที่ 4 รวบรวมและเรียกใช้รหัสของคุณ
สมมติว่าคุณใช้ gcc เป็นคอมไพเลอร์ ให้รันคำสั่งเหล่านี้จากเทอร์มินัลของคุณเพื่อคอมไพล์และทดสอบโปรแกรมของคุณ
บน Linux: gcc cube.c -o cube -lglut -lGL./ mycube บน Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube บน Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
ขั้นตอนที่ 5. ตรวจสอบรหัสที่สมบูรณ์ของคุณ
ควรเป็นดังนี้:
// // ไฟล์: mycube.c // ผู้แต่ง: Matt Daisley // สร้างแล้ว: 4/25/2012 // โครงการ: ซอร์สโค้ดสำหรับสร้างลูกบาศก์ใน OpenGL // คำอธิบาย: สร้างหน้าต่าง OpenGL และวาดลูกบาศก์ 3 มิติ / / ที่ผู้ใช้สามารถหมุนได้โดยใช้ปุ่มลูกศร // // การควบคุม: ลูกศรซ้าย - หมุนซ้าย // ลูกศรขวา - หมุนขวา // ลูกศรขึ้น - หมุนขึ้น // ลูกศรลง - หมุนลง // ------ -------------------------------------------------- -- // รวมถึง // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- ---------------------------------------------------- // ฟังก์ชั่นต้นแบบ / / -------------------------------------------------- --------- แสดงเป็นโมฆะ (); เป็นโมฆะ specialKeys(); // ------------------------------------------------ ---------- // ตัวแปรโกลบอล // ---------------------------------- ------------------------ หมุนสองครั้ง _y=0; หมุนสองครั้ง _x=0; // ------------------------------------------------ ---------- // display() ฟังก์ชั่นการโทรกลับ // ------------------------------- ---------------------------- การแสดงเป็นโมฆะ () { // ล้างหน้าจอและ Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // รีเซ็ตการแปลง glLoadIdentity(); // การแปลงอื่น ๆ // glTranslatef(0.1, 0.0, 0.0); // ไม่รวม // glRotatef(180, 0.0, 1.0, 0.0); // ไม่รวม // หมุนเมื่อผู้ใช้เปลี่ยน rotation_x และ rotation_y glRotatef (rotation_x, 1.0, 0.0, 0.0); glRotatef (rotation_y, 0.0, 1.0, 0.0); // การแปลงอื่น ๆ // glScalef (2.0, 2.0, 0.0); // ไม่รวม // ด้านหลายสี - FRONT glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); // P1 เป็นสีแดง glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5); // P2 เป็นสีเขียว glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5); // P3 เป็นสีน้ำเงิน glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5); // P4 เป็นสีม่วง glEnd(); // ด้านขาว - BACK glBegin(GL_POLYGON); glColor3f(1.0, 1.0, 1.0); glVertex3f(0.5, -0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); // ด้านสีม่วง - ขวา glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 1.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glEnd(); // ด้านสีเขียว - LEFT glBegin(GL_POLYGON); glColor3f(0.0, 1.0, 0.0); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); // ด้านสีน้ำเงิน - TOP glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, 0.5); glEnd(); // ด้านสีแดง - ด้านล่าง glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); glFlush(); glutSwapBuffers(); } // ----------------------------------------------------- ------------ // specialKeys() ฟังก์ชันการโทรกลับ // ------------------------------ ---------------------------- โมฆะ specialKeys (คีย์ int, int x, int y) {// ลูกศรขวา - เพิ่มการหมุน 5 องศาถ้า (คีย์ == GLUT_KEY_RIGHT) หมุน_y += 5; // ลูกศรซ้าย - ลดการหมุนลง 5 องศา ถ้า (คีย์ == GLUT_KEY_LEFT) turns_y -= 5; อื่นถ้า (คีย์ == GLUT_KEY_UP) หมุน_x += 5; อื่นถ้า (คีย์ == GLUT_KEY_DOWN) turns_x -= 5; // ขอแสดงการปรับปรุง glutPostRedisplay(); } // ----------------------------------------------------- ----------- // ฟังก์ชั่นหลัก // ------------------------------- ---------------------------- int main(int argc, char* argv){ // เริ่มต้น GLUT และประมวลผลพารามิเตอร์ผู้ใช้ glutInit(&argc, argv); // ขอหน้าต่างสีจริงบัฟเฟอร์สองเท่าด้วย Z-buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // สร้างหน้าต่าง glutCreateWindow("Awesome Cube"); // เปิดใช้งานการทดสอบความลึกของบัฟเฟอร์ Z glEnable(GL_DEPTH_TEST); // ฟังก์ชันการโทรกลับ glutDisplayFunc(display); glutSpecialFunc(ปุ่มพิเศษ); // ส่งผ่านการควบคุมไปยัง GLUT สำหรับเหตุการณ์ glutMainLoop(); // กลับไปที่ OS คืนค่า 0; }