系統公告
個人檔案
個人圖檔
ID:nanya9541
暱稱:康樂

贊助商連結
文章分類
輕旅行
nanya9541的最新的回應
最新的引用
  • 目前沒有引用
好時光貼曆
人氣指數
當日人次:
累積人次:
我推薦誰
目前無名單
誰推薦我
誰來我家
贊助商連結
RSS 訂閱
RSS2
ATOM
其它資訊
本部落所刊登之內容,皆由作者個人所提供,不代表 yam天空部落 本身立場。
POWERED BY
POWERED BY
會員登入免費註冊
December 25, 2006
OpenGL三維圖形編程

目錄:
          OpenGL概述 
          OpenGL發展歷史
          OpenGL基本特點 
          OpenGL與DirectX
          OpenGL基本功能 
          OpenGL語法特點
          OpenGL狀態機制 
 
          OpenGL渲染流水線
          OpenGL相關函數庫 
          使用GLUT函數庫
          使用WGL函數庫 
          OpenGL相關資源
          建立OpenGL中的重要概念
------------------------------------------------------------------------
OpenGL發展歷史

在研究三維圖形的過程中,人們開發了各種圖形工具庫(套裝軟體,即一系列函數的集合)
第一個圖形套裝軟體:圖形核心系統,GKS
ISO(國際標準化組織)和ANSI(美國標準化所)標準:層次結構交互圖形系統,PHIGS,擴充後形成PHIGS+
SGI的圖形庫:GL,擴充後形成OpenGL,實際上的圖形工業標準

OpenGL(開放性圖形庫Open Graphics Library)標準
GL:美國SGI公司為圖形工作站開發的一種功能強大的三維圖形機制
經過長期發展,在跨平臺移植的過程中,由GL擴充形成
背靠SGI 公司,技術實力強大
研發資金充盈,由成立於1992年的獨立財團OpenGL Architecture Review Board (OARB)控制
 
OpenGL標準
由SGI等OARB成員以投票方式產生標準
OARB公佈規範文檔(Specification),各軟硬體廠商據此開發自己系統上的實現
只有通過了OARB規範全部測試的實現才能稱為OpenGL
 
1.0版,1992年7月
1.1版,1995年12月
1.2版,1998年3月,最常用版本
1.2.1版,1998年10月
1.3版,2001年8月
1.4版,2002年7月
1.5版,2003年7月,最新版本
2.0版,正在制定
 
OpenGL成為高性能圖形和互動式視景處理的工業標準
SGI、IBM、DEC、SUN、HP等大型硬體廠商都採用OpenGL作為三維圖形標準
動畫軟體Soft Image、動畫軟體3D Studio MAX、仿真軟體Open Inventor、VR(虛擬現實)軟體World Tool Kit、CAM(電腦輔助製造)ProEngineer、GIS(地理資訊系統)軟體ARC/INFO等軟體的製造廠商都以OpenGL為基礎進行開發
NVIDIA、ATI等顯卡製造商支援OpenGL標準
Windows系列、Linux、Unix、OS/2等各平臺都提供對OpenGL的支援
 
OpenGL的普及應用
電腦硬體性能的提高和OpenGL本身的不斷發展,使得OpenGL不再只屬於專用圖形工作站
開發人員可以在各種硬體平臺利用OpenGL進行圖形軟體發展
進行圖形開發實踐的必備工具
 
OpenGL並不是唯一
OpenGL是一個相當流行的高性能圖形處理標準,但並不是唯一的圖形處理開發包
世界上還存在比OpenGL更優秀、更專業(功能專一,且純粹)的開發包,也許並不是標準,但應用于一些超高端的、更專業的圖形工作站,服務于一些特定應用(電影製作、遊戲等等)
 

OpenGL基本特點
跨平臺的工業標準、標準支援靈活
各平臺開發商可以自由地開發適合於各自系統的OpenGL執行實例
OpenGL功能可由特定的硬體實現,也可用純軟體常式實現,或者以軟硬體結合的方式實現,只要支援標準即可
 
運行穩定:
容易使用、只要硬體支援OpenGL標準即可使用
遮罩硬體細節 、具有良好的伸縮性
基於OpenGL API的圖形應用程式可以運行在許多系統上,包括各種用戶電子設備、PC、工作站以及超級電腦
 
具有良好的擴展性:
OpenGL標準提供了一套良好的功能擴充機制
硬體升級後,可以遵循OpenGL擴展機制提供相應的OpenGL函數
一個成功的OpenGL擴展會被融入在未來的OpenGL版本之中
因此,OpenGL能緊跟最新硬體發展和電腦圖形繪製演算法的發展
 

OpenGL與DirectX

DirectX簡介:
DirectX是Microsoft公司開發的底層應用程式介面,用於Windows平臺下遊戲軟體和多媒體系統的開發
DirectX庫採用COM元件思想設計,提供二進位級的元件介面
 
DirectX提供多媒體程式開發所需的全面的API支援
 圖形,DirectX Graphics
 聲音,DirectSound,DirectMusic
 交互,DirectInput
 多人網路遊戲,DirectPlay
 流媒體,DirectShow
現在DirectX的穩定版本是8.0和9.0
 
OpenGL與DirectX的相同點:
在圖形繪製部分,基於相同的電腦圖形學原理實現
提供繪製能力相當的圖形繪製API(現在Windows平臺上常用的OpenGL庫,也是Microsoft依據OpenGL標準實現的)
 
OpenGL與DirectX的不同點:
OpenGL是跨平臺標準,且有各個平臺的實現;DirectX僅僅應用於Windows,由Microsoft獨立開發
OpenGL僅僅提供圖形繪製功能,甚至沒有交互功能;DirectX則提供了多媒體程式開發所需的全部API
OpenGL是函數庫;DirectX則是組件庫
OpenGL各版本向後相容;DirectX的體系結構則在不停變化,並不向後相容
 
目前應用:
一般顯卡廠商都支持OpenGL和DirectX,同時針對兩者進行硬體優化
教學、科研方面OpenGL是主流,遊戲開發、商業應用則基本採用DirectX
需要跨平臺應用時,只能用OpenGL 

OpenGL基本功能:
物體建模與圖元(Primitive)繪製
矩陣變換
顏色管理
光照和材質
紋理映射(Texture mapping)
反走樣(Antialiasing)
圖像特效
雙緩存(Double buffering)動畫
 
物體建模與圖元(Primitive)繪製:
OpenGL認為,所有的物體都是由點、線、多邊形構成的,點、線、多邊形被稱為圖元(Primitive)
OpenGL一共定義了十種圖元(Primitive) 
 
GL_QUAD_STRIP
GL_POLYGON
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_POINTS
GL_LINES
GL_LINE_LOOP
GL_LINE_STRIP
GL_TRIANGLES
GL_QUADS
 
物體建模的意思就是將物體用圖元(Primitive)表示,由於三點決定一個平面,
所以物體常用三角面片來表示,三角面片越多,物體越複雜
OpenGL提供了各種圖元的繪製函數,
以及一些複雜三維物體(球、錐、多面體、茶壺)、曲線曲面(貝塞爾、NURBS)的繪製函數
 
矩陣變換:
無論多複雜的圖形都是由基本圖元組成並經過一系列變換來實現的
OpenGL提供四種基本變換:平移、旋轉、按比例縮放、鏡像
OpenGL提供兩種投影變換:平行投影(正射投影)、透視投影
 
顏色管理:
OpenGL提供了兩種顏色模式:RGBA模式,顏色索引模式(Color index)
RGBA模式為每個圖元點指定顏色,可提供豐富多彩的色彩效果,其中A是混合因數,用於各種特效處理
對於顯示能力不足的硬體,可採用顏色索引模式,系統提供一個顏色表,
通常有256或4096種顏色,各圖元點通過索引顏色表項得到顏色值
 
光照和材質:
在現實生活中,物體因為受光照射和自身對各種頻率光波的吸收與反射能力的不同,而呈現各自不同的顏色
OpenGL的實現
 假設光僅僅由三原色(RGB)組成
 物體對三原色分別有不同的反射率(即材質)
 利用物理光學模型,計算物體實際的顏色
 
紋理映射(Texture mapping):
由於物體採用圖元(Primitive)表示(點、線、多邊形),繪
製時,有效渲染的地方也僅僅是這些點、線、多邊形,其他位置的顏色值則通過插值實現,這就造成了物體繪製的不真實
紋理映射通過貼圖的方式,為物體表面貼上真實的色彩花紋,這些被指定貼上的圖片,就稱作紋理(Texture)
OpenGL提供了完善的紋理映射機制
 
反走樣(Antialiasing):
線段在電腦中是通過一系列的圖元來近似逼近的,而這些圖元實際上是一個個的小正方形,
因此線段常常呈鋸齒狀,這被稱為走樣(Aliasing)
OpenGL通過計算線段對各個圖元的不同覆蓋率來實現反走樣(Antialiasing)
 
圖像特效:
融合(Blending):
為了使三維圖形更加具有真實感,經常需要處理半透明或透明的物體圖像,這就需要用到融合技術
霧(fog):
正如自然界中存在煙霧一樣,OpenGL提供了"fog"的基本操作來達到對場景進行霧化的效果
 
雙緩存(Double buffering)動畫:
出色的動畫效果是OpenGL的一大特色
OpenGL通過雙緩存實現動畫
 前臺緩存顯示當前幀
 後臺緩存同時進行後續幀的場景計算,生成畫面
 

OpenGL語法特點:

所有OpenGL函數都使用“gl”作為首碼
如 glClearColor()
所有OpenGl常量都使用“GL_”開頭,並且所有字母都大寫
如 GL_FALSE
 
OpenGL函數尾碼說明:
尾碼中的阿拉伯數字一般表示參數的數目
 如 glVertex2i(1, 3),表示該函數有兩個參數
阿拉伯數字後的小寫字元(一個或多個)表示參數類型
 如 glVertex2i(1, 3),表示該函數的兩個參數都為32位元整數(Integer)
 表示參數類型的尾碼定義見下表 

OpenGL函數尾碼說明 :
有些函數最後一個字母為“v”,則表示該函數參數為向量(Vector),即陣列
此時,前面的阿拉伯數字表示可接受向量(陣列)的長度
 如 glColor3f(color_array),表示color_array為一陣列,該陣列有三個元素,每個元素的類型都為32位浮點數(Float)
 
OpenGL資料類型 :
開發OpenGL程式時,為便於程式移植,最好使用OpenGL的資料類型定義
 例如,儘量使用“GLint”,而不是用C或C++的“int”
 

OpenGL狀態機制:
OpenGL是一個狀態機(State machine)
設置的狀態將一直保持,直到顯示改變
例如,調用 glColor3f(1.0, 1.0, 0.0) 設置當前顏色為黃色之後,
除非再次調用 glColor* 函數,系統的當前顏色將一直保持為黃色
狀態變數通過函數 glEnable() 和 glDisable() 進行啟動或取消的設置
 
每一個狀態變數都有系統默認的缺省值
狀態變數的當前值可以通過一系列函數查詢
glGetBooleanv()
glGetDoublev()
glGetFloatv()
glGetIntegerv()
glGetPointerv()
glIsEnabled()
 

OpenGL渲染流水線:

大多數OpenGL應用程式都採用一個相似的操作順序,這一系列處理階段被稱作OpenGL的渲染流水線(Pipeline)
OpenGL1.4開始支持可編程流水線,加入了頂點編程功能; OpenGL1.5全面支持可編程流水線,包括頂點編程和圖元編程.
現在的顯卡一般都支援兩條渲染流水線:固定功能流水線(Fixed Function Pipeline)和可編程圖形流水線(Programmable Pipeline). 本課程主講固定功能流水線,也就是傳統的三維圖形學流水線. 這裏所講的渲染流水線就是指固定功能流水線. 

OpenGL的渲染流水線的構架基於電腦圖形學的基本原理
對於一個實際的OpenGL程式,並不一定會應用渲染流水線中的每一步操作
 
熟練掌握渲染流水線是學習好OpenGL的關鍵,渲染流水線也是學習OpenGL的綱領
以後的每一章節基本上是對流水線某一部分的展開闡述
總而言之,對於OpenGL本身,這套流水線機制是最重要的,應該時時復習和回顧
 
OpenGL渲染流水線的兩條資料處理路徑
頂點資料,基本的幾何資料
圖元資料,圖像特效,紋理資料

頂點數據:
物體都用圖元(Primitive)表示,圖元的實質就是點集,在OpenGL中,所有的物體、幾何元素最終都以頂點的形式描述
頂點資料包括頂點位置(即空間座標)、大小、顏色、頂點法向量(用於光照計算)、紋理座標(可能有多個)等等

求值器:
參數化的曲面曲線(如貝塞爾,NURBS曲面曲線)並不直接給出頂點,而是給出一系列控制點及其生成曲面曲線的函數
求值器的功能就是,通過控制點和生成函數,得到實際使用的頂點資料
對於非參數化曲面曲線,這一步是被忽略的

對每個頂點的操作:
通過模型、視圖變換矩陣,將所有頂點座標變換為以人眼坐標系下一致的座標
 確定要繪製的場景區域(視圖變換,改變視點的位置和方向)
 確定模型與要繪製的場景區域的位置關係(模型變換,移動模型)
 OpenGL中,將模型視圖變換結合為一個統一的矩陣
變換矩陣同樣改變物體的頂點法向量

如果啟動了紋理,還可能進行紋理座標轉換,以及自動紋理座標的生成
如果啟動了光照,則還需要利用光源、材質、轉換後的頂點位置和法向量計算每一個頂點的顏色
 
圖元裝配 :
通過投影變換,定義一個適當的視圖體
 透視投影視圖體,平截台體,形成正常觀察場景
 正交投影視圖體,成直角的平行六面體,應用於建築設計及電腦輔助設計
          

某些情況下,需要進行透視除法,以得到歸一化的設備座標
對於落在視圖體之外的物體,需要進行裁剪(Clip)操作
 點裁剪,直接刪除落在視圖體之外的頂點
 直線、多邊形裁剪,在刪除頂點的同時需要增加頂點(即直線、多邊形和視圖體形成的交點)
 
圖元裝配
視區變換,用來確定最終圖像的顯示位置和大小 

對每個頂點的操作和圖元裝配:

光柵化(Rasterization)
光柵化負責將幾何資料和圖元資料轉換為片元(Fragment)
片元和將來要顯示的圖元一一對應
為每一個片元指定顏色和深度值
霧(Fog)、紋理(Texture)操作

對每個片元(Fragment)的操作:
在片元資料最終寫入幀緩存前,還有一系列測試和處理過程
 剪取(Scissor)測試、alpha測試、範本(Stencil)測試、深度(Depth)測試
 融合(Blending)、抖動(Dithering)、邏輯操作 

幀緩存:
幀緩存內的資料將直接輸出到顯示器
可以啟動雙緩存模式
 
圖元資料:
圖元資料的兩種獲取模式
 由程式指定,直接存放在記憶體中
 從幀緩存中取得上一幀輸出圖像的資料
圖元資料可以直接傳遞給光柵化過程 

圖元操作:
圖元資料的讀取、寫入、拷貝
圖元傳遞
圖元映射
圖像的放大、縮小、翻轉
其他針對圖元的操作

紋理裝配:
OpenGL提供了一整套紋理映射的機制
紋理資料的兩種獲取方式:
 由程式指定,直接存放在記憶體中
 從幀緩存中取得上一幀輸出圖像作為紋理資料
紋理資料直接傳遞給光柵化過程

顯示列表(Display list):
顯示列表就是一組函數集,可以用來反復執行,以提高繪製速度
對頂點資料和幾何資料的處理都可以用顯示列表進行組織 


OpenGL相關函數庫:

OpenGL核心庫(GL)
OpenGL實用庫(GLU)
OpenGL輔助庫(GLAUX)
OpenGL工具庫(GLUT)
OpenGL對視窗系統的擴展(WGL,等等)
 
對於各個庫,函數功能可分為兩大類
渲染功能
 提供圖形繪製所需的各種功能函數
視窗管理功能
 管理視窗系統的所有相關功能,如鍵盤滑鼠的回應,各種視窗事件等等
 
OpenGL核心庫(GL):
這部分函數用於常規的、核心的圖形處理,是OpenGL的核心部分
包含300多個函數,函數名首碼一律是“gl”
Windows平臺上
 頭文件“GL.H”
 庫文件“OPENGL32.LIB”
 動態連結程式庫“OPENGL32.DLL”
核心庫可以在所有的OpenGL平臺上運行
 
OpenGL實用庫(GLU):
這部分函數通過調用核心庫的函數,為開發者提供相對簡單的用法,實現一些較為複雜的操作。如:座標變換、紋理映射、繪製橢球、茶壺等簡單多邊形
包含約50個函數,函數名首碼一律是“glu”
Windows平臺上
 頭文件“GLU.H”
 庫文件“GLU32.LIB”
 動態連結程式庫“GLU32.DLL”
實用庫可以在所有的OpenGL平臺上運行
 
OpenGL輔助庫(GLAUX):
這部分函數提供視窗管理、輸入輸出處理以及繪製一些簡單三維物體
包含約30個函數,函數名首碼一律是“aux”
Windows平臺上
 頭文件“GLAUX.H”
 庫文件“GLAUX.LIB”
 動態連結程式庫“GLAUX.DLL”
OpenGL中的輔助庫不能在所有的OpenGL平臺上運行
 
OpenGL工具庫(GLUT):
由Mark Kilgard開發
這部分函數主要提供基於視窗的工具,以及一些繪製較複雜物體的函數
包含大約30多個函數,函數名首碼為“glut”
Windows平臺上
 頭文件“GLUT.H”
 庫文件“GLUT32.LIB”
 動態連結程式庫“GLUT32.DLL”
glut中的視窗管理函數不依賴於運行環境的,可以在所有的OpenGL平臺上運行
 
OpenGL對視窗系統的擴展:
對於各類視窗系統,OpenGL都提供了一個擴展庫
對於Windows系統,OpenGL提供WGL庫
 並不是所有的函數首碼都是“wgl”
 用於連接OpenGL和Windows,在Windows平臺上設置OpenGL環境
 頭檔、庫檔和動態連結程式庫都和Windows GDI一樣,由Windows底層提供,頭檔是“WINGDI.H”
 只能在Windows平臺上運行
 
OpenGL程式開發中,常用的函數庫組合:
GL + GLU + GLUT(跨平臺)
 視窗控制GLUT,採用GLUT的消息處理機制
 圖形繪製GL + GLU + GLUT中的繪製函數
GL + GLU + WGL(僅限於Windows程式)
 視窗控制WGL,採用Windows的消息處理機制
 圖形繪製GL + GLU + WGL中的繪製函數
入門階段,最好是使用GLUT
編制較高級的Windows相關的繪製程式時,最好使用WGL
 
函數庫的使用方式:
包含各個庫的頭檔
 程式中直接聲明 include “*.h”
引用各個庫的庫檔
 在開發工具的工程設置中加入對 “*.lib” 的引用
將各個庫的動態連結程式庫放在系統目錄(對於Windows2000來說是“WINNT\System32”目錄)下或者是程式的運行目錄下
 

使用GLUT函數庫:

創建視窗及初始化操作
回調函數(Callback function)
程式主迴圈
使用雙緩存
繪製三維物體
例子說明
 

創建視窗及初始化操作:
一共五個函數,一般在程式開始時連續調用
glutInit(int *argc, char **argv)
 初始化GLUT
glutInitDisplayMode(unsigned int mode)
 指定所創建視窗的特性,如,是RGBA模式還是顏色索引模式,單緩存模式還是雙緩存模式,是否有深度緩存
 
glutInitWindowPosition(int x, int y)
 視窗左上角在螢幕上的位置
glutInitWindowSize(int width, int size)
 視窗的尺寸,以螢幕圖元為單位
int glutCreateWindow(char *string)
 創建OpenGL場景視窗,string是視窗名稱,並返回一個新視窗的識別字
 
回調函數(Callback function):
回調函數是一個重要的概念,是GLUT的重要實現機制
在Windows所提供的API和DirectX中,也有大量的回調函數
 
回調函數由用戶提供,但由系統(這裏是GLUT)調用
用戶按照系統給定的格式提供回調函數
系統通過註冊函數給定回調函數的格式
註冊函數和回調函數一一對應,註冊函數負責在系統中登記回調函數
 
註冊函數原型:
 RegisterFunc(Type (*func)(ParameterList))
 Type定義了回調函數的返回值類型
 ParameterList定義了回調函數的參數列表
該註冊函數對應的回調函數原型:
 Type func(ParameterList)
 
兩個步驟:
 根據註冊函數的格式,聲明並定義回調函數
 在程式合適的地方,以回調函數名為參數調用註冊函數
 
常用的GLUT回調函數:
顯示(Display)
形狀改變(Reshape)
鍵盤(Keyboard)
滑鼠(Mouse)
滑鼠按鍵並移動(Motion)
後臺處理
 
回調函數-顯示(Display):
註冊函數
 void glutDisplayFunc(void (*func)(void))
回調函數
 void (*func)(void)
視窗需要重新繪製時調用該回調函數
 
重新繪製的顯式啟動函數:
可以在程式中顯式的啟動繪製回調函數
void glutPostRedisplay(void)
 
回調函數-形狀改變(Reshape):
註冊函數
 void glutReshapeFunc(void (*func)(int width, int height))
回調函數
 void (*func)(int width, int height)
視窗移動或者縮放時調用該回調函數
 參數width和height表示新的視窗大小
 
回調函數-鍵盤(Keyboard):
註冊函數
 void glutKeyboardFunc(void (*func)(unsigned int key, int x, int y))
回調函數
 void (*func)(unsigned int key, int x, int y)
按下生成ASCII字元的鍵時調用該回調函數
 key值是生成的ASCII字元
 x和y是當前滑鼠位置
 
回調函數-滑鼠(Mouse):
註冊函數
 void glutMouseFunc(void (*func)(int button, int state, int x, int y))
回調函數
 void (*func)(int button, int state, int x, int y)
按下或釋放滑鼠按鍵時調用該回調函數
 button表示是那一個滑鼠鍵
 state表示滑鼠鍵是按下還是釋放
 x和y是當前滑鼠位置
 
回調函數-滑鼠按鍵並移動(Motion):
註冊函數
 void glutMotionFunc(void (*func)(int x, int y))
回調函數
 void (*func)(int x, int y)
按下一個或多個滑鼠鍵並拖動滑鼠時調用該回調函數
 x和y是當前滑鼠位置
 
回調函數-後臺處理:
註冊函數
 void glutIdleFunc(void (*func)(void))
回調函數
 void (*func)(void)
沒有其他待處理的事件時,就執行該回調函數,可以用來實現無需交互的連續動畫處理或進行其他後臺處理
 
程式主迴圈:
void glutMainLoop(void)
初始化完成後,調用該函數,進入程式主迴圈(即事件處理迴圈)
迴圈過程中,如果有鍵盤、滑鼠、重繪等事件,系統自動調用相應的回調函數,回調函數結束後,程式自動返回主迴圈
 
使用雙緩存:
以GLUT_DOUBLE為參數調用glutInitDisplayMode,設置雙緩存的視窗模式
在顯示回調函數的最後調用glutSwapBuffers()函數
 
繪製三維物體:
GLUT提供了一些複雜三維模型的繪製函數
每個三維模型都提供了兩種繪製模式
 線框模式,僅顯示模型的線框圖
 實體模式,顯示包括陰影效果的完整模型
 
例子說明-程式構成:
由五個函數組成
 main函數,程式主入口、出口函數 
 init函數,OpenGL自身內容初始化,如設定視點位置,設置投影矩陣等等
 mouse函數,回應滑鼠消息的回調函數
 keyboard函數,回應鍵盤消息的回調函數
 display函數,回應重新繪製視窗消息的回調函數

例子說明-init函數 :
簡單初始化OpenGL自身
void init (void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

例子說明-顯示回調函數:
繪製一個矩形
void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glBegin(GL_POLYGON);
      glVertex3f (0.25, 0.25, 0.0);
      glVertex3f (0.75, 0.25, 0.0);
      glVertex3f (0.75, 0.75, 0.0);
      glVertex3f (0.25, 0.75, 0.0);
   glEnd();
   glutSwapBuffers();
}
 
例子說明-鍵盤消息回調函數:
當按下“ESC”鍵時程式退出
void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}
 
例子說明-滑鼠消息回調函數:
當點擊滑鼠左鍵時程式退出
void mouse(int button, int state, int x, int y)
{
   switch (button) {
      case GLUT_LEFT_BUTTON:
           exit(0);
         break;
   }
}
 

例子說明-通用範本:
所有使用GLUT的OpenGL程式的模式都與本例相似
 實現main函數,初始化OpenGL環境,調用init,註冊各個回調函數,進入主迴圈
 實現init函數
 實現各個回調函數
 
例子說明-Demo演示
 

使用WGL函數庫:

初始化OpenGL環境
指定圖元格式(Pixel format)
初始化OpenGL窗口
清除OpenGL環境
使用雙緩存
程式範本
例子說明
 
指定圖元格式(Pixel format):
在Windows程式中,設置所期望的圖元格式(Pixel format),是初始化OpenGL環境的第一步
在PIXELFORMATDESCRIPTOR結構中設置所期望的OpenGL環境,如顏色類型(RGBA或顏色索引)、單緩存或雙緩存、深度緩存等等
 
初始化OpenGL窗口:
在使用OpenGL函數時必須指定一個所謂的渲染上下文(Render context),這是初始化OpenGL環境的第二步
創建RC
 HGLRC wglCreateContext(HDC hdc)
 hdc是Windows的視窗DC,可在創建視窗後通過Win32方法GetDC獲得
將窗口與當前RC關聯
 BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc)
 hdc是Windows的窗口DC
 hglrc是待關聯的RC
 
初始化OpenGL環境:
連續調用ChoosePixelFormat、SetPixelFormat函數設置圖元格式
連續調用wglCreateContext、wglMakeCurrent函數創建並關聯RC
 
清除OpenGL環境:
解除窗口和RC的關聯
 BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc)
 將hglrc設為NULL,hdc參數被忽略
刪除RC
 BOOL wglDeleteContext(HGLRC hglrc)
 hglrc是待刪除的RC
釋放DC
 通過Win32方法ReleaseDC釋放視窗DC
 
使用雙緩存:
設置圖元格式時,設置PIXELFORMATDESCRIPTOR結構的dwFlags項為PFD_DOUBLEBUFFER
在顯示回調函數的最後調用函數SwapBuffers
 
程式範本:
 對於Frame/View/Document的程式結構,回應View的消息
 WM_CREATE消息時創建RC,初始化OpenGL自身
 WM_CLOSE或WM_DESTROY到來時刪除RC
 WM_PAINT消息時執行繪製操作,如果使用MFC,則實現OnDraw函數
 WM_SIZE消息時設置視口大小


OpenGL相關資源:

OpenGL官方網站
http://www.opengl.org/
NVIDIA顯卡廠商網上技術論壇
http://developer.nvidia.com/page/home
ATI顯卡廠商網上技術論壇
http://www.ati.com/developer/

MSDN上關於OpenGL部分的幫助文件檔案
Platform SDK Documentation\Graphics and Multimedia Services\OpenGL

OpenGL1.5 Specification
OpenGL state machine
GLUT開發包
GLUT3.0 Specification
紅皮書電子版(英文)及源碼
N.Robins的OpenGL教程




誰推薦這篇文章
引用 (你可以針對此文寫一篇屬於自己的blog/想法,並給作者一個通告)
引用
留言 (0筆) (此文章不開放回應)
檢視行動版網頁  |  檢視正常版網頁