首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

第一個 OpenGL 程式:建立視窗與繪製基本圖元

     編輯:關於C語言

從零開始:最小可執行 OpenGL/GLUT 程式完整解析

本程式示範使用 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;
}

關鍵 API 深度解析

函數用途關鍵參數說明
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):

  • X 軸:左 -1.0 → 右 +1.0
  • Y 軸:下 -1.0 → 上 +1.0
  • Z 軸:近 -1.0 → 遠 +1.0

`glRectf(-0.5, -0.5, 0.5, 0.5)` 在視窗中心繪製寬高各佔視窗 50% 的正方形。

常見擴展方向

  1. 雙緩衝動畫:`GLUT_DOUBLE` + `glutSwapBuffers()` 替換 `glFlush()`
  2. 鍵盤/滑鼠互動:`glutKeyboardFunc`、`glutMouseFunc`、`glutMotionFunc`
  3. 視角投影:`glMatrixMode(GL_PROJECTION)` + `gluOrtho2D`/`gluPerspective`
  4. 動態更新:`glutIdleFunc` 或 `glutTimerFunc` 驅動重繪

這個最小程式包含了 OpenGL 應用的完整生命週期:初始化 → 資源建立 → 事件迴圈 → 繪圖回呼。理解每個環節的職責,是進階圖形程式設計的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved