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

使用 BCB (C++ Builder) 開發 OpenGL 應用程式

     編輯:關於C++

一、簡介

OpenGL 是開放的三維圖形函式庫,獨立於視窗系統與作業系統,基於它開發的應用程式可輕鬆跨平台移植,並便於二維/三維圖形演算法實作,保證正確性與可靠性。

在 Windows 95/98 的 WINDOWS\\SYSTEM 目錄下必須有 opengl32.dll 與 glu32.dll,這是 OpenGL 應用程式正確運行的必要條件。

二、Win32 下 OpenGL 程式設計要點

Win32 視窗程式必須處理裝置描述表 (DC),OpenGL 同樣需使用特殊的繪圖操作描述表 (Rendering Context, RC)。所有 OpenGL 呼叫都必須透過 RC 進行。應用程式根據指定的 DC 建立 RC:

HDC hDC;   // 裝置描述表
HGLRC hRC; // OpenGL 繪圖操作描述表

hDC = GetDC(hWnd);
hRC = wglCreateContext(hDC);

RC 包含與 OpenGL 相關的資訊。OpenGL 應用程式必須建立 RC、啟動它,然後在指定視窗內以常規方式呼叫 OpenGL 函數繪製圖形。

三、具體實作步驟

1. 主視窗表頭檔 (Unit1.h) 新增成員

#include <gl/gl.h>
#include <gl/glu.h>

class TForm1 : public TForm {
__published:
    // IDE 管理的元件...
private:
    HDC  hDC;   // 裝置描述表
    HGLRC hRC;  // OpenGL RC
    void __fastcall InitOpenGL(); // 初始化函數
public:
    __fastcall TForm1(TComponent* Owner);
};

2. 主視窗實作檔 (Unit1.cpp) - 色彩初始化與繪圖

void __fastcall TForm1::InitOpenGL() {
    hDC = GetDC(Handle);
    
    // 設定像素格式
    PIXELFORMATDESCRIPTOR pfd = {
        sizeof(PIXELFORMATDESCRIPTOR), 1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA, 16,  // 16-bit 色彩
        0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0,
        16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0
    };
    
    int pf = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, pf, &pfd);
    
    // 建立並啟用 RC
    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);
    
    // OpenGL 基礎設定
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 黑色背景
    glEnable(GL_DEPTH_TEST);              // 啟用深度測試
}

void __fastcall TForm1::FormCreate(TObject *Sender) {
    InitOpenGL();
}

void __fastcall TForm1::FormDestroy(TObject *Sender) {
    wglMakeCurrent(NULL, NULL);
    if (hRC) wglDeleteContext(hRC);
    ReleaseDC(Handle, hDC);
}

void __fastcall TForm1::FormPaint(TObject *Sender) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    // 繪製簡單三角形
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f);
    glEnd();
    
    SwapBuffers(hDC); // 雙緩衝交換
}

void __fastcall TForm1::FormResize(TObject *Sender) {
    if (hRC) {
        glViewport(0, 0, ClientWidth, ClientHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0, (double)ClientWidth / ClientHeight, 1.0, 100.0);
        glMatrixMode(GL_MODELVIEW);
    }
}

3. 關鍵點總結

  • 視窗類別需包含 CS_OWNDC 樣式(可在 CreateParams 覆寫設定),確保每個視窗擁有獨立 DC。
  • 雙緩衝 (PFD_DOUBLEBUFFER) 對動畫必不可少,避免閃爍。
  • 繪圖完成必須呼叫 SwapBuffers(hDC) 交換前後緩衝區。
  • 視窗大小改變時需在 OnResize 更新 glViewport 與投影矩陣。
  • 程式結束時正確釋放 RC 與 DC 資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved