OpenGL基本概念
OpenGL(全寫Open Graphics Library)是指定義了一個跨編程語言、跨平臺的編程接口規格的專業的圖形程序接口。它用于三維圖像(二維的亦可),是一個功能強大,調用方便的底層圖形庫。
OpenGL? 是行業領域中最為廣泛接納的 2D/3D 圖形 API,其自誕生至今已催生了各種計算機平臺及設備上的數千優秀應用程序。OpenGL? 是獨立于視窗操作系統或其它操作系統的,亦是網絡透明的。在包含CAD、內容創作、能源、娛樂、游戲開發、制造業、制藥業及虛擬現實等行業領域中,OpenGL? 幫助程序員實現在 PC、工作站、超級計算機等硬件設備上的高性能、極具沖擊力的高視覺表現力圖形處理軟件的開發。
OpenGL使人們進入三維圖形世界
我們生活在一個充滿三維物體的三維世界中,為了使計算機能精確地再現這些物體,我們必須能在三維空間描繪這些物體。我們又生活在一個充滿信息的世界中,能否盡快地理解并運用這些信息將直接影響事業的成敗,所以我們需要用一種最直接的形式來表示這些信息。
最近幾年計算機圖形學的發展使得三維表現技術得以形成,這些三維表現技術使我們能夠再現三維世界中的物體,能夠用三維形體來表示復雜的信息,這種技術就是可視化(Visualization)技術。可視化技術使人能夠在三維圖形世界中直接對具有形體的信息進行操作,和計算機直接交流。這種技術已經把人和機器的力量以一種直覺而自然的方式加以統一,這種革命性的變化無疑將極大地提高人們的工作效率。可視化技術賦予人們一種仿真的、三維的并且具有實時交互的能力,這樣人們可以在三維圖形世界中用以前不可想象的手段來獲取信息或發揮自己創造性的思維。機械工程師可以從二維平面圖中得以解放直接進入三維世界,從而很快得到自己設計的三維機械零件模型。醫生可以從病人的三維掃描圖象分析病人的病灶。軍事指揮員可以面對用三維圖形技術生成的戰場地形,指揮具有真實感的三維飛機、軍艦、坦克向目標開進并分析戰斗方案的效果。
更令人驚奇的是目前正在發展的虛擬現實技術,它能使人們進入一個三維的、多媒體的虛擬世界,人們可以游歷遠古時代的城堡,也可以遨游浩翰的太空。所有這些都依賴于計算機圖形學、計算機可視化技術的發展。人們對計算機可視化技術的研究已經歷了一個很長的歷程,而且形成了許多可視化工具,其中SGI公司推出的GL三維圖形庫表現突出,易于使用而且功能強大。利用GL開發出來的三維應用軟件頗受許多專業技術人員的喜愛,這些三維應用軟件已涉及建筑、產品設計、醫學、地球科學、流體力學等領域。隨著計算機技術的繼續發展,GL已經進一步發展成為OpenGL,OpenGL已被認為是高性能圖形和交互式視景處理的標準,目前包括ATT公司UNIX軟件實驗室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和 SGI公司在內的幾家在計算機市場占領導地位的大公司都采用了OpenGL圖形標準。
值得一提的是,由于Microsoft公司在 Windows NT中提供OpenGL圖形標準,OpenGL將在微機中廣泛應用,尤其是OpenGL三維圖形加速卡和微機圖形工作站的推出,人們可以在微機上實現三維圖形應用,如CAD設計、仿真模擬、三維游戲等,從而更有機會、更方便地使用OpenGL及其應用軟件來建立自己的三維圖形世界。
OpenGL概念建立
《》function StorePage(){d=document;t=d.selection?(d.selection.type!=‘None’?d.selection.createRange().text:‘’):(d.getSelection?d.getSelection():‘’);void(keyit=window.open(‘http://www.365key.com/storeit.aspx?t=’+escape(d.title)+‘&u=’+escape(d.location.href)+‘&c=’+escape(t),‘keyit’,‘scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes’));keyit.focus();.
OpenGL基本理解
OpenGL是一個與硬件圖形發生器的軟件接口,它包括了100多個圖形操作函數,開發者可以利用這些函數來構造景物模型、進行三維圖形交互軟件的開發。正如上一章所述,OpenGL是一個高性能的圖形開發軟件包。OpenGL支持網絡,在網絡系統中用戶可以在不同的圖形終端上運行程序顯示圖形。 OpenGL作為一個與硬件獨立的圖形接口,它不提供與硬件密切相關的設備操作函數,同時,它也不提供描述類似于飛機、汽車、分子形狀等復雜形體的圖形操作函數。用戶必須從點、線、面等最基本的圖形單元開始構造自己的三維模型。當然,象OpenInventor那樣更高一級的基于OpenGL的三維圖形建模開發軟件包將提供方便的工具。因此OpenGL的圖形操作函數十分基本、靈活。例如OpenGL中的模型繪制過程就多種多樣,內容十分豐富,OpenGL提供了以下的對三維物體的繪制方式:
網格線繪圖方式(wireframe)
這種方式僅繪制三維物體的網格輪廓線。
深度優先網格線繪圖方式(depth_cued)
用網格線方式繪圖,增加模擬人眼看物體一樣,遠處的物體比近處的物體要暗些。
反走樣網格線繪圖方式(antialiased)
用網格線方式繪圖,繪圖時采用反走樣技術以減少圖形線條的參差不齊。
平面消隱繪圖方式(flat_shade)
對模型的隱藏面進行消隱,對模型的平面單元按光照程度進行著色但不進行光滑處理。
光滑消隱繪圖方式(smooth_shade)
對模型進行消隱按光照渲染著色的過程中再進行光滑處理,這種方式更接近于現實。
加陰影和紋理的繪圖方式(shadows、textures)
在模型表面貼上紋理甚至于加上光照陰影,使得三維景觀象照片一樣。
運動模糊的繪圖方式(motion-blured)
模擬物體運動時人眼觀察所感覺的動感現象。
大氣環境效果(atmosphere-effects)
在三維景觀中加入如霧等大氣環境效果,使人身臨其境。
深度域效果(depth-of-effects)
類似于照相機鏡頭效果,模型在聚焦點處清晰,反之則模糊。
這些三維物體繪圖和特殊效果處理方式,說明OpenGL已經能夠模擬比較復雜的三維物體或自然景觀,這就是我們所面對的OpenGL。
OpenGL基礎程序結構
用OpenGL編寫的程序結構類似于用其他語言編寫的程序。實際上,OpenGL是一個豐富的三維圖形函數庫,編寫OpenGL程序并非難事,只需在基本C語言中調用這些函數,用法同Turbo C、Microsoft C等類似,但也有許多不同之處。
本指南所有的程序都是在Windows NT的Microsoft Visual C++集成環境下編譯連接的,其中有部分頭文件和函數是為這個環境所用的,例如判別操作系統的頭文件“glos.h”。此外,為便于各類讀者同時快速入門,在短時間內掌握OpenGL編程的基本方法和技巧,指南中例子盡量采用標準ANSI C調用OpenGL函數來編寫,而且所有例程都只采用OpenGL附帶的輔助庫中的窗口系統。此外,這樣也便于程序在各平臺間移植,尤其往工作站UNIX 操作系統移植時,也只需改動頭文件等很少很少的部分。下面列出一個簡單的OpenGL程序:
例4-1 OpenGL簡單例程(Simple.c)
#include 《GL/gl.h》
#include 《GL/glaux.h》
#include “glos.h”
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow(“simple”);
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
glFlush();
_sleep(1000);
}
這個程序運行結果是在屏幕窗口內畫一個紅色的方塊。
下面具體分析整個程序結構:首先,在程序最開始處是OpenGL頭文件:《GL/gl.h》、《GL/glaux.h》。前一個是gl庫的頭文件,后一個是輔助庫的頭文件。此外,在以后的幾章中還將說明OpenGL的另外兩個頭文件,一個是《GL/glu.h》實用庫的頭文件,另一個是《GL/glx.h》X窗口擴充庫的頭文件(這個常用在工作站上)。接下來是主函數main()的定義:一般的程序結構是先定義一個窗口:
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow(“simple”);
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)設置窗口顯示模式為RGBA方式,即彩色方式,并且圖形緩存為單緩存(SINGLE BUFFER)。 auxInitPosition(0, 0, 500, 500)定義窗口的初始位置,前兩個參數(0, 0)為窗口的左上角點的屏幕坐標,后兩個參數(500,500)為窗口的寬度和高度。auxInitWindow(“simple”)是窗口初始化,字符參數是窗口名稱。
然后是窗口內清屏:
glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT);
第一句將窗口清為黑色,第二句將顏色緩沖區清為glClearColor(0.0, 0.0, 0.0, 0.0)命令所設置的顏色,即同窗口背景顏色一致。
再接著是在窗口內畫一個物體:
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
很明顯,第一句設置物體顏色,函數中前三個參數分別為R、G、B值,最后一個參數是Alpha值,范圍都從0至1;第二句繪制一個二維矩形。注意:OpenGL是針對三維圖形而言,因此用作OpenGL編程繪制物體必須意識到任何一個物體都是三維的,具有空間性,而顯示于屏幕上的物體都是三維物體在二維平面上的投影。
從表面上看,上述程序代碼很簡單,實際上已經用到了缺省的投影形式(正射投影)。再看glFlush()函數,表示強制繪圖完成。最后一句_sleep(1000),參數單位為毫秒,整句意思是保持現有狀況一秒鐘,然后結束程序運行。這個函數是VC++的庫函數。
總而言之,OpenGL程序基本結構為定義窗口、清理窗口、繪制物體、結束運行。
OpenGL工作流程
整個OpenGL的基本工作流程如下圖:
其中幾何頂點數據包括模型的頂點集、線集、多邊形集,這些數據經過流程圖的上部,包括運算器、逐個頂點操作等;圖像數據包括象素集、影像集、位圖集等,圖像象素數據的處理方式與幾何頂點數據的處理方式是不同的,但它們都經過光柵化、逐個片元(Fragment)處理直至把最后的光柵數據寫入幀緩沖器。在OpenGL中的所有數據包括幾何頂點數據和象素數據都可以被存儲在顯示列表中或者立即可以得到處理。OpenGL中,顯示列表技術是一項重要的技術。
OpenGL要求把所有的幾何圖形單元都用頂點來描述,這樣運算器和逐個頂點計算操作都可以針對每個頂點進行計算和操作,然后進行光柵化形成圖形碎片;對于象素數據,象素操作結果被存儲在紋理組裝用的內存中,再象幾何頂點操作一樣光柵化形成圖形片元。
整個流程操作的最后,圖形片元都要進行一系列的逐個片元操作,這樣最后的象素值BZ送入幀緩沖器實現圖形的顯示。
OpenGL圖形操作步驟
在上一節中說明了OpenGL的基本工作流程,根據這個流程可以歸納出在OpenGL中進行主要的圖形操作直至在計算機屏幕上渲染繪制出三維圖形景觀的基本步驟:
1)根據基本圖形單元建立景物模型,并且對所建立的模型進行數學描述(OpenGL中把:點、線、多邊形、圖像和位圖都作為基本圖形單元)。
2)把景物模型放在三維空間中的合適的位置,并且設置視點(viewpoint)以觀察所感興趣的景觀。
3)計算模型中所有物體的色彩,其中的色彩根據應用要求來確定,同時確定光照條件、紋理粘貼方式等。
4)把景物模型的數學描述及其色彩信息轉換至計算機屏幕上的象素,這個過程也就是光柵化(rasterization)。
在這些步驟的執行過程中,OpenGL可能執行其他的一些操作,例如自動消隱處理等。另外,景物光柵化之后被送入幀緩沖器之前還可以根據需要對象素數據進行操作。
評論
查看更多