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