本程式示範使用 GLUT 建立 OpenGL 渲染視窗、設定顯示模式、註冊回呼函數並繪製一個綠色矩形。每一行程式碼都有明確用途,適合作為學習基準範本。
#include <GL/glut.h>
// 顯示回呼函數:負責所有繪圖指令
void myDisplay(void) {
// 1. 清除顏色緩衝區 (背景色預設為黑色)
glClear(GL_COLOR_BUFFER_BIT);
// 2. 設定當前繪圖顏色 (R, G, B 範圍 0.0~1.0)
glColor3f(0.0f, 1.0f, 0.0f); // 純綠色
// 3. 繪製矩形 (x1, y1, x2, y2) - 規範化座標系 [-1, 1]
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
// 4. 強制執行所有 OpenGL 指令 (單緩衝模式必須)
glFlush();
}
// GLUT 初始化與主迴圈進入點
void test(int argc, char** argv) {
// 1. 初始化 GLUT 庫 (處理命令列參數)
glutInit(&argc, argv);
// 2. 設定顯示模式:RGB 模式 + 單緩衝
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
// 3. 設定視窗初始位置 (螢幕座標)
glutInitWindowPosition(100, 100);
// 4. 設定視窗大小 (像素)
glutInitWindowSize(600, 400);
// 5. 建立視窗並設定標題
glutCreateWindow("第一個 OpenGL 程式");
// 6. 註冊顯示回呼函數
glutDisplayFunc(&myDisplay);
// 7. 進入事件處理主迴圈 (不會返回)
glutMainLoop();
}
// 程式進入點
int main(int argc, char* argv[]) {
test(argc, argv);
return 0;
}
| 函數 | 用途 | 關鍵參數說明 |
|---|---|---|
| glutInit | 初始化 GLUT,解析命令列參數 | 必須最先呼叫,傳遞 main 的 argc/argv |
| glutInitDisplayMode | 設定視窗緩衝區屬性 | GLUT_RGB(彩色) | GLUT_SINGLE(單緩衝) / GLUT_DOUBLE(雙緩衝) | GLUT_DEPTH(深度緩衝) |
| glutCreateWindow | 建立視窗並回傳視窗 ID | 視窗標題字串 |
| glutDisplayFunc | 註冊重繪回呼 | 視窗需要重繪時自動呼叫 (曝光、調整大小、glutPostRedisplay) |
| glutMainLoop | 進入事件迴圈 | 處理視窗訊息、觸發回呼,永不返回 |
| glClear | 清除指定緩衝區 | GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT |
| glColor3f | 設定當前頂點顏色 | 三個 float 參數 (0.0~1.0),影響後續繪圖 |
| glRectf | 繪製矩形 | 兩對座標 (x1,y1,x2,y2),使用當前顏色 |
| glFlush | 強制提交命令緩衝 | 單緩衝模式必須;雙緩衝改用 glutSwapBuffers() |
OpenGL 預設使用規範化裝置座標 (NDC):
`glRectf(-0.5, -0.5, 0.5, 0.5)` 在視窗中心繪製寬高各佔視窗 50% 的正方形。
這個最小程式包含了 OpenGL 應用的完整生命週期:初始化 → 資源建立 → 事件迴圈 → 繪圖回呼。理解每個環節的職責,是進階圖形程式設計的基石。