2008-12-16(Tue)
OpenGL : First Window
ขั้นแรก เรามาสร้าง Window เปล่าๆ กันก่อนดีกว่า
เพื่อให้เข้าใจง่ายยึ่งขึ้น
Code : Create Window
// Include ไฟล์ Header ของ glut เข้ามาเพื่อให้ใช้คำสั่งได้
#include
// ประกาศ Prototype Function เพื่อที่จะอ้างอิงใน main ได้โดยไม่ error
// ถ้าไม่ใช้วิธีนี้ ก็ต้องยกตัว function ทั้งก้อนมาใส่ไว้ก่อน main เพื่อให้ compiler รู้จัก
// ส่วนชื่อ จะตั้งเป็นอะไรก็ได้ เช่น display, draw, show ให้อ่านรู้เรื่องก็พอ
// function นี้ จะสร้างไว้สำหรับเก็บคำสั่งในการแสดงผล(ในภายภาคหน้า) ซึ่งในที่นี้ผมจะใช้ชื่อว่า draw
void draw(void);
// main ให้ประกาศ parameter ดังนี้ เพราะ argc และ argv จะถูกนำไปใช้ในบรรทัดต่อไป
int main(int argc, char **argv)
{
// คำสั่งสำหรับเตรียมการของ glut ให้ใส่ไปตามนี้เลย
glutInit(&argc, argv);
// Display Mode จะมี Single Buffer(กินทรัพยากรเครื่องน้อยกว่า เพราะคำนวนการแสดงผลทีละ frame)
// และ Double Buffer(ภาพ Smooth กว่า เพราะคำนวนผลของ frame ต่อไปรอไว้ แล้วสลับขึ้นมาใช้)
// ถ้า Single Buffer ให้ใช้ parameter GLUT_SINGLE
// ถ้า Double Buffer ให้ใช้ parameter GLUT_DOUBLE (☆แนะนำ ให้ใช้อันนี้)
// ส่วน Mode สี ก็มี GLUT_RGB (Red, Green, Blue) และ GLUT_RGBA (Red, Green, Blue, Alpha)
// ในตัวอย่างผมจะใช้ RGBA มันไปเลยละกัน (เผื่อไว้)
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
// คำสั่งในการสร้าง Window ส่วน parameter ที่ส่งให้ คือ Window Title
// (ในที่นี้ผมจะตั้งชื่อว่า "OpenGL Project"
glutCreateWindow("OpenGL Project");
// คำสั่งสำหรับ run function การแสดงผล โดยส่ง parameter เข้าไปเป็นชื่อ function ที่ตั้งไว้ในตอนแรก
// ที่ผมได้ตั้งไว้ก็คือ draw
glutDisplayFunc(draw);
// คำสั่งสำหรับสั่งให้ โปรแกรมทำการ วน loop ในการแสดงผลเรื่อยๆไปยัง frame ถัดไป
glutMainLoop();
return 0;
}
// function สำหรับ เรียกไป แสดงผล
void draw(void)
{
// คำสั่งในการสลับ frame ถัดไปที่ได้รับการ buffer ไว้ ขึ้นมาแสดงผล
// ในกรณีที่ใช้ Display Mode แบบ Double Buffer
glutSwapBuffers();
// ส่วนในกรณีที่แสดงผลทีละ frame แบบ Single Buffer จะใช้คำสั่ง ในบรรทัดต่อไปแทน
// glFlush();
}
เท่านี้ก็จะได้กรอบ Window ขึ้นมาแล้ว ฟังดูเหมือนจะยาก แต่ที่จริงแล้วง่ายมาก
การเขียน comment อธิบาย เป็นภาษาไทย นี่ทำให้ดูรกขึ้นจมเลย
ตัว Code จริงๆก็มีอยู่แค่นี้เองครับ
#include
void draw(void);
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutCreateWindow("OpenGL Project");
glutDisplayFunc(draw);
glutMainLoop();
return 0;
}
void draw(void)
{
glutSwapBuffers();
}
เพื่อให้เข้าใจง่ายยึ่งขึ้น
Code : Create Window// Include ไฟล์ Header ของ glut เข้ามาเพื่อให้ใช้คำสั่งได้
#include
// ประกาศ Prototype Function เพื่อที่จะอ้างอิงใน main ได้โดยไม่ error
// ถ้าไม่ใช้วิธีนี้ ก็ต้องยกตัว function ทั้งก้อนมาใส่ไว้ก่อน main เพื่อให้ compiler รู้จัก
// ส่วนชื่อ จะตั้งเป็นอะไรก็ได้ เช่น display, draw, show ให้อ่านรู้เรื่องก็พอ
// function นี้ จะสร้างไว้สำหรับเก็บคำสั่งในการแสดงผล(ในภายภาคหน้า) ซึ่งในที่นี้ผมจะใช้ชื่อว่า draw
void draw(void);
// main ให้ประกาศ parameter ดังนี้ เพราะ argc และ argv จะถูกนำไปใช้ในบรรทัดต่อไป
int main(int argc, char **argv)
{
// คำสั่งสำหรับเตรียมการของ glut ให้ใส่ไปตามนี้เลย
glutInit(&argc, argv);
// Display Mode จะมี Single Buffer(กินทรัพยากรเครื่องน้อยกว่า เพราะคำนวนการแสดงผลทีละ frame)
// และ Double Buffer(ภาพ Smooth กว่า เพราะคำนวนผลของ frame ต่อไปรอไว้ แล้วสลับขึ้นมาใช้)
// ถ้า Single Buffer ให้ใช้ parameter GLUT_SINGLE
// ถ้า Double Buffer ให้ใช้ parameter GLUT_DOUBLE (☆แนะนำ ให้ใช้อันนี้)
// ส่วน Mode สี ก็มี GLUT_RGB (Red, Green, Blue) และ GLUT_RGBA (Red, Green, Blue, Alpha)
// ในตัวอย่างผมจะใช้ RGBA มันไปเลยละกัน (เผื่อไว้)
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
// คำสั่งในการสร้าง Window ส่วน parameter ที่ส่งให้ คือ Window Title
// (ในที่นี้ผมจะตั้งชื่อว่า "OpenGL Project"
glutCreateWindow("OpenGL Project");
// คำสั่งสำหรับ run function การแสดงผล โดยส่ง parameter เข้าไปเป็นชื่อ function ที่ตั้งไว้ในตอนแรก
// ที่ผมได้ตั้งไว้ก็คือ draw
glutDisplayFunc(draw);
// คำสั่งสำหรับสั่งให้ โปรแกรมทำการ วน loop ในการแสดงผลเรื่อยๆไปยัง frame ถัดไป
glutMainLoop();
return 0;
}
// function สำหรับ เรียกไป แสดงผล
void draw(void)
{
// คำสั่งในการสลับ frame ถัดไปที่ได้รับการ buffer ไว้ ขึ้นมาแสดงผล
// ในกรณีที่ใช้ Display Mode แบบ Double Buffer
glutSwapBuffers();
// ส่วนในกรณีที่แสดงผลทีละ frame แบบ Single Buffer จะใช้คำสั่ง ในบรรทัดต่อไปแทน
// glFlush();
}
เท่านี้ก็จะได้กรอบ Window ขึ้นมาแล้ว ฟังดูเหมือนจะยาก แต่ที่จริงแล้วง่ายมาก
การเขียน comment อธิบาย เป็นภาษาไทย นี่ทำให้ดูรกขึ้นจมเลย
ตัว Code จริงๆก็มีอยู่แค่นี้เองครับ
#include
void draw(void);
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutCreateWindow("OpenGL Project");
glutDisplayFunc(draw);
glutMainLoop();
return 0;
}
void draw(void)
{
glutSwapBuffers();
}
เรื่องต่อไปจะสอนการตั้งค่า Window และ ทำพื้นหลัง


Essential : ★★★★★
Create SpriteFont File :
Core Code :
In Method : Constructor
Detail : Use String
Code Example : 

