DirectX和OpenGL都是非常優(yōu)秀的圖形庫(kù)。DirectX工作在Microsoft平臺(tái)上,而OpenGL可以應(yīng)用到更加廣泛的平臺(tái)上。DirectX更新得更快,意味著它可以利用最新的圖形功能。OpenGL的更新較慢,最新的圖形功能只能通過(guò)一個(gè)不太方便的擴(kuò)展機(jī)制使用。OpenGL這種緩慢的更新有一個(gè)明顯的好處,即接口很少發(fā)生改變,所以多年前編寫的代碼仍然可以使用最新的OpenGL版本。DirectX的每個(gè)新版本都會(huì)改變接口,所以無(wú)法維持兼容性,必須調(diào)整和修改較老的代碼才能使它們利用DirectX的新版本。
通過(guò)Managed DirectX庫(kù),可以在C#中使用DirectX,但遺憾的是,官方不再支持或更新這些庫(kù)。Managed DirectX已經(jīng)被Microsoft的XNA游戲創(chuàng)建庫(kù)替代。XNA使用DirectX,但它是一個(gè)更高層的框架,用于快速創(chuàng)建游戲原型和開發(fā)游戲。SlimDX是一個(gè)針對(duì)DirectX開發(fā)的獨(dú)立的C# API,可以作為Managed Directx的一個(gè)不錯(cuò)的替代品。
2.1 OpenGL的架構(gòu)
OpenGL是一個(gè)C風(fēng)格的圖形庫(kù)。C風(fēng)格是指OpenGL中沒有類或?qū)ο?,而只有大量的函?shù)。OpenGL在內(nèi)部就是一個(gè)狀態(tài)機(jī)。函數(shù)調(diào)用會(huì)修改OpenGL的內(nèi)部狀態(tài),這又會(huì)影響OpenGL的行為和在屏幕上渲染多邊形的方式。OpenGL是狀態(tài)機(jī)這個(gè)事實(shí)會(huì)帶來(lái)一些問題,例如在代碼中無(wú)意間修改了其他某個(gè)部分的狀態(tài),從而導(dǎo)致出現(xiàn)bug。因此,留意哪些狀態(tài)發(fā)生改變十分重要。
2.1.1 頂點(diǎn):3D圖形的基礎(chǔ)
OpenGL中的基本單元是頂點(diǎn)。簡(jiǎn)單來(lái)說(shuō),頂點(diǎn)就是空間中的一個(gè)點(diǎn)。在這些點(diǎn)上可以附加其他信息,如它如何映射到紋理,是否具有一定的重量或顏色等,但是最重要的信息是它的位置。
游戲會(huì)把大量的時(shí)間用于發(fā)送OpenGL頂點(diǎn),或者告訴OpenGL以特定的方式移動(dòng)頂點(diǎn)等。游戲可能首先告訴OpenGL它將要發(fā)送的全部頂點(diǎn)會(huì)構(gòu)成三角形。此時(shí),OpenGL將使用線把它收到的每三個(gè)頂點(diǎn)連接起來(lái)以創(chuàng)建一個(gè)多邊形,然后可能還會(huì)使用紋理或顏色填充多邊形的表面。
現(xiàn)代圖形硬件非常擅長(zhǎng)處理大量的頂點(diǎn),把它們構(gòu)成多邊形,然后渲染到屏幕上。這個(gè)從頂點(diǎn)到屏幕的過(guò)程叫做流水線(pipeline)。流水線負(fù)責(zé)定位頂點(diǎn)和提供光照,以及進(jìn)行投影變換。這個(gè)過(guò)程將把收到的3D數(shù)據(jù)變換為2D數(shù)據(jù),以便將其顯示到屏幕上。投影變換聽起來(lái)有點(diǎn)復(fù)雜,但是幾個(gè)世紀(jì)以來(lái),畫家和藝術(shù)家們一直在利用這種變換,在平展的畫布上繪制出他們周圍的世界。
就算現(xiàn)代的2D游戲也是使用頂點(diǎn)創(chuàng)建的。2D精靈(sprite)由兩個(gè)三角形構(gòu)成,這兩個(gè)三角形形成了一個(gè)四邊形(quad)。在給四邊形提供紋理后,它就成為了精靈。2D游戲使用一種特殊的投影變換,忽略了頂點(diǎn)中的所有3D數(shù)據(jù),因?yàn)?D游戲中并不需要這些數(shù)據(jù)。
2.1.2 流水線
流水線的流程如圖2-3所示。這個(gè)流水線叫做固定功能流水線(fixed function pipeline)。當(dāng)程序員為這種流水線提供輸入后,所有的功能已被固定,無(wú)法修改。例如,在像素處理階段很容易向屏幕上添加藍(lán)色調(diào),但是在固定功能流水線中,程序員無(wú)法直接控制這個(gè)階段。