本節書摘來自異步社群《opengl超級寶典(第5版)》一書中的第1章,第1.1節計算機圖形的簡單曆史回顧,作者 【美】richard s. wright , jr.nicholas haemel,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
第1章 3d圖形和opengl簡介
opengl超級寶典(第5版)
本章内容
簡單介紹計算機圖形的曆史
如何在2d螢幕上建立3d圖形
基本的3d效果和術語
3d坐标系統和視口的工作原理
什麼是頂點以及如何使用
不同類型的3d投影
本書講述的是opengl,這是一種用于建立實時3d圖像的程式設計接口。在讨論opengl究竟是什麼以及它的工作方式之前,讀者至少應該在一個比較高的層次上對實時3d圖形有一個基本的了解。也許讀者已經對實時3d的原則有了較深的了解,閱讀本書的目的隻是為了學習如何使用opengl。如果是這樣的話,那就太好了,請直接跳到第2章。但是,如果讀者購買本書的原因是覺得這本書中的圖檔非常酷,并且希望學會如何在自己的pc中建立這樣的圖檔,那麼很可能需要從本章開始認真學習。
1.1 計算機圖形的簡單曆史回顧
最早的計算機是由一行行的開關和燈組成的。技術人員和工程師需要工作幾個小時、幾天甚至幾星期,對這些機器進行程式設計,并閱讀它們的計算結果。發光燈泡所組成的各種模式向計算機使用者傳達有用的資訊。此外,計算機或許還可能産生一些原始的列印資訊。讀者可以認為計算機圖形的最初形式就是在一塊面闆上閃爍的燈(早期編寫程式的程式員流傳的一些故事似乎也映證了這個想法,他們所編寫的程式除了追蹤燈光、建立各種閃爍模式之外,就幾乎沒有其他用途了!)。
随着時間的變遷,這一切逐漸發生了變化。最初所謂的那些“思考機器”發展為完全可程式設計的裝置,使用一種類似電傳打字機的機制在紙卷上進行列印。資料可以有效地存儲在錄音帶、磁盤上,甚至可以一行行地存儲在打孔紙上,或者存儲在一堆穿孔卡上。計算機圖形誕生于計算機最初開始能夠列印的日子。由于字母表中的每個字元都有固定的大小和形狀,上世紀70年代的那些富有創造力的程式員僅僅利用星号(*)就建立了許多藝術圖案和圖像。
1.1.1 進入電子時代
紙作為計算機的輸出媒體非常實用,直到今天仍然是主要的輸出媒體之一。雷射列印機和彩色噴墨列印機已經取代了原始的ascii藝術,它們具有鮮活的表現品質和近乎照片般的藝術再現能力。但是,作為正常的顯示媒體,紙可能顯得過于昂貴了。一直用紙作為輸出媒體會浪費自然資源,尤其在絕大多數情況下,我們實際上并不需要對計算結果或資料庫查詢進行硬複制的輸出。
作為計算機的一種輔助裝置,陰級射線管(crt)是一項震撼人心的技術。作為最初的計算機螢幕,crt一開始隻是一種顯示ascii文本的視訊終端,就像最初的紙終端一樣。但是,crt能夠完美地繪制點和線,以及字母字元。不久,其他符号和圖形陸續補充到字元終端。程式員使用計算機和螢幕建立圖形,作為文本或表格輸出的補充。首先,一些用于繪制直線和曲線的算法被開發出來,并且公布于衆。于是,計算機圖形逐漸從一項業餘愛好變成了一門科學。
最初,顯示在這些終端上的計算機圖形是二維的,或簡稱為2d。人們用平面的直線、圓和多邊形來建立各種各樣的圖形。圖形可以用一種表格或數字無法實作的方式顯示科學或統計資料。那些富有探索精神的程式員甚至建立了一些簡單的街機遊戲(arcade game),如lunar lander和pong。它們所使用的簡單圖形就是由各種線型所繪制的,并且每秒重新整理數次(重繪)。
實時(real-time)這個術語最初應用于那些活動的計算機圖形。在計算機科學中,這個術語更為廣泛的含義是指計算機能夠即時對輸入進行處理。例如,人與人之間通過電話交談就是一種實時活動。當你說話的時候,對方立即就能聽到,并随即做出回答,然後又允許你立即做出響應,接下來循環往複。在現實中,由于電流的緣故,通話實際上存在延遲。但對通話者而言,這種延遲通常是感覺不到的。與電話相反,寫信顯然不是一種實時活動。
把實時這個術語應用到計算機圖形中意味着計算機對諸如操作杆活動、擊鍵等輸入事件直接做出響應,産生動畫或圖像序列。實時計算機圖形可以顯示一種波形,由電子裝置、數值讀出器、互動性遊戲和視覺模拟程式進行測量。
1.1.2 走向3d
三維(或3d)這個術語表示一個正在描述或顯示的物體具有3個次元:寬度、高度和深度。例如,放在書桌上的一張紙(上面畫了一些圖形或寫了一些字)是個二維物體,因為它沒有可以令人感覺得到的深度。但是,放在它旁邊的一罐蘇打水卻是個三維物體。這個蘇打飲料罐又圓(寬度和高度)又長(深度)。根據觀察點,我們可以把這個罐的任何一邊作為寬度或高度,但這個罐頭是個三維物體的本質并不會改變。圖1.1所示顯示了可以怎樣測量這個罐頭和這張紙的各個次元。

圖1.1 測量二維和三維物體
幾個世紀以來,藝術家已經知道如何讓一幅畫看上去具有真實的深度。從本質上說,畫本身是個二維物體,因為它隻是用顔料在二維的畫布上所創作的作品而已。類似地,計算機3d圖形在實質上也是平面的,它隻是在計算機螢幕上所顯示的二維圖像,但它可以提供深度(或第3維)的錯覺。
2d + 透視 = 3d
毫無疑問,最初的計算機圖形看上去類似于圖1.2所示圖形,我們可以看到12條線段組成了一個簡單的三維立方體。使這個立方體看上去具有三維效果的是透視(perspective),或線段之間的角度。正是它們産生了深度的幻覺。
為了真正看到3d圖像,實際上需要用兩個眼睛觀察一個物體,或者為每隻眼睛分别提供這個物體的一幅獨立而又唯一的圖像。如圖1.3所示,每隻眼睛看到的都是一幅二維圖像,非常類似于在每個視網膜(位于眼睛的後半部分)上顯示了一幅臨時照片。随後,大腦對這兩幅略微不同的圖像進行組合,在腦海中形成一幅單一的、合成的3d圖檔。
圖1.2 一個簡單的線框3d立方體
在圖1.3中,随着物體逐漸變遠,圖像之間的角度也越來越小。我們可以通過加大兩幅圖像之間的角度來增強3d效果。立體單片(一種手持式立體鏡片,在小時候可能玩過)和3d電影利用了這種效應,在每隻眼睛上放置一塊單獨的鏡片或者戴上一幅濾色眼鏡,将兩幅層次不一的圖像分離。這些圖像通常進行了過度增強,以取得某種戲劇性的效果或影院效果。圖像卡上的快門玻璃和軟體會在兩隻眼睛之間進行圖像切換,在每隻眼睛上顯示變化的透視效果,進而産生了“真正”的立體3d體驗。遺憾的是,許多人抱怨這個效果令他們頭痛,或者令他們感到頭暈目眩。
圖1.3 如何觀察三維物體
計算機螢幕是在平面上顯示平面圖像,而不是通過不同的視角在兩隻眼睛上顯示兩幅圖像。這樣一來,絕大多數3d計算機圖像實際上隻是近似3d。這種近似效果和多年來畫家在繪畫作品中實作視覺深度所使用的手法是一樣的,就像人們用一隻眼睛也能夠觀察到3d效果一樣。
在生活中,讀者可能已經注意到,當遮住一隻眼睛時,所看到的世界并不會立即變成平面!當我們遮住一隻眼睛時會發生什麼呢?我們可能覺得自己看到的仍然是3d世界。但是,請嘗試下面這個試驗:把一隻玻璃杯(或其他物體)放在一臂之外的地方,靠左手一側(如果放得很近,這個戲法就不靈了),用右手遮住右眼,然後用左手去摸這隻杯子(可能最好換用空的塑膠杯)。注意,在摸到這個杯子之前,我們會覺得估計這個杯子的距離顯得比較困難。現在,放開右眼,然後再去觸摸這個杯子,我們就會發現這次判斷杯子的距離要容易得多。現在,我們應該能夠明白為什麼隻有一隻眼睛的人在感覺距離時常常會遇到困難了。
單憑透視本身就足以建立三維的外觀。注意前面圖1.2所顯示的那個立方體。即使不進行着色,這個立方體仍然具有三維物體的外觀。但是,如果長時間凝視這個立方體,就會發覺這個立方體的前後将會交換位置。由于圖中缺少任何表面着色,大腦将會是以而産生混淆的感覺。這幅圖不能提供足夠的資訊以幫助大腦确定它到底感覺到了什麼。我們遮住一隻眼睛時所看到的世界沒有突然看起來像平的,原因在于以二維形式觀察時,很多3d世界的效果仍然存在。這些效果足以激發大腦辨識深度的能力。其中一個線索是由光線照射産生的表面着色,而另一個線索則是近處的物體看起來比遠處的物體要大。這種透視效果稱為透視縮短(foreshortening)。這種效果加上顔色的改變、紋理、光照、着色以及各種不同的顔色強度共同組成了我們對三維圖像的感覺。