程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 在C++ Builder中使用OpenGL編程的優化框架

在C++ Builder中使用OpenGL編程的優化框架

編輯:vc教程

姑且不談論OpenGL的名貴背景和光明前途,單憑其實用性和有效性就足以使其成為我們圖形輸出編程的首選。但是在實際工程應用中程序員沒必要仔細地深究OpenGL的運作機制,也往往不需要掌握各種高級的效果制作,真正需要的是最簡捷地利用這個得力的工具實現輸出數據的可視化,如波形、譜圖、立體統計圖表等的顯示。有鑒於此,本文總結出了在C++Builder中OpenGL編程的實用框架。筆者經過實踐,對於一般的圖形輸出的應用,此框架足以應付。對於復雜些的程序可以在本框架的基礎上進行擴充。

在Windows環境下用OpenGL編程至少要了解如下預備知識:

OpenGL本身:對於一般的應用,我們可以認為OpenGL就是一套與窗口系統和操作系統無關的三維圖形函數庫。

DC和RC:每個Win32應用程序都有一個設備描述表(Device Context)簡稱DC,在這個設備描述表中包含了圖形怎樣顯示在窗口的設置( GDI)信息。調用OpenGL函數必須使用設備描述表才能正確地在窗口輸出。圖形操作描述表(Rendering Context)簡稱RC,是一種設備描述表的形式,在圖形操作描述表中存放一些OpenGL和操作系統相聯系的信息。圖形操作描述表是傳遞所有OpenGL命令的端口。

像素格式:像素格式定義了OpenGL繪圖的屬性,創建圖形操作描述表首先要定義象素格式。它由這樣一個數據結構實現

typedef struct tagPIXELFORMATDESCRIPTOR
{
WORD nSize; //結構大小
WORD nVersion; //版本
DWORD dwFlags; //象素緩沖的位標志
BYTE iPixelType; //RGBA模式或顏色索引模式
BYTE cColorBits; //顏色位數
BYTE cRedBits; //RGBA模式下R所占位數
BYTE cRedShift; //RGBA模式下R位數偏移
BYTE cGreenBits; //RGBA模式下G所占位數
BYTE cGreenShift; //RGBA模式下G位數偏移
BYTE cBlueBits; //RGBA模式下B所占位數
BYTE cBlueShift; //RGBA模式下B位數偏移
BYTE cAlphaBits; //RGBA模式下Alpha所占位數
BYTE cAlphaShift; //RGBA模式下Alpha位數偏移
BYTE cAccumBits; //累計緩沖區位面總數
BYTE cAccumRedBits; //累計緩沖區R位面總數
BYTE cAccumGreenBits; //累計緩沖區G位面總數
BYTE cAccumBlueBits; //累計緩沖區B位面總數
BYTE cAccumAlphaBits; //累計緩沖區Alpaha位面總數
BYTE cDepthBits; //深度緩沖位數
BYTE cStencilBits; //模板緩沖位數
BYTE cAuxBuffers; //Win32 下不支持
BYTE iLayerType; //不再使用
BYTE bReserved; //0
DWORD dwLayerMask; //不再使用
DWORD dwVisibleMask; //0
DWORD dwDamageMask; //不再使用
} PIXELFORMATDESCRIPTOR; 

雙緩沖技術:OpenGL支持一個顯示緩沖和一個非顯示緩沖。缺省的情況是所有的OpenGL繪制命令在非顯示緩沖中繪制,繪制完成後再將其內容拷貝到顯示緩沖區中(使用SwapBuffers函數)。雙緩沖使圖象轉換更平滑,這就是在快速動畫(如波形等的實時輸出)時沒有屏幕閃爍的奧妙所在。

反走樣技術:實際中需要畫出的往往是曲線,由於計算機以離散點生成圖形,曲線上會有鋸齒,這就是一種走樣現象。在用一般語言畫圖時,這一現象是難以避免的。OpenGL中利用混合技術,把原來邊界的鋸齒部分用低飽和度的點補上從而實現反走樣,達到平滑的邊界效果。

好,我們現在可以啟用下面的程序框架了。

在*.h文件的類聲明中添加private成員:

private:

HGLRC hRC;

HDC hDC;

以下是相應*.cpp文件

首先加上兩個包含文件:

#include <gl\gl.h> //程序使用OpenGL的核心函數

#include <gl\glu.h> //程序使用實用庫中的函數

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved