Direct3D 的進化史
英文原文:The Evolution of Direct3D
譯者:@淺水清流
本文作者 Alex St. John 和 Craig Eisler、 Eric Engstrom 三位一起創建了早期的微軟 DirectX 技術平臺。1992-1997 年 Alex 在微軟的工作,后來成為 DirectX 技術布道師。
</blockquote>我在 Direct3D 上工作了很多年,多年來技術有了極大的發展。多年來,現代圖形處理器(GPU)發生了巨大的變化,擁有了我曾經以為在有生之年不可能見到的運算速度和能 力。現代 GPU 的演變是在很多充滿魅力的市場驅動下進行的,其中我覺得最重要并且有趣的是,在 Direct3D 的影響下,新一代的 GPU 支持數以千計的處理核心,數十億晶體管(超過 CPU)而且在大多數應用中都要快很多倍。我可以講很多關于 D3D 的趣聞和政治傳說,但是我更想記錄下 D3D 的由來以及對現代 GPU 架構的深遠影響。
本文使用的是 1995 年 Direct3D 第一次發布時的老文檔。這份文檔包含了對 3D 硬件加速架構的愿景,在很大程度上主導了現代 GPU 演變成為今天我們所見的強大得另人難以置信并且用途普遍的無所不在的消費型超級計算機。
D3DOVER
我進入計算圖形學不是對游戲感興趣,而是對想了解物理模擬計算。為了了解如何模擬量子力學、化學和生物系統,在 20 世紀 80 年代中后期,我開始參與 Siggraph 研究 3D 圖形學。模擬光和材質互相作用在 Siggraph 曾經風靡一時,在此期間我學習了 3D。了解 3D 數學和光照模擬,讓我通過我在職業早期創建的 PostScript RIP(光柵圖像處理器),成為了在出版業的圖形和色彩專家。我曾經和劍橋大學的工程師一起開發了在連續色調印刷發明之前印刷彩色圖形的軟件方案。我的專 業背景獲得了微軟的青睞,在 1990 年初我獲邀參與為 Windows 95 和 Windows NT 重新設計具備與當時表現卓越的蘋果競爭的能力的打印架構。峰回路轉之后,我的職業生涯到了回到 3D 的時候,我開始主動和幾個朋友為 Windows 重新設計支持實時游戲和視頻架構的圖形和多媒體架構,這最終導致游戲成為了微軟的一個重要戰略。在索尼推出 3D 游戲機 PS1 之后,為 Windows 找個一個 3D 解決方案,成為了負責開發 Directx 的我們義不容辭的責任。
對我來說,制定微軟在游戲市場 3D 戰略的挑戰是一個經濟問題。微軟應該采取什么樣的策略,去創建一個充滿活力競爭激烈的市場給消費者帶來實惠并且引導未來的發展。在那個時代,3D 實時渲染的復雜度遠遠超出了當時的硬件能力,找出一個遠離數學的理想方案讓任何 hack 都能構建出足夠好的 3D 應用看起來是不可能,我們有希望改變世界。
當時唯一的商業解決方案是為 CAD 設計的 3D 硬件。這些工作站需要花費數十萬美元。雖然 OpenGL API 是當時市場上唯一的 3D API 標準,但是它并不是為 3D 游戲設計的。例如,紋理映射是渲染逼真的圖形的一個重要技術,但是 CAD 優先考慮的是功能而不是看起來 cool。同樣,豐富的動態光影效果對提高游戲的表現力很重要,但是對 CAD 并不重要。而高精度的模型對于 CAD 重要,但是對游戲并不重要。最重要的是 OpenGL 并沒有為實時高度互動的圖形而設計的離線緩沖區來避免渲染過程中撕裂紋理。這并不是說 OpenGL 并不能適應這些游戲所需的特性,而是它的實際市場是昂貴的工作站而不是$200 的游戲顯卡。
在 20 世紀 90 年代計算機的 RAM 非常昂貴,正因為如此,早期消費型顯卡選擇了內存需求最小的方案。Sony 在優化 PS1 的 3D 硬件時,沒有依賴內存密集型的Z-buffer,而是使用多邊形區域排序算法,雖然會在活動的骨骼間產生丑陋的交點。“畫家算法”對 3D 渲染來說非常快速,并且幾乎不要額外的內存。對于游戲開發來說這是一個丑陋而務實的做法,但是這種做法對 CAD 來說是不可接受的。
在制定 Direct3D 架構時,我們面臨的類似艱難選擇不勝枚舉。我們希望當時領先的顯卡廠商,ATI、Cirrus、Trident、S3、Matrox 和其他廠商能彼此競爭,快速更新 3D 顯卡,而無需在一片混亂中建立市場。微軟的 OpenGL 團隊信賴 Michael Abrash 的技術方案,一個被稱為 3DDDI (3D Device Driver Interface)的驅動程序模型。3DDDI 是一個非常簡單的驅動模型,只支持硬件加速 3D 光柵化。3D 場景光照變換的復雜數學運算被留到了 CPU。3DDDI 使用“功能位”來指定額外的渲染功能(比如過濾),消費型顯卡廠商可以選擇實現一部分。3DDDI 的問題是在邀請游戲廠商參與時,事情失去了控制。這么多“功能位”,游戲廠商要么選擇支持各種“未知”的硬件特性,利用一切可能的方式充分挖掘顯卡的能力 (硬件廠商可能會選擇支持不同的硬件特性導致用戶的硬件配置難以預測,為了在任何設備上都良好的表現,游戲將不得不準備大量的美術資源)或者游戲只使用一 組所有硬件都支持的簡單常見的 3D 特性,但是沒有硬件公司提供的最新特性,在市場上就會缺乏表現力。OpenGL 的人在微軟沒有意識到這是個大問題,因為在他們的世界里,所有人都使用支持他們需要的所有特性,價值$100,000 的昂貴工作站。
認識到我們不可能從 OpenGL 團隊得到我們想要的東西之后,我們決定創建一個新的,只為游戲而設計的 3D API。這些 API 什么都不做,但是我們需要通過制定明確的驅動程序架構,來創建一個競爭激烈而有序的市場。在這方面,D3D API 不是 OpenGL API 的替代品,它是一個驅動 API,創造出來的一個經濟戰略目的,是引導消費型顯卡市場進行激烈而有序的競爭。換句話說,D3D API 更多出于經濟目的,而不是技術目的。在這方面 D3D API 的幾個革命性的有趣之處是,API 什么都沒有做,而是制定它所依賴的驅動程序架構。
當我們決定收購一只團隊打造 Direct3D 時,我被特許參與評審候選企業是否有足夠的技術能力幫助我們制定我們所需要的 API。正如我以前所說,我們考核了 Epic Games ( UnReal 引擎廠商), Criterion (后來被 EA 收購), Argonaut 和 Rendermorphics。我們選擇了總部設在倫敦的 Rendermorphics,因其創始人 Servan Kiondijian 對如何設計一個盡可能兼具兼容性和創新的 3D 驅動程序架構有一個非常明確愿景。Direct3D 的第一個版本非常的簡陋,但是 API 迅速向在未來有巨大潛力的方向演進。
我在這一時期的主要記憶是,我作為常駐 DirectX 團隊的 3D 專家,被要求為 D3D 選擇一個坐標系標準。我選擇了左手坐標系,一部分原因出于個人喜好。我至今還記得,因為這是一個輕率的決定,此后帶來無數的麻煩,因為其他 3D 建模工具都采用了 OpenGL 標準的右手坐標系。當時沒有人會想到,AutoDesk 和 Maya 的建模工具會成為游戲開發行業的建模的標準工具。微軟已經有了收購 SoftImage 取代 Autodesk 和 Maya 的計劃。Whoops…
早期的 Direct3D HAL (Hardware Abstraction Layer) 以一種有趣的方式設計,它以垂直的 3 個階段構成。
最高層是幾何變換層,中間層專用于光照計算,底層進行光柵化過程,生成像素圖像。這種垂直驅動架構背后的目的是讓硬件廠商在實現一個相對一致的 特性要求進行創新。他們可以細分他們的產品,設計更加高效的 3D 管線,從而獲取更高的性能,并且和現有產品保持兼容,否則就會需要配置一個龐大的矩陣進行兼容性測試,或是需要大量的冗余美術資源。由于 Rendermorphics 創建 Direct3D API 時提供了一個“相當高效的”無需硬件加速的軟件實現,游戲開發者可以把重心放在 Direct3D API 上,而無需關注無數不兼容的硬件特性組合。至少理論上是這樣。可惜和 3DDDI 驅動程序規范一樣,Direct3D 仍然包含了“功能位”設計,允許加入垂直架構之外的硬件特性。雖然我極力反對讓 Direct3D 傾向于堆積“功能位”,但是小組受到了來至微軟 OpenGL 組的巨大競爭壓力,硬件提供商支持他們。
硬件廠商為了讓自己的產品可以更有優勢,威脅將會支持和促進游戲廠商使用 OpenGL,因為 OpenGL 驅動程序模型支持“功能位”,他們可以設計別人不具備的硬件特性。這很常見(現在還是),硬件廠商贊助游戲廠商使用他們與基礎功能不兼容的硬件特性,迫使 消費者不斷更新他們的顯卡來玩游戲啊廠商最新的 PC 游戲。游戲廠商討厭不斷變化的“功能位”,因為它們復雜并且不兼容,但是又希望通過支持“非標準”3D 特性獲取游戲廠商的贊助。
總的來說,我認為這種趨勢破壞了 PC 游戲市場的健康發展,并且主張抵制這種趨勢,無論 OpenGL 或是 OEM 廠商的人怎么想。我相信創建一個穩定的消費市場,比安撫 OEM 廠商更加重要。就是這樣,我是 Direct3D 垂直管線的強力倡導者,我們預計隨著時間的推移,只實現 D3DAPI 的功能將會越來越普遍。我坦白承認,這種觀點隱含對在其他領域創新的重大約束,引導市場被放在 Direct3D 團隊的第一位。
最終我的估計相對準確。Direct3D 固定管線,如大家所知的,通過在 DirectX 7.0 上進行的健康的激烈競爭,產生了內容豐富、增長迅速的 PC 游戲市場。在 2000 年初,PC 游戲市場贏來了爆發性的增長,成為了全球上最大的游戲市場。這也導致 GPU 體系結構此后發生了許多有趣的變化。
最終 Direct3D HAL 是一個光柵化驅動模型加微軟的 OpenGL 團隊所倡導的“功能位”,顯卡廠商將通過加速底層渲染管線的效率和添加差異化特性與對手展開競爭。引入的垂直分層架構的結果是,促使所有硬件廠商以更接近 通用 CPU 架構的方式添加特性到 GPU 中,即以一致的方式進行快速浮點計算。因此消費型 GPU 經過多年的發展,越來越像 CPU,但是有個主要的區別。因為 3D 管線還是剛性的固定管線,Direct3D 體系結構很少需要像 CPU 一樣針對分支代碼的優化。GPU 實現驚人的性能和高度并行,很大程度上得益于 Direct3D 圖形管線內部很少甚至根本沒有分支代碼。因此不是發展成為一個類似于 Intel CPU 那樣將大量晶體管用于高效的分支預測的巨大的單片 CPU 核心,Direct3D 的 GPU 擁有數百至數千簡單的沒有分支預測的 CPU 核心。他們可以達到驚人的吞吐量,以令人難以置信的速度執行,如果不遇到分支代碼或是隨機內存訪問,流水線就不會被打斷。
通過支持 DirectX 7.0,GPU 底層的并行計算被從游戲中隱藏。游戲開發只需要知道一些硬件比另一些硬件性能更強,但是無需關系這些如何實現。早期的固定管線取得了輝煌的成果,使幾十家 顯卡廠商采取各種方法提高性能、降低成本而不是陷入混亂的競爭中。它的圖像不夠漂亮,精度也不夠高,但是已經足以在 2000 年初創建一個活躍的游戲市場。
在我討論現代 Direct3D 的演變之前,我想強調幾個早期 Direct3D 體系結構的重要思想對現代 GPU 的影響。在 1990 年的早期到中期,RAM 相對昂貴,這導致消費型顯卡采用了需要 RAM 較少的技術。這個觀點對我將來很多負面故事的(well-deserved)The Talisman 架構的影響很大。
Talisman 依賴各種圖形學上的 tricks,盡可能的降低對顯存的需求,并不是一種常規做法。為了創建一個面向大眾的消費型顯卡市場,Direct3D 團隊受到了 Rendermorphics 創始人做出的一個艱難選擇的嚴重影響。我們決定采用在 3D 上更通用更簡單但是依賴更多顯存的Z-buffer,來實現更好的顯示效果。Rendermorphics 在使用了軟件Z-buffer 的 Rendermorphics 引擎上實現了很好的 3D 性能,這給了我們信心去賭注,用一個更簡單通用的 3D API 和驅動程序模型,并且相信硬件市場和 RAM 的價格會降下來。
但是請注意,我們在設計的 Direct3D 的時候,我們沒有了解到微軟研究院“秘密”的 Talisman 計劃,他們也沒有預計到一小群先行者,會設計了一個新的游戲 3D API 標準,并且在他們奇怪倡議被部署之前啟動了它。總之這是一個巨大的賭注,Direct3D 為游戲開發者提供了簡潔和優雅的Z-buffer,值得去冒這個險,消費型 3D 顯卡市場在早期很難以合理的價位支持它。
盡管支持Z-buffer 是一個巨大的賭注,但是我們還是有兩個架構上的問題需要解決。首先是 PC 總線一般很慢,第二是從顯卡讀取數據比寫入數據到顯卡慢的多。這通常意味著,我們的設計 API 需要盡可能緊湊封裝數據發送給 GPU 的處理,和盡可能減少,將 GPU 處理完的數據復制回 CPU 處理。這通常意味著的 Direct3D API 進行了優化,數據打包和發送一次完成。當然這是一個不幸的約束,因為有很多華麗的 3D 效果,可以通過混合 CPU 高效的分支預測和 GPU 強大的浮點運算能力達到令人難以置信的并行渲染性能。
該約束正面作用之一是,它迫使 GPU 向更通用的方向發展,以補償無法有效地與 CPU 共享數據。恰恰相反,Intel 可能希望控制總線速度的發展,因為其他協處理器越來越多的取代 CPU 在 PC 中的核心地位和功能,這對 Intel 是個威脅。有理由相信,Intel 故意限制了 PC 總線性能的提高,以防他們的 CPU 在多媒體應用市場上出現替代品。回想一下我以前的博客,推出 DirectX 的主要原因是防止 Intel 通過虛擬化支持所有 Windows 多媒體應用。如果 Intel 采用了可以使協處理器快速共享 RAM 的總線架構,那么 GPU 不大可能如今天這樣支持豐富的分支預測和浮點計算。
為了克服 PC 總線性能的限制,大量技術投入到了用 CPU 壓縮和簡化發送到 GPU 的 DirectX 資源,以減少總線帶寬的性能限制,和盡量減少需要從 GPU 返回 CPU 的操作。早期的固定 3D 管線在后來造成了有趣的后果,當我們開始探索通過互聯網分發 3D 資源。
我們認識到早期支持壓縮紋理,將極大提高總線性能和降低對顯存的需求,問題是在一個沒有標準 3D 紋理格式的年代,我不想過早的將一個微軟指定強加給行業。為了克服這個問題,我們抱著沒有標準格式的的想法前進。這個想法是我們提出的 DirectX 諸多專利的一個,我們提出一個 GPU 可以編碼和解碼不明格式的紋理,而 DirectX 的 API 將允許應用程序如同原始位圖一樣讀取和寫入紋理。Direct3D 驅動程序進行編碼和解碼,而應用程序沒有必要知道驅動是如何工作的。
直到到 1998 年,顯卡廠商開始為 DirectX6.0 制定高標準的 3D 紋理格式,我們將其中之一(S3)列入 Direct3D 許可。
http://www.microsoft.com/en-us/news/press/1998/mar98/s3pr.aspx
DirectX 6.0 是被列入發布版操作系統版本(Windows 98)的第一個版本。直到那時,DirectX 實際上只是一個內部庫,被一個 Windows 游戲使用。直到第一個版本的之后的第 5 代,DirectX 才正是成為 Windows API。
DirectX7.0 是最后一代依靠在 DirectX2.0 時代就已經奠定基礎的固定管線的 Direct3D API。這是 Direct3D 非常微妙的一個過渡期,有以下幾個原因;
- 1)原來的 DirectX 團隊創始人都離開了,
- 2)Talisman 和微軟支持 OpenGL 的內部原因都被否決
- 3)微軟帶來了游戲行業的資深人士,如 Blackley、Kevin Bacchus、Stuart Moulder 等進入公司高層
- 4)游戲已經成為公司的戰略重點
DirectX 8.0 是 Direct3D 一個迷人的標志性過渡版本,因為 Talisman 項目的失敗和 OpenGL 支持戰略的利益受損,許多 3D 開發人員從這 2 個項目加入到 Direct3D 的工作中來。這個結果是非常有趣的。現在回頭看,我不會做出和他們一樣的選擇,但是回想起來,在我看來一切都以最佳方式在工作。
Direct3D 8.0 以幾個有趣的方式影響了 20 世紀末的顯卡市場。微軟在很大程度上統一對 OpenGL 的結論,并且發現自己發展 Direct3D 要比 Kronos 的集團標準委員會推動的 OpenGL 要快。隨著 SGI 死亡,OpenGL 標準的控制落到了那些希望標準允許創造差異化競爭和迫使微軟支持他們想推動的 3D 特性的 3D 硬件 OEM 的手里。最后的結果是,Direct3D 和 OpenGL 變得更加復雜,他們在此期間趨于收斂。從 DirectX8.0 到 DirectX11.0,游戲開發商停止采納新的 3D 特性。創建游戲引擎變得如此復雜,以至于市場上只剩下幾家領先的引擎開發商,包括 Epic 的 Unreal Engine 和 id Software 公司的 Quake engine。
如果我一直在 Direct3D 工作,我會堅決抵制微軟被 3D 顯卡 OEM 廠商牽著鼻子追逐 OpenGL 的特性,而是專注于讓游戲開發商有一致的品質和消費體驗。我會反對引入 shader,保持盡可能垂直整合硬件廠商之間的功能,以確保符合 Direct3D 驅動程序層的支持。同樣,我也強烈反對放棄支持 DirectDraw。3D 的家伙們失去了控制,并且認定采用 3D API 之后不會有人需要純 2D 的 API,沒有認識到簡單的 2D API 滿足了大量需求而且易于使用,畢竟大多數開發者不是天才,并不能輕松理解和使用 3D API。強制市場接受 3D API 造成了巨大的準入門檻。微軟后來發現了這一錯誤,并且從新引入了 DirectDraw,也就是新的 Direct2D API。基本上 Direct3D 8.0 的天才設計讓它輝煌,強大并且對普通開發人員沒用。
在 DirectX 8.0 開始開發時,我正在創辦我的第一家公司 WildTangent Inc,并且不再關注 DirectX3D 的進展。然而,幾年之后我回到了夢想開始的地方,并且重新開始學習 3D,最新的 DirectX11.1。回過頭看看這些很有趣,DirectX8 的主要設計做了哪些改變,導致了今天幾乎難以理解的 Direct3D API。還記得 3 級流水線的 DirectX2,旋轉,燈光和光柵化分為三個基本階段?這里是一個現代的 DirectX 11.1 三維管線圖。
是的,它增加到了9-13 級,其中包含一些可選項如 compute shader。作為一個擁有極其資深的背景并且非常低級別的 3D 圖形編程人員,我不好意思承認我學習 Direct3D 11.1 學得非常的痛苦。Direct3D API 變得非常的不可理解和難以學習。我無法想象沒有和我一樣深厚的 3D 圖形背景的人該如何開始入手學習現代可編程 3D 渲染管線。這條管線驚人的強大而且難以使用,但是極少數最聰明的人都在從事 3D 圖形。在我趕上現代 Direct3D 的過程中,我發現我敬畏現代 GPU 的驚人力量,它們會發展到哪一步,同時震驚、厭惡 3D 管線已經發展到絕對的混亂。在過去的幾年中,Direct3D API 已經成為 OEM 要求的 3D 特性傾銷地。
如果我不是享受著長達十年參與 DirectX 的回報,毫無疑問,我會酸溜溜的寫些什么亂七八糟的我的前輩創建了偉大而優雅的消費型 3D 圖形顯示的悠久歷史。然而,古怪的是當時間定格到了現在,我必須承認,我不能確認但這畢竟是件壞事。PC 游戲市場的停滯,和微軟與 OEM 推動 Direct3D API 的背后是 XBox 的成功。大量零散的 3D API 并不是個大問題,如果和游戲機一樣,開發者只需要支持一種硬件配置。早期的 DirectX 8.0 支持 Shader Model 1.0 是第一代 Xbox 的圖形 API 的基礎。作為第一代 XBox 的選擇,NVIDIA 芯片在 PC 3D 圖形芯片市場擁有了巨大的優勢。DirectX 9.0 和更先進的 Shader Model2.0,是 XBox360 的基礎,微軟重新選擇了 ATI 設計 3D 芯片,AMD 這個時候在 PC 圖形市場擁有了巨大優勢。從某種意義上說 OEM 自己絞死了自己。通過成功影響微軟和 OpenGL 標準組織采取高度錯綜復雜的圖形管線,以支持他們所有特性,他們迫使自己去歸納他們的 GPU 架構,而顯卡芯片市場會圍繞一種架構合并… 無論微軟為它的游戲機選哪個。
最終的結果是,PC 游戲的零售市場接近于死亡。這對于開發一個高產值的游戲來說,簡直是個太太昂貴,太沒有安全感,太不穩定的平臺,除了 MMOG。微軟和 OEM 的同謀毀掉了眾所周知的搖錢樹。這對微軟來說沒什么大不了的,因為微軟很高興通過 XBox 控制了 PC 游戲前端業務。
從很早的 DirectX 視覺的角度來看,我認為這個結果是一個愚蠢且短視的災難。微軟應該保持 DirectX 團隊的紀律,把戰略重心放在 Direct3D API,他們可以確保沒有其他游戲機和 XBox 同一個時代,通過 XBox 加強 PC 游戲市場,而不是無意之中破壞它。雖然祝賀微軟開發了首款美國產的成功的游戲機,但是我會計算如果微軟保持一個有凝聚力的跨平臺戰略,從索尼,任天堂和移 動平臺所能獲得的回報。我說這些是從過去的角度來看,因為今天,我不能肯定,我對所以的結果感到不滿。
索尼和微軟的新一代游戲機已經恢復到 PC 架構!下一代 GPU 將是大規模并行,與 CPU 共享私有緩存的通用處理器。事實上,GPU 架構變得如此通用,是因為在 DirectX 11 中加入了一個稱為 DirectCompute 的新流水線階段,允許 CPU 繞過整個 Direct3D 圖形管線直接編程。隨著 DirectCompute 的引入,簡單的 3D 編程以一個意想不到的形式返回。現代 GPU 已經變得如此強大和靈活,直接采用 GPU 編程開發 3D 引擎是一個越來越實用和有吸引力的編程選擇。從我的角度來看,我預計在短短數代的時間里,傳統的 Direct3D 和 OpenGL API 將會消失,新的引擎將會親睞與采用如 Nvidia 的 CUDA 和微軟的 AMP 之類的獨立的 shader 語言來編寫更豐富,更多樣化的特效。
今天,作為一個 3D 物理引擎開發者,我從來沒有如此興奮,因為現代 GPU 編程純粹而強大,并且相對容易編程,而無需學習錯綜復雜的 Direct3D 和 OpenGL API 的 3D 管道。如果今天是我負責 Direct3D 的戰略,我會主張拋棄傳統的 3D 管線,快速轉向豐富的 GPU 編程環境。我個人從來沒有想過,我早期工作過的 Direct3D,在幾十年中,促進演變出了一種新的無處不在的處理器,可以支持在 1980 年我所學到的那種令人難以置信的逼真的光照和物理模型,我從沒想過電腦能強大到在我的職業生涯中出現實時渲染模型。
Direct3D API 的遺產:
- 左手坐標系,我在 DirectX2.0 做的糟糕決定
- 伴隨 Windows 95 問世的 COM API
- 各向異性過濾,在 Direct3D 中發現的 Talisman 的最后遺跡
- Shaders, 在 DirectX8.0 中引入,標志著固定管線的結束和可編程渲染管線的問世
來自: blog.jobbole.com
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!