2011-02-03 53 views
4

如您所知,C++沒有標準圖形庫。大多數遊戲使用DirectX或OpenGL。C++圖形庫的內部工作

但是這些庫如何工作?換句話說,如果C++沒有它的機制,第三方庫如何繪製圖形?他們是用另一種語言寫的嗎?

回答

6

具體的DirectX和OpenGL通過調用操作系統和/或vid eo硬件驅動程序。驅動程序反過來通過與圖形設備交互來完成實際繪圖。交互的具體細節因顯卡而異。

回到DOS時代,C++程序員可以直接使用硬件。這是通過兩種方式完成的。首先,通過寫入/讀取存儲像素或文本的特殊內存塊(「幀緩衝區」)。它是一個已知地址的內存跨度,所以要使用它,必須將一個整型常量轉換爲一個指針並使用該指針。純粹的C++機制。另一種交互方式是從I/O端口讀取/寫入。現在,這是一種C不直接支持的機制,除非您想要計算內聯彙編或編譯器內在函數。有兩個庫函數會包裝這兩個操作(字面上,圍繞兩個CPU命令--INP和OUTP),但大多數程序員只會使用單行內聯彙編代碼段。即使在現在,大多數視頻硬件交互歸結爲這兩種路徑 - 幀緩衝和I/O端口(DMA和中斷通常不用於圖形)。但是我們應用程序級的程序員不會去看那些。這是驅動程序的東西。

一個現代的警告與保護模式有關;在保護模式下,C指針是而不是與底層物理地址相同。即使在內核模式下,簡單地將0xA0000類型轉換爲指針也不會讓您進入幀緩衝區。然而,內核級代碼(即驅動程序)可以請求內存管理器給它一個對應於特定物理地址的指針。

6

他們會將他們的呼叫轉移到驅動程序,將它們發送到顯卡。

1

DirectX和OpenGL在相當低的水平上運行。那就是你說「畫一個三角形,現在畫一個正方形」。通常,程序員將這些調用包裝到提供更高級別功能的C++類中,例如「繪製模型,繪製樹」。這被稱爲引擎。

我建議考慮看看訥河教程的詳細信息:http://nehe.gamedev.net/


因此,例如呼叫繪製在OpenGL三角形看起來是這樣的:

GLBegin(BEGIN_POLYGONS); 
GLVector3(0,0,0); 
GLVector3(10,10,0); 
GLVector3(-10,10,0); 
GLEnd(); 

而且就像我說過的,看到上面的NeHe教程的鏈接,它們全都在C/C++

+0

引擎通常是一個更高層次的概念,位於場景圖之類的東西之上。 – Eric 2011-02-03 14:24:45

+0

除非你的引擎包含你的屏幕圖。 Ogre3D,Crystal Space,XNA和Irrlicht都是引擎,都包含屏幕圖形 – 2011-02-03 14:31:52