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