程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> OpenGL入門介紹

OpenGL入門介紹

編輯:關於VC++

1、OpenGL簡介

OpenGL是近幾年發展起來的一個性能卓越的三維圖形標准,它是在SGI等多家世界聞名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通用共享的開放式三維圖形標准。目前,包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做為三維圖形標准,許多軟件廠商也紛紛以OpenGL為基礎開發出自己的產品,其中比較著名的產品包括動畫制作軟件Soft Image和3D Studio MAX、仿真軟件Open Inventor、VR軟件World Tool Kit、CAM軟件ProEngineer、GIS軟ARC/INFO等等。值得一提的是,隨著Microsoft公司在Windows NT和最新的Windows 95中提供了OpenGL標准及OpenGL三維圖形加速卡的推出,OpenGL將在微機中有廣泛地應用,同時也為廣大用戶提供了在微機上使用以前只能在高性能圖形工作站上運行的各種軟件的機會。

2、OpenGL特點及功能

OpenGL實際上是一個開放的三維圖形軟件包,它獨立於窗口系統和操作系統,以它為基礎開發的應用程序可以十分方便地在各種平台間移植;OpenGL可以與Visual C++緊密接口,便於實現機械手的有關計算和圖形算法,可保證算法的正確性和可靠性;OpenGL使用簡便,效率高。它具有七大功能:

建模

  • OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數外,還提供了復雜的三維物體(球、錐、多面體、茶壺等)以及復雜曲線和曲面(例如Bezier、Nurbs等曲線或曲面)繪制函數。

  • 變換

    OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、旋轉、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變換。其變換方法與機器人運動學中的坐標變換方法完全一致,有利於減少算法的運行時間,提高三維圖形的顯示速度。

  • 顏色模式設置

    OpenGL顏色模式有兩種,即RGBA模式和顏色索引(Color Index)。

  • 光照和材質設置

    OpenGL光有輻射光(Emitted Light)、環境光(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的反射率相乘後形成的顏色。

  • 紋理映射(Texture Mapping)

    利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節。

  • 位圖顯示和圖象增強

    圖象功能除了基本的拷貝和像素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。以上三條可是被仿真物更具真實感,增強圖形顯示的效果。

  • 雙緩存動畫(Double Buffering)

    雙緩存即前台緩存和後台緩存,簡而言之,後台緩存計算場景、生成畫面,前台緩存顯示後台緩存已畫好的畫面。此外,利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等特殊效果。從而實現了消隱算法。

3、OpenGL for Windows 95圖形庫

OpenGL圖形庫一共有100多個函數。其中核心函數有115個,它們是最基本的函數,其前綴是gl,OpenGL實用庫(OpenGL utility library,GLU)的函數功能更高一些,如繪制復雜的曲線曲面、高級坐標變換、多邊形分割等,共有43個,前綴為glu;OpenGL輔助庫(OpenGL auxiliarylibrary,GLAUX)的函數是一些特殊的函數,包括簡單的窗口管理、輸入事件處理、某些復雜三維物體繪制等函數,共有31個,前綴為aux。

此外,還有六個WGL函數非常重要,專門用於OpenGL和Windows 95窗口系統的聯接,其前綴為wgl,主要用於創建和選擇圖形操作描述表(renderingcontexts)以及在窗口內任一位置顯示字符位圖。這些功能是Windows 95對OpenGL的唯一補充。另外,還有五個Win32函數用來處理像素格式(pixel formats)和雙緩存。由於它們是對Win32系統的擴展,因此不能應用在其它OpenGL平台上。

4、OpenGL for Windows 95程序設計

OpenGL for Windows 95的設計與OpenGL for UNIX的程序設計有一點小區別,關鍵就在於如何將OpenGL與不同的操作系統下的窗口系統聯系起來。如果調用OpenGL輔助庫窗口管理函數,則不用考慮這些問題。下面簡要介紹在Windows 95下OpenGL的程序設計關鍵。

4.1 圖形操作描述

在Windows 95下窗口程序必須首先處理設備描述表(Device Contexts,DC),DC包括許多如何在窗口上顯示圖形的信息,既指定畫筆和刷子的顏色,設置繪圖模式、調色板、映射模式以及其它圖形屬性。同樣,OpenGL for Windows95的程序也必須使用DC,這與其它Windows 95程序類似。但是,OpenGL for Windows 95必須處理特殊的DC圖形操作描述表,這是DC中專為OpenGL使用的一種。一個OpenGL應用圖形操作描述表內有OpenGL與Windows 95窗口系統相關的各種信息。一個OpenGL應用首先必須創建一個圖形操作描述表,然後再啟動它,最後在所定義的窗口內按常規方式調用OpenGL函數繪制圖形。

一個圖形操作描述表不同於其它DC,它們調用每個GDI函數都需要一個句柄,而圖形操作描述表方式下只需一個句柄就可以任意調用OpenGL函數。也就是說,只要當前啟用了某個圖形操作描述表,那麼在未刪除圖形操作描述表之前可以調用任何OpenGL函數,進行各種操作。

4.2 像素格式

在創建一個圖形操作表之前,首先必須設置像素格式。像素格式含有設備繪圖界面的屬性,這些屬性包括繪圖界面是用RGBA模式還是顏色表模式,像素緩存是用單緩存還是雙緩存,以及顏色位數、深度緩存和模板緩存所用的位數,還有其它一些屬性信息。

4.3 像素格式結構

每個OpenGL顯示設備都支持一種指定的像素格式。一般用一個名為PIXELFORMATDESCRIPTOR的結構來表示某個特殊的像素格式,這個結構包含26個屬性信息。Win32定義PIXELFORMATDESCRIPTOR如下所示:

  typedef struct tagPIXELFORMATDESCRIPTOR
   {
     WORD nSize;
     WORD nVersion;
     DWORD dwFlags;
     BYTE iPixelType;
     BYTE cColorBits;
     BYTE cRedBits;
     BYTE cRedShift;
     BYTE cGreenBits;
     BYTE cGreenShift;
     BYTE cBlueBits;
     BYTE cBlueShift;
     BYTE cAlphaBits;
     BYTE cAlphaShift;
     BYTE cAccumBits;
     BYTE cAccumRedBits;
     BYTE cAccumGreenBits;
     BYTE cAccumBlueBits;
     BYTE cAccumAlphaBits;
     BYTE cDepthBits;
     BYTE cStencilBits;
     BYTE cAuxBuffers;
     BYTE iLayerType;
     BYTE bReserved;
     DWORD dwLayerMask;
     DWORD dwVisibleMask;
     DWORD dwDamageMask;
   } PIXELFORMATDESCRIPTOR;

4.4 初始化PIXELFORMATDESCRIPTOR結構

PIXELFORMATDESCRIPTOR中每個變量值的具體含義和設置可以參考有關資料,下面舉出一個PIXELFORMATDESCRIPTOR初始化例子來簡要說明相關變量的意義。定義PIXELFORMATDESCRIPTOR結構的pfd如下:

  PIXELFORMATDESCRIPTOR pfd = {
     sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
     1,
     PFD_DRAW_TO_WINDOW |      // support window
     PFD_SUPPORT_OPENGL |      // support OpenGL
     PFD_DOUBLEBUFFER,        // double buffered
     PFD_TYPE_RGBA,         // RGBA type
     24,               // 24-bit color depth
     0, 0, 0, 0, 0, 0,        // color bits ignored
     0,               // no alpha buffer
     0,               // shift bit ignored
     0,               // no accumulation buff
     0, 0, 0, 0,           // accum bits ignored
     32,               // 32-bit z-buffer
     0,               // no stencil buffer
     0,               // no auxiliary buffer
     PFD_MAIN_PLANE,         // main layer
     0,               // reserved
     0, 0, 0             // layer masks ignored
   };

在這個結構裡,前兩個變量的含義十分明顯。第三個變量dwFlags的值是PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,表明應用程序使用OpenGL函數來繪制窗口,第四個表明當前采用RGBA顏色模式,第五個采用24位真彩色,既1.67千萬種顏色,如果是256色系統則自動實現顏色抖動;因為沒有使用alpha緩存和累計緩存,所以從變量cAlphaBits到cAccumAlphaBits都設置為0;深度緩存設置為32位,這個緩存能解決三維場景的消隱問題;變量cAuxBuffers設置為0,在Windows 95下不支持輔助緩存;Windows 95下針對OpenGL變量ilayerType只能設置為PFD_MAIN_PLANE,但在其它平台也許支持PFD_MAIN_PLANE或PFD_MAIN_UNDERLAYPLANE;接下來bReserved變量只能設為0,而最後三個變量Windows 95都不支持,故全設置為0。

4.5 設置像素結構

當初始化PIXELFORMATDESCRIPTOR結構後,就要設置像素格式。下面舉例說明如何設置像素格式。

  CClientDC clientDC(this);
   int PixelFormat = ChoosePixelFormat(clientDC.m_hDC,&pfd);
   BOOL result=SetPixelFormat(clientDC.m_hDC,PixelFormat,&pfd);

第一行語句說明得到一個應用窗口客戶區的設置描述表。第一行調用ChoosePixelFormat()選擇一個像素格式,並將像素格式索引號返回給pixelFormat變量;函數中第一個參數是選擇像素格式的設備描述表的句柄,第二個參數是PIXELFORMATDESCRIPTOR結構的地址。如果調用失敗則返回0;否則返回像素格式索引號。第三行調用SetPixelFormat()設置像素格式,三個參數分別是設備描述表的句柄、像素格式索引號和PIXELFORMATDESCRIPTOR結構的地址。如果調用成功則返回TRUE,否則返回FALSE。

4.6 創建圖形操作描述表

正如前所述,必須創建圖形操作描述表並啟用它後,才能調用OpenGL函數在窗口內進行各種圖形操作。一般來說,利用MFC中增補的管理圖形操作描述表方法來編程比較方便。即在視類(CView)的消息OnCreat()中創建圖形操作描述表。

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