一個碼農是如何用遊戲推動計算機圖形學的?

箱子發表於2021-09-16
一個碼農是如何用遊戲推動計算機圖形學的?

本文首發於“天美妙妙屋”知乎號
https://zhuanlan.zhihu.com/p/408570779

天美妙妙屋 是天美遊戲工作室群內部由遊戲策劃、運營和熱愛遊戲的朋友組成的非官方組織,都是有感而發的遊戲及產業研究,並不構成遊戲開發及投資建議。

自上世紀70年代光柵顯示器誕生以來,計算機圖形學便在創造社會價值方面做了不少貢獻。往逼格高了講,曾經用於國土資訊和自然資源的繪製,為國家提供了治理和開發的科學依據。從小的層面來看,無論是社畜拿CAD畫幾張工程圖,還是拖著疲憊的軀體回家開啟遊戲撫慰一下身心,我們都能看到圖形學的影子。

歸根究底,它就是用數學演算法讓二維和三維畫面在螢幕上顯示的科學,非常親民。

所以圖形學研究有個很有意思的現象,雖然許多前沿技術都誕生在軍事或者科研領域,但將其普及並「用之於民」的,遊戲可以說是其中的中堅力量 —— 開發了《Doom》的約翰·卡馬克(John Carmack),背後就有幾個很有代表性的例子。

凡是涉獵過計算機技術的人,應該都聽過他的名字,這是個被譽為「程式設計界莫扎特」的男人,能力離譜到面對任何需求,都能在一週內完成基礎設計工作。

作家大衛·庫什納(David Kushner)也在《Doom啟示錄》中寫提過一段軼事,說這人在讀初中的時候為了從學校弄臺蘋果II型電腦,用鋁熱劑和凡士林調製了一種粘性物質把窗戶給融給了,結果被抓去少管所服刑一年,可見他對計算機技術已經痴迷到了魔怔的程度。

一個碼農是如何用遊戲推動計算機圖形學的?
當年正在開發《Doom》的約翰·卡馬克,現在已經成為遊戲行業的活化石

稍微列舉一下卡馬克在計算機圖形學領域的成就,就包括「自適應貼圖重新整理」(Adaptive tile refresh)、「二叉空間分割」(Binary space partitioning)和「卡馬克反轉」(Fast Inverse Square Root)等技術的應用,他們全都和遊戲有關,最後又惠及醫療和教育等其它領域。

自適應貼圖重新整理

約翰·卡馬克對遊戲產生興趣是從1978年的一個暑假開始的,那時只有八歲的他,在遊樂場初次體驗到了《太空侵略者》(Space Invaders),這是一款在全球引爆過熱潮的街機STG。

火爆到什麼程度呢?甚至一度有傳聞稱它導致了日本的百元硬幣出現短缺,就連賣粗點心的商店外面都要擺上幾臺來招攬顧客。

一個碼農是如何用遊戲推動計算機圖形學的?
座無虛席的《太空侵略者》機廳

娛樂與技術的美妙融合,迅速在卡馬克心中埋下火種,這顆種子隨著年齡增長生根發芽。他在密蘇里堪薩斯城大學進修期間,僅讀了兩個學期,就迫不及待跑去做了一名自由程式設計師。

為了拿到路易斯安那州Softdisk公司的程式設計師崗位,這人在雪地裡步行了五公里才趕到招聘現場。好在得償所願,最終有機會與和藝術家阿德里安(Adrian Carmack)、設計師湯姆·霍爾(Tom Hall)以及約翰·羅梅羅(John Romero)等才華橫溢的人共同開發遊戲。

80年代北美的遊戲行業仍由主機所統治,但編寫主機遊戲得配備一套昂貴的開發環境,通常需要公司支援。而個人電腦(PC)在很大程度上被視為僅供商業使用,畢竟螢幕上的顏色少得可憐,內建刺耳的音效也很難提供消費者所需的感官刺激。即使如此,Softdisk的幾個小夥認為PC對程式設計愛好者的門檻更低,而且還有可以挖掘的技術空間。

一個碼農是如何用遊戲推動計算機圖形學的?
80年代的IBM電腦

他們最初的想法,是在PC上重現當時市場中最熱門的遊戲《超級馬力歐兄弟3》。任天堂為了獲得更強的圖形效能,除了以主機作為基礎外,還在扮演載體的卡帶中加入了圖形儲存元件,使得《超級馬力歐兄弟3》背景板和人物的橫向滾動非常流暢。

其實相當一部分NES上的作品都能做到這一點,還有一些廠商為了讓畫面效果更好,在主機上搭載了專用的圖形處理和加速硬體,然而當時的PC並不具備這種條件。

在80年代末期,幾乎沒有面向遊戲的圖形加速硬體相容IBM的PC,程式設計師只能摸著限定標準,利用軟體技巧變著法子來建立看似蹩腳的圖形效果,這也是為什麼角色扮演、策略模擬等對實時畫面變化要求不高的內容在當時主導PC遊戲市場的原因。

一個碼農是如何用遊戲推動計算機圖形學的?
《超級馬力歐兄弟3》的卡帶晶片中儲存著很多這樣的活動塊,可以快速呼叫

如果對比今天顯示卡的執行邏輯,應該說正常情況下,每幀整幅畫面就是得重新渲染,但30多年前由於硬體效能受限,想要得到流暢的畫面,計算機也只能說一聲「臣妾做不到」了。

為了解決這些問題,卡馬克決定圍繞20世紀70年代出現的、用於滾動衛星照片等大型影像的原理,去編寫一個圖形顯示引擎。

要讓原本用於科研的技術民用化,得依賴IBM推出的一種叫做「EGA」(增強圖形介面卡)的顯示卡,它相比老的CGA(彩色圖形介面卡)有更多板載視訊記憶體,雖然只能儲存一個相對高解析度的螢幕影像,但也可以變通一下,同時儲存多個低解析度影像,這讓程式設計師有了一些操作空間。儘管通常只有300*200畫素,不過對於當時的遊戲來說已經夠用了。

一個碼農是如何用遊戲推動計算機圖形學的?

正如上圖所示,卡馬克不按重新渲染整幅畫面的常規邏輯出牌,而是將每幀的中心位置(黃框內)保留到下一幀。簡單來說,玩家向任意方向移動一格的時候只需要重渲黃圈外面的部分就行了,裡面的部分接著用。如此一來視訊記憶體裡存的東西變少,運算壓力也更小。

又因為從視訊記憶體中轉移資料的速度也要比從電腦主存中拿出來更快,通過指向不同的儲存地址,EGA能夠以每秒60次左右的速度切換螢幕上的影像,從而實現流暢的動畫。

一個碼農是如何用遊戲推動計算機圖形學的?
《侵犯版權的危險戴夫》是第一個能在PC上做到平滑滾動的橫版卷軸遊戲

使用新硬體特性的「自適應貼圖重新整理」技術,首次出現在未釋出的測試遊戲《侵犯版權的危險戴夫》(Dangerous Dave in Copyright Infringement)中,由於它提高了硬體處理2D動畫的能力,讓很多跨領域的人才發現了計算機圖形學的可能性。

卡馬克的同事羅梅羅當時就覺得這小子不簡單,待在Softdisk算是屈才了,團隊經理傑伊·威爾伯(Jay Wilbur)也建議做個Demo給任天堂看看。於是他們花了兩個週末(準確的說是72小時)的時間,藉著辦公室的裝置在PC上重現了《超級馬力歐兄弟3》裡的一個小片段。

一個碼農是如何用遊戲推動計算機圖形學的?
卡馬克一行人制作的《超級馬力歐兄弟3》Demo

只可惜任天堂收到Demo後的回應並沒有像預期中那樣熱烈,雖然這家公司對他們的成果印象深刻,但並不想把自己的主要IP帶到其它平臺。

除此之外,卡馬克一行人的僱主Softdisk對基於EGA顯示卡的PC遊戲也不感興趣,更傾向於CGA的老市場。於是他們只能並利用這項技術兼職開發了橫版卷軸遊戲《指揮官基恩》(Commander Keen),最後又自立門戶,成立了後來在遊戲行業中人人皆知的id Software。

一個碼農是如何用遊戲推動計算機圖形學的?
如今在Steam和GOG上可以輕鬆玩到《指揮官基恩》

當時有一家發行商如此評價《指揮官基恩》:“對於蓬勃發展的PC遊戲世界來說,這就像是一顆小小的原子彈。”而對於整個計算機行業來說,id Software也在消費級市場掀起了波瀾,讓軟硬體開發商看到了個人電腦在處理圖形資料時的潛力,開始重視並加大投入,帶動了更多產品的出現,新的VGA標準也是在那個時間點開始全面普及。

二叉空間分割

如果各位對網際網路和科技圈子的訊息有少許關注,大概會知道卡馬克2013年就跳槽到了Oculus研究虛擬現實技術,他做了幾年又開始關注人工智慧,還曾經搞過火箭發射器的研發,屬於是有錢又有閒。

一個碼農是如何用遊戲推動計算機圖形學的?
卡馬克和馬斯克的合影,怪人是會相互吸引的

但在30年前,他創立的id Software公司才剛剛接著藉著橫版卷軸遊戲《指揮官基恩》賺到第一桶金,在那段不算富庶的日子裡,他對3D技術的普及同樣做出了難以忽視的貢獻。

如果說得誇張一點,遊戲3D化就是由卡馬克一手推進的。由於80年代末到90年代初計算機硬體效能不足,他當時萌生了一個想法 —— 通過「光線投射演算法」(Ray Casting)的2D成像技術,來模擬出3D空間縱深的視覺效果。

本質上是2D遊戲的《德軍總部3D》,便是在這樣的思路下誕生。

一個碼農是如何用遊戲推動計算機圖形學的?
德軍總部3D

從原理來看,遊戲中影像的每個畫素會沿固定方向(視線方向)發射一條光線,當它碰到障礙物時,程式會在障礙物的相應位置建立單維深度快取,建立紋理影像。

一個碼農是如何用遊戲推動計算機圖形學的?

上面這段話沒看懂不要緊,總之最終目的就是「將三維體資料投影在二維影像平面上」,用2D畫面表現出3D世界的透視效果,PC算力不會被浪費在繪製人們看不到的表面上。

一個碼農是如何用遊戲推動計算機圖形學的?
光線投射演算法

「光線投射演算法」實際上並非由卡馬克首創,在1980年左右,來自羅徹斯特大學和通用汽車研究實驗室的幾個學者就建立了相關理論,後來電腦科學家馬克·勒沃伊(Marc Levoy)又在1988年的論文中對如何應用進行了更深入的探討,主要是圍繞幾何建模展開的。

但將這種前沿技術應用得如此接地氣的,卡馬克絕對是第一批貢獻者,他在1991年發售的遊戲《Hovertank 3D》中便初步實現了這一點,而1992年上市的《德軍總部3D》在完善程式碼和加入紋理對映後,甚至還提高了執行效率。

一個小插曲是,當年英特爾向記者展示新奔騰晶片的效能時,用的就是一個安裝了《德軍總部3D》的系統,可見當時這款遊戲已經成為PC是否強勁的基準,而「光線投射演算法」時至如今也有了更廣泛的應用,比如看病時測核磁共振和CT,將資料轉化為可以列印出來的片子,也經常在流體動力學和遙感技術等領域見到。

一個碼農是如何用遊戲推動計算機圖形學的?
醫學上也會用到「光線投射演算法」

在做完《德軍總部3D》後,卡馬克和羅梅羅都打算在簡單的關卡設計上更進一步。羅梅羅當時說到:“我的想法是做一些超出《德軍總部3D》的事情,(關卡縱深)要有不同的亮度,不同的高度,四處不僅僅只有90度垂直的牆壁,要通過不同的東西來展示卡馬克的新技術。”

隨著支援更多顏色的VGA卡開始取代EGA卡,在遊戲中實現不同的亮度已經不難做到,卡馬克得以用16種色度,讓計算機根據玩家在《Doom》房間中的位置來顯示不同色調。例如遠景用暗色調呈現出模糊的陰影感,越靠近玩家越亮,就像現實中一樣,這比燈火通明的《德軍總部3D》提供了更多沉浸感。

最大的問題,是得在2D畫面的基礎上,軟渲染出有著多邊形區塊的透視效果。而問題的答案則,是一種稱為「二叉空間分割」(BSP)的技術,在《Doom》之前沒有任何遊戲開發者察覺到了這一點。

一個碼農是如何用遊戲推動計算機圖形學的?
Doom

「二叉空間分割」的想法早在1969年就有了,直到20世紀80年代初,布魯斯·內勒(Bruce Naylor)一行人才開始推廣這種技術,當時他們還在貝爾實驗室嘗試著渲染物體的3D模型。

一個3D模型變成平面影像,最關鍵是要確定哪些表面衝著觀看者,哪些不可見。

原理說得簡單點,好比我們處在一個由天花板、牆壁和地板組成的室內空間,每一個板都可以分為「板前」(可見)和「板後」(不可見),如果人的位置確定,就能根據人在板前還是板後,得到所能見到物體的遮擋順序。

在「二叉空間分割」的作用下,每個平面都將空間分割為前後兩個部分,而分出來的部分可以再次二分,二分的部分又能二分……最終形成一個節點眾多的二叉樹。它的演算法很簡單,只需要從樹根開始,判斷人的位置與所有平面的前後關係,計算機獲得資訊後,就可以把擁有3D透視效果的畫面呈現在螢幕上。

一個碼農是如何用遊戲推動計算機圖形學的?
「二叉空間分割」演算法

而按照卡馬克的說法,《Doom》把三維世界的表面都當做線來處理,分割和排序線要比多邊形簡單得多,重點是把「二叉空間分割」應用到一個平面。

「二叉空間分割」最初的研究領域,是幫助通用電氣和Evans & Sutherland來製造飛行模擬器,當時這些器材的多邊形資料還是由設計人員手工建立的。一定程度上,在《Doom》巧妙利用這項技術後,它才慢慢在民用領域變得常見,像是在CAD中構造立體幾何,在教學中展示物理碰撞,或是用於一部分機器人的程式設計。

卡馬克反轉

到了20世紀90年代中期,消費市場的計算機硬體效能再次得到發展,成本也有所下降。所以當《雷神之錘》立項時,約翰·卡馬克得以順著「二叉空間分割」的思路,嘗試讓遊戲再一次進化。他想創造一個基於真3D多邊形場景和模型的世界,讓演算法切割真正的三維空間,而不是《德軍總部3D》和《Doom》那樣用2D做出來的透視效果。

一個碼農是如何用遊戲推動計算機圖形學的?
真正3D化的《雷神之錘》

1996年推出的《雷神之錘》,被不少人看成是現代3D技術的里程碑,它後期開始支援OpenGL,也倒逼著顯示卡等硬體的發展,來自英偉達的首席科學家大衛·柯克(David Kirk)都感嘆到:“id Software的遊戲總是在挑戰極限。”

為了達到極限,卡馬克圍繞演算法做了不少優化。儘管「二叉空間分割」已經擁有極高的效率了,但有些場景為了少渲染幾個面,他都會去尋找分割的最優解,如果今天你把程式拿來解包估計會覺得「亂七八糟」,當然現在的硬體效能足夠也沒必要那麼幹了。

一個碼農是如何用遊戲推動計算機圖形學的?
通過「二叉空間分割」,一個3D場景可能會變成這樣

對於演算法的優化,在《雷神之錘3》的原始碼中同樣能找到蛛絲馬跡,其中有一個名為「卡馬克反轉」的演算法(平方根倒數速演算法),可用於快速計算x平方根的倒數。

在計算機圖形學領域中,求取照明和投影的波動角度與反射效果時經常要計算平方根倒數,而「卡馬克反轉」可以減少求平方根倒數時浮點運算操作帶來的巨大運算耗費。

一個碼農是如何用遊戲推動計算機圖形學的?
「卡馬克反轉」演算法的公式,利用常數「0x5f3759df」簡化了浮點運算

當然這裡需要澄清一下,這種演算法之所以得名「卡馬克反轉」,是因為《雷神之錘3》在推廣它時做了巨大貢獻,發明者並非卡馬克。

《雷神之錘3》的程式碼在QuakeCon 2005放出後,最初人們猜測是卡馬克寫下了平方根倒數速演算法。獲得本人否定的郵件答覆後,有人順藤摸瓜找到id Software的資深彙編程式設計師泰耶·馬蒂森(Terje Mathisen),結果他表示只做過類似的實現,自己並非原作者。

一個碼農是如何用遊戲推動計算機圖形學的?
高清化後的《雷神之錘3》

目前仍然不知道首創「卡馬克反轉」的人是誰,只知道90年代初參與圖形工作站SGI Indigo開發的加里·塔羅利(Gary Tarolli)是最早改進它的人。但無論如何都可以確定的一點是,遊戲作為圖形學的一種載體,讓被掩埋的技術獲得了大眾的關注,遊戲也作為相關前沿技術的試驗場,在日後繼續發光光熱。

id Software、Epic Games兩家圍繞著實時陰影和預烘焙陰影誰更好,可能爭論了有十年時間;HDR等後期影像技術從千禧年伊始逐步引入;繼承了《雷神之錘》程式碼的《半條命2》,又再一次通過物理引擎推動了整個行業的硬體升級。而隨著遊戲引擎創造內容的保真度越來越高,它也成為了傳統電影製作工具的一部分,盧卡斯影業就利用虛幻引擎來製作科幻電視劇《曼達洛人》,這不僅加快了生產流程,同時還減少了後期的返工時間。

一個碼農是如何用遊戲推動計算機圖形學的?
運用了虛幻引擎的《曼達洛人》

遊戲作為尖端技術落地、創造社會價值的橋樑,或許正如卡馬克說的那樣:“在資訊時代,客觀障礙已不復存在,所謂障礙都是主觀上的。如果你想動手開發什麼全新的技術,你不需要幾百萬美元的資金,你只需要在冰箱裡放滿比薩和可樂,再有一臺便宜的計算機,和為之獻身的決心。我們在地板上睡過,我們從河水中趟過。”


原文:https://zhuanlan.zhihu.com/p/408570779

相關文章