2008-10-25 50 views
35

我很有興趣瞭解可用於製作圖形應用程序的不同抽象層。我看到了很多術語:在抽象的最高級別,我聽到類似C#,.NET,Pyglet和pygame的東西。再往下看,我聽說DirectX和OpenGL。然後是DirectDraw,SDL,Win32 API以及其他多平臺庫,如WxWidgets。瞭解低級圖形編程

我怎樣才能很好地理解這些層中的哪一層結束以及下一層開始的位置?在Windows中創建窗口的最低可能級別是什麼?關於C++呢? (一個代碼示例將是神聖的。)在X11中怎麼樣? OpenGL和DirectX的Windows實現是否構建在Win32 API之上?我在哪裏可以開始瞭解這些事情?

還有另外一個關於SO的地方,建議Programming Windows。那麼Linux呢?有這樣的書嗎?

我知道這是非常低級的,並且有很多友好的工具可用,但我想至少了解表面下發生的事情的基礎知識。儘管我希望從蝙蝠身上開始撬動窗戶和載體,但從pygame這樣的東西開始,對我來說太高級了。我真的需要製作完整的概念電路如何在計算機上繪製東西

我當然會對書籍和資源的建議感到欣慰,但是如果對這個問題的回答充滿了很多不同的方法來使用不同的圖形編程方法來獲得「Hello world」,那麼我認爲這將是非常酷的。 C? C++?使用OpenGL?使用DirectX?在Windows XP上?在Ubuntu上?也許我要求太多。

+4

「那麼對於Linux呢?是否有相當於這樣的書?」 - 現在有一個 - http://www.amazon.com/The-Linux-Programming-Interface-Handbook/dp/1593272200 - 很少有一本書有100%的5星評級,39是相當不錯的樣本大小。 – 2012-09-10 09:01:55

+0

Max,我得到了同樣的問題,我只想知道你是否找到了解決你所有問題的方法,因爲這些問題也會讓我感到煩惱 – 2016-09-18 03:41:38

+0

@SurajJain,這並不多,但還有一些其他問題問,也可以讓你開始: http://stackoverflow.com/questions/235151/game-programming-how-to-avoid-reinventing-the-wheel http://stackoverflow.com/questions/12850071/what-is-the-simple-way-render-a-3d-cube-with-a-single-lighting-source – 2016-09-21 17:37:45

回答

21

Michael Abrash's Graphics Programming 'Black Book'是一個很好的開始。另外你可以免費下載!

+2

這是一個斷開的鏈接 – Prabu 2009-08-16 11:34:12

+1

Available at http://www.drdobbs.com/high性能計算/ 184404919(現在:))。 – 2010-08-25 00:45:49

2

馬上,我會說「你問得太多了。」從我所經歷的一點經驗來看,我會推薦閱讀一些教程或者從​​directX或OpenGL開始寫一本書。要比這更低,那將會非常複雜。我在OGL或DX中看到的大多數書籍都有很好的介紹,可以解釋函數/類的功能。

一旦你掌握了其中之一,你總是可以深入圖書館,看看他們究竟做了什麼來降低。

或者,如果你真的,絕對必須學習最低水平......在上面的帖子中閱讀這本書。

4

如果你真的想從底部開始,然後畫一條線是最基本的操作。計算機圖形只是填充網格(屏幕)上的像素,因此您需要計算出要填充哪些像素以獲取從(x0,y0)到(x1,y1)的線。

查看Bresenham's algorithm以瞭解涉及的內容。

2

的libx11是X11的最低水平庫。我相信opengl/directx直接與驅動程序/硬件對話(或模擬不支持的操作),所以它們將成爲最低級別的庫。

如果你想從非常開始低級編程,尋找x86的彙編代碼的VGA和啓動一個dosbox或類似的副本。

3

要成爲一名優秀的圖形和圖像處理程序員並不需要這麼低級的知識,但我討厭對自己使用的內部毫無頭緒。我看到有兩種方法可以實現這一目標 - 高層或底層。

自上而下是跟蹤動作如何從高級圖形操作(例如繪製圓圈到硬件)追蹤的問題。很好地瞭解OpenGL。然後Mesa的源代碼(免費!)提供了OpenGL如何在軟件中實現的窺視。 Xorg的來源將是下一個,首先看看該操作是如何從API調用通過客戶端到X服務器的。最後你深入一個與硬件接口的設備驅動程序。

自下而上:構建自己的圖形硬件。想想它可以連接到計算機的方式 - 如何通過幾個字節大小的寄存器處理大量像素,以及DMA如何工作。編寫一個設備驅動程序,並嘗試設計一個對應用程序員可能有用的圖形庫。

自下而上的方式是我從幾年前開始學習的,當時這是一種慢速8位微處理器的可能性。直接的電路和硬件 - 軟件接口經驗讓我很好地理解了困難的設計決策 - 例如使用巧妙的硬件,設備驅動程序或更高級別繪製矩形。這些都沒有實用的日常價值,但提供了理解新技術的知識基礎。

3

在MS Windows中很容易:你用什麼API提供,無論是標準windows編程API的DirectX API家族的:那你用什麼,他們是有據可查的。

在X windows環境中,您可以使用提供的任何X11庫文件。如果你想了解在X上開窗後的原理,我建議你這樣做,而不是說許多人告訴你不要,它會真正幫助你理解X下的圖形和窗口。你可以閱讀關於X編程的文檔(谷歌它)。 (在這個練習之後,你會喜歡更高級別的庫!)

除了上面所述,在絕對最低級別(不包括芯片級別),你可以去調用中斷切換到各種可用的圖形模式 - 有幾個 - 然後寫入屏幕緩衝區,但爲此您必須使用匯編程序,否則其他任何操作都會太慢。這樣做根本就不是可移植的。

另一個帖子提到Abrash的黑皮書 - 一個很好的資源。

編輯:關於編程Linux的書:它是一個社區的東西,有很多howto的;也可以找到一個論壇,加入它,只要你行事文明,你將得到你所需要的所有幫助。

36

最低級別是顯卡的視頻RAM。計算機首次啓動時,顯卡通常會設置爲80x25字符的傳統模式。

此時您可以使用BIOS提供的中斷來編寫文本。您還可以從16種不同顏色的調色板中更改前景色和背景色。您可以使用訪問端口/寄存器來更改顯示模式。此時可以說,在顯示內存中加載不同的字體並仍然使用80x25模式(操作系統通常會這樣做),或者您可以繼續並啓用VGA/SVGA。這非常複雜,這就是驅動程序的用途。

一旦卡處於「更高」模式,您將通過訪問映射到視頻卡的內存來更改屏幕上顯示的內容。它以像素爲單位逐個像素地存儲,並且某些像素的「髒區域」未映射到屏幕上,並且每行都必須補償。但是,您可以將內存中的圖像像素直接複製到屏幕上。

對於像DirectX,OpenGL這樣的東西。而不是直接寫入屏幕,命令被髮送到顯卡,並自動更新其屏幕。像「你好,繪製這個圖像,我已經加載到這裏,這裏和這裏的VRAM」或「用這個變換矩陣繪製這些三角形...」需要的時間比逐個像素少。 CPU會感謝你。

DirectX/OpenGL是一個程序員友好的庫,用於將這些命令發送到具有所有支持功能的卡,以幫助您順利完成。更直接的做法只會是徒勞的。

SDL是一個抽象層,所以不用費心閱讀它,我猜想它會在每個系統上有不同的工作方式。在其中一個可能會使用半直接屏幕寫入,另一個Direct3D等。無論速度如何,只要代碼保持跨平臺..即可。

GDI/GDI +和XWindow系統。它們專門用於繪製窗戶。最初,他們使用逐像素方法(這足夠好,因爲他們只需要按下按鈕或移動窗口等時重新繪製),但現在他們使用Direct3D/OpenGL加速繪圖(和特殊效果)。優化取決於這些庫的版本和實現。

所以,如果你想要最強大的功能和速度,DirectX/OpenGL是最好的選擇。無論如何,SDL對於充分利用跨平臺環境並與OpenGL集成非常有用。窗戶系統是最後一個,但不要低估它。特別是微軟最近提出的東西。