與像素著色器和頂點(diǎn)著色器相比,幾何著色器加入的時間較晚。幾何著色器以一個完整的圖元(如線、點(diǎn)或三角形組成的帶)作為輸入,而頂點(diǎn)著色器針對每個圖元都會運(yùn)行。幾何著色器可以創(chuàng)建新的頂點(diǎn)信息、點(diǎn)、線,甚至圖元。幾何著色器還可用于創(chuàng)建點(diǎn)精靈和動態(tài)鑲嵌,以及實(shí)現(xiàn)其他一些效果。點(diǎn)精靈可以快速渲染大量精靈,這種技術(shù)經(jīng)常用于粒子系統(tǒng),可創(chuàng)建類似于火焰或者煙霧效果。動態(tài)鑲嵌可以在幾何形狀中添加更多的多邊形。這種技術(shù)可以用來增加包含多邊形數(shù)較少的游戲模型的平滑度,并在攝像機(jī)放大模型時展現(xiàn)更多的細(xì)節(jié)。
像素著色器會應(yīng)用到被發(fā)送到幀緩沖區(qū)的每個像素。像素著色器用于創(chuàng)建凹凸貼圖效果、鏡面高光和逐像素光照。凹凸貼圖效果可以給表面增加額外的高度信息。凹凸貼圖通常包含一個圖片,其中每個像素代表一個標(biāo)準(zhǔn)的法向量,該法向量描述了如何扭曲表面。像素著色器可以使用凹凸貼圖來為模型提供一個更有趣的紋理,使其看上去有一定的深度感。逐像素光照用于替換OpenGL的默認(rèn)的光照公式。OpenGL的光照公式可計(jì)算出每個頂點(diǎn)的光照,然后為該頂點(diǎn)提供一種合適的顏色。逐像素光照使用更精確的光照模型,為每個像素單獨(dú)應(yīng)用光照。鏡面高光是模型中非常亮、反射大量光的區(qū)域。
2.2 變化中的OpenGL
現(xiàn)在是學(xué)習(xí)OpenGL的大好時機(jī)。OpenGL的當(dāng)前版本非常適合學(xué)習(xí)。這個版本中包含了大量易于使用的函數(shù),可以完成各種各樣與圖形處理有關(guān)的工作??梢园袿penGL的當(dāng)前版本想象成一個帶有輔助輪的自行車,剛開始時借助它們學(xué)習(xí)怎么騎車,熟練之后就把它們?nèi)∠聛?。OpenGL的下一個版本更像是一個性能強(qiáng)大的摩托車,沒有必要的東西都被移除了,剩下的就是不受限制的原始力量。對于有經(jīng)驗(yàn)的OpenGL程序員,其好處自不必言,但是初學(xué)者卻容易對其望而生畏。
可以使用的OpenGL版本要取決于系統(tǒng)中安裝的圖形卡驅(qū)動程序。幾乎每臺計(jì)算機(jī)都支持OpenGL 2.1,而近期生產(chǎn)的圖形卡會支持OpenGL 3.x。
2.2.1 OpenGL ES
OpenGL ES是用于嵌入式系統(tǒng)的OpenGL的新版本。它與OpenGL的近期版本相似,但是功能集更加受限。它用于高端手機(jī),例如Android、BlackBerry和iPhone。OpenGL ES也用于軍用硬件,例如戰(zhàn)機(jī)上的平視顯示器。
OpenGL ES支持可編程流水線,也支持著色器。
2.2.2 WebGL
WebGL目前仍處于開發(fā)中,這個版本的OpenGL是專為在Web上使用而設(shè)計(jì)的。使用WebGL的瀏覽器必須支持HTML 5 canvas標(biāo)簽。就現(xiàn)在而言,還無法知道它會取得多大的成功。以前人們曾有過在Web上使用3D的嘗試,但是都失敗了。例如,VRML(Virtual Reality Modeling Language,虛擬現(xiàn)實(shí)建模語言)與HTML類似,但是允許用戶創(chuàng)建3D世界,它在學(xué)術(shù)界受到了不少關(guān)注,卻從沒有吸引過普通的用戶。
WebGL有一些強(qiáng)有力的支持者,許多大公司都加入了WebGL工作組,如Google、Apple和Mozilla,而且WebGL還有一些讓人印象非常深刻的演示。就目前來看,WebGL的性能還是不錯的,在成熟以后很可能可以與Flash一較高低。
2.3 OpenGL和圖形卡
OpenGL是一個允許程序員發(fā)送指令到圖形卡的庫。圖形卡是一種專用于顯示3D數(shù)據(jù)的硬件,由很多標(biāo)準(zhǔn)組件構(gòu)成,包括幀緩沖區(qū)、紋理內(nèi)存和GPU。GPU是圖形處理單元(Graphics Processing Unit)的縮寫,它控制著如何處理頂點(diǎn)并把它們顯示到屏幕上。CPU向GPU發(fā)送指令和數(shù)據(jù),描述每一幀應(yīng)該怎樣顯示到屏幕上。紋理內(nèi)存通常是一塊較大的內(nèi)存,用于存儲游戲所需的大量紋理。幀緩沖區(qū)是內(nèi)存中的一塊區(qū)域,存儲下一幀中將顯示到屏幕上的圖像。現(xiàn)代的圖形卡通常有多個GPU,每個GPU上都有許多著色器處理單元來執(zhí)行大規(guī)模的并行著色器操作。分布式應(yīng)用程序(如模擬蛋白質(zhì)折疊的Folding@home)和世界各地的數(shù)十萬臺計(jì)算機(jī)都利用了這一特點(diǎn)。
第一個獲得流行的3D圖形卡是3dfx Voodoo 1。這是早期的一個圖形卡,有2MB的紋理內(nèi)存和2MB的幀緩沖區(qū),并且使用PCI總線,時鐘速度為135MHz。早期的一些游戲使用它來加速執(zhí)行,例如《古墓麗影(Tomb Raider)》、Descent II、《雷神之錘(Quake)》以及《雷神之錘2(Quake 2)》的演示,從而運(yùn)行得更加流暢,并且可顯示更多的細(xì)節(jié)。Voodoo 1使用一個標(biāo)準(zhǔn)的PCI總線,允許CPU以最高533MB/s的速度向圖形卡發(fā)送數(shù)據(jù)。現(xiàn)代的圖形卡已經(jīng)從PCI轉(zhuǎn)向使用AGP(Accelerated Graphics Port,加速圖形端口),其最高數(shù)據(jù)發(fā)送速度為2GB/s,后來又轉(zhuǎn)向使用PCI Express。當(dāng)前的這一代PCI Express卡的最高數(shù)據(jù)發(fā)送速度為8GB/s。
好像每個月都會有新的圖形卡問世,每個新圖形卡都比之前的圖形卡更快。在編寫本書時,最快的圖形卡可能是ATI Radeon HD 5970。它有兩個GPU,每個GPU都有1600個著色器處理器。它的時鐘速度為725MHz,每秒可以處理4.64萬億次浮點(diǎn)運(yùn)算。
大多數(shù)現(xiàn)代圖形卡都有專門執(zhí)行新操作的特殊硬件。這種硬件通過使用擴(kuò)展提供給OpenGL。當(dāng)收到一個標(biāo)識新擴(kuò)展的字符串時,OpenGL能夠展示驅(qū)動程序和圖形卡中的功能。例如,ATI Radeon HD 5970有兩個GPU,這種情況很少見。為了能夠充分利用兩個GPU,需要使用一些新的擴(kuò)展方法,如AMD_gpu_association。這個擴(kuò)展允許用戶在兩個GPU之間分配任務(wù)。如果多家供應(yīng)商實(shí)現(xiàn)了相同的擴(kuò)展,那么擴(kuò)展字符串的某個位置會有字母EXT。有時候,控制OpenGL規(guī)范的架構(gòu)評審委員會可能會把某個擴(kuò)展的狀態(tài)提升為官方擴(kuò)展,此時,擴(kuò)展字符串中將包含字母ARB,所有的供應(yīng)商都必須支持該擴(kuò)展。