OpenGL 是開放的三維圖形函式庫,獨立於視窗系統與作業系統,基於它開發的應用程式可輕鬆跨平台移植,並便於二維/三維圖形演算法實作,保證正確性與可靠性。
在 Windows 95/98 的 WINDOWS\\SYSTEM 目錄下必須有 opengl32.dll 與 glu32.dll,這是 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 函數繪製圖形。
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);
};
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);
}
}
CS_OWNDC 樣式(可在 CreateParams 覆寫設定),確保每個視窗擁有獨立 DC。PFD_DOUBLEBUFFER) 對動畫必不可少,避免閃爍。SwapBuffers(hDC) 交換前後緩衝區。OnResize 更新 glViewport 與投影矩陣。