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