OpenGL基本理解
OpenGL是一個與硬件圖形發(fā)生器的軟件接口,它包括了100多個圖形操作函數(shù),開發(fā)者可以利用這些函數(shù)來構(gòu)造景物模型、進行三維圖形交互軟件的開發(fā)。正如上一章所述,OpenGL是一個高性能的圖形開發(fā)軟件包。OpenGL支持網(wǎng)絡(luò),在網(wǎng)絡(luò)系統(tǒng)中用戶可以在不同的圖形終端上運行程序顯示圖形。 OpenGL作為一個與硬件獨立的圖形接口,它不提供與硬件密切相關(guān)的設(shè)備操作函數(shù),同時,它也不提供描述類似于飛機、汽車、分子形狀等復雜形體的圖形操作函數(shù)。用戶必須從點、線、面等最基本的圖形單元開始構(gòu)造自己的三維模型。當然,象OpenInventor那樣更高一級的基于OpenGL的三維圖形建模開發(fā)軟件包將提供方便的工具。因此OpenGL的圖形操作函數(shù)十分基本、靈活。例如OpenGL中的模型繪制過程就多種多樣,內(nèi)容十分豐富,OpenGL提供了以下的對三維物體的繪制方式:
網(wǎng)格線繪圖方式(wireframe)
這種方式僅繪制三維物體的網(wǎng)格輪廓線。
深度優(yōu)先網(wǎng)格線繪圖方式(depth_cued)
用網(wǎng)格線方式繪圖,增加模擬人眼看物體一樣,遠處的物體比近處的物體要暗些。
反走樣網(wǎng)格線繪圖方式(antialiased)
用網(wǎng)格線方式繪圖,繪圖時采用反走樣技術(shù)以減少圖形線條的參差不齊。
平面消隱繪圖方式(flat_shade)
對模型的隱藏面進行消隱,對模型的平面單元按光照程度進行著色但不進行光滑處理。
光滑消隱繪圖方式(smooth_shade)
對模型進行消隱按光照渲染著色的過程中再進行光滑處理,這種方式更接近于現(xiàn)實。
加陰影和紋理的繪圖方式(shadows、textures)
在模型表面貼上紋理甚至于加上光照陰影,使得三維景觀象照片一樣。
運動模糊的繪圖方式(motion-blured)
模擬物體運動時人眼觀察所感覺的動感現(xiàn)象。
大氣環(huán)境效果(atmosphere-effects)
在三維景觀中加入如霧等大氣環(huán)境效果,使人身臨其境。
深度域效果(depth-of-effects)
類似于照相機鏡頭效果,模型在聚焦點處清晰,反之則模糊。
這些三維物體繪圖和特殊效果處理方式,說明OpenGL已經(jīng)能夠模擬比較復雜的三維物體或自然景觀,這就是我們所面對的OpenGL。
OpenGL基礎(chǔ)程序結(jié)構(gòu)
用OpenGL編寫的程序結(jié)構(gòu)類似于用其他語言編寫的程序。實際上,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”。此外,為便于各類讀者同時快速入門,在短時間內(nèi)掌握OpenGL編程的基本方法和技巧,指南中例子盡量采用標準ANSI C調(diào)用OpenGL函數(shù)來編寫,而且所有例程都只采用OpenGL附帶的輔助庫中的窗口系統(tǒng)。此外,這樣也便于程序在各平臺間移植,尤其往工作站UNIX 操作系統(tǒng)移植時,也只需改動頭文件等很少很少的部分。下面列出一個簡單的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);
}
這個程序運行結(jié)果是在屏幕窗口內(nèi)畫一個紅色的方塊。
下面具體分析整個程序結(jié)構(gòu):首先,在程序最開始處是OpenGL頭文件:《GL/gl.h》、《GL/glaux.h》。前一個是gl庫的頭文件,后一個是輔助庫的頭文件。此外,在以后的幾章中還將說明OpenGL的另外兩個頭文件,一個是《GL/glu.h》實用庫的頭文件,另一個是《GL/glx.h》X窗口擴充庫的頭文件(這個常用在工作站上)。接下來是主函數(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)為窗口的左上角點的屏幕坐標,后兩個參數(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編程繪制物體必須意識到任何一個物體都是三維的,具有空間性,而顯示于屏幕上的物體都是三維物體在二維平面上的投影。
從表面上看,上述程序代碼很簡單,實際上已經(jīng)用到了缺省的投影形式(正射投影)。再看glFlush()函數(shù),表示強制繪圖完成。最后一句_sleep(1000),參數(shù)單位為毫秒,整句意思是保持現(xiàn)有狀況一秒鐘,然后結(jié)束程序運行。這個函數(shù)是VC++的庫函數(shù)。
總而言之,OpenGL程序基本結(jié)構(gòu)為定義窗口、清理窗口、繪制物體、結(jié)束運行。
評論