Windows 支持 DirectX 和 OpenGL,為什麼大多數 PC 遊戲還是 DirectX 開發?
事實上在早年OpenGL即使在遊戲領域也是對DirectX壓倒性的優勢。John Carmack曾嘲諷DirectX是「horribly broken」 的API。
直到DirectX6時代OpenGL都被認為是比DirectX更加優秀的API,即使那個時候DirectX已經有《CS》《極品飛車5》等大作的支持,卻依然不受當時FPS遊戲霸主id Software的待見。作為那個時代的顯卡殺手,《Quake III》都僅僅只支持OpenGL。
DirectX7發布之後DirectX和OpenGL開始逐漸平起平坐。直到2000年DirectX8的發布才使DirectX在遊戲領域完全確立了自己的優勢 —— 支持革命性的programmable GPU rendering pipeline來代替原有的fixed function pipeline,引入了Vertex Shader和Pixel Shader。而OpenGL的核心正式支持programmable rendering pipeline已經是四年之後OpenGL 2.0發布的時候了。想想這中間會有多少遊戲公司/遊戲引擎公司會倒向DirectX吧。
說到OpenGL衰落的原因,不得不提到OpenGL開發的機制。OpenGL早期一直是由ARB (
OpenGL Architecture Review Board,成員包括Nvidia, ATI, Intel, Apple, IBM, SGI等等)成員共同維護。每個成員可以為了支持自己硬體新的feature來開發OpenGL enxtension, 所有成員一致通過的extension才能加入到下個版本OpenGL核心中。這就造成了不同成員為了各自利益互相鬥爭,拖慢了開發進度。微軟曾經也是ARB的成員之一,後來因為受不了這種機制退出專心搞自己的DirectX去了。
如果一個API越流行,那麼去學習這個API的人就會越多,遊戲公司會越容易招到掌握這個API的圖形程序員,也就會更多的基於這個API開發遊戲。用這個API的遊戲越來越多,就會更多的得到
硬體廠商的支持,為面向這個API的驅動做更多的優化,然後這個API就會更加流行。如此進入一個良性循環,這就造成了DirectX現在稱霸遊戲領域,OpenGL幾乎絕跡的局面。在06年從ARB交由Khronos Group掌管之後, OpenGL最近幾年也迎頭趕上,從性能,易用性來說其實和DirectX已經相差不大。但是在相比DirectX沒有突出優點的情況下(除了跨平台),已經習慣使用DirectX的遊戲廠商也不可能重新投出OpenGL的懷抱。
最後一點,OpenGL只是一個單純的圖形庫,而DirectX是包含圖形(Direct3D), 聲音(DirectSound), 輸入(DirectInput), 網路(DirectPlay)的一整套遊戲開發解決方案。對開發者來說使用DirectX顯然要方便的多。
/*******************************************************************************************************/下面是我之前一個同事看完我的回答的評論,也貼上來吧。「還有很重要的一點, GL從不淘汰任何老的API. DX10相對於DX9,是個全新的API,革命性的更新,徹底推倒重來. 但GL為了向後兼容,保留了很多對硬體和驅動都不友好的API.除了跨平台和早期對精度的要求比DX高,其他簡直是一無是處」似乎沒人提到生態環境問題。dx的生態環境包括很方便的調試工具、資源查看工具、指令流截取工具。。。gl的生態環境只能吃屎。
這個說起來很有淵源啊。
能追溯的歷史告訴我們,有一款顯卡,開天闢地,市場佔有率85%,叫Voodoo,還有一款api和它配套,叫Glide。
可惜,Glide並不開放。而且它的東家3dfx堅持只把這套api用於遊戲,並且只用於自家的顯卡,縱使效率極高,也只能局限在「打遊戲」這個領域。當然後來這玩意也開源了,只是那時候的3dfx已經無力回天。
另一款叫做OpenGL的api走入了大家的視線。
SGI做出的OpenGL在遊戲領域和專業領域無往而不利,微軟大為緊張,慌忙發布了DirectX 1.0,可惜此時OpenGL已經到了1.1,微軟落後了,而且DirectX此時非常不成熟,所有人都在嘲笑,觀望。
微軟祭出了殺手鐧,Windows。
世界慢慢將會知道,微軟憑藉這個殺手鐧,在前PC時代呼風喚雨,所向披靡。
微軟做出了很大膽的決定,在Windows 95中停止支持OpenGL,只支持自家的DirectX 3.0。業界罵聲一片,微軟也被迫在OSR2中請回了OpenGL。
但是微軟不甘心,微軟一步到位,發布了DirectX 5.0。此時微軟學乖了,把選擇的權利交給了顯卡廠商,你們的驅動程序怎麼開發都是你們的事,DX和OGL都隨便,我就看看。
此時的3dfx已經沒落,Voodoo風光不再,過於封閉的api,過於貪婪的3dfx,帝豪等代工廠紛紛轉向新星nVIDIA。 微軟遠沒有高枕無憂,它還需要遊戲廠家的支持。
OpenGL聯盟內部的爭吵扯皮,嚴重拖慢了遊戲廠家進步的腳步,DirectX 7.0和NT5無疑是莫大的利好。完全可重入,對稱多處理,32位,強大的穩定性,造就了Windows的另一次輝煌,也成就了DirectX。
後來……
微軟頭頂旋轉的光球(DX7),踩著Netscape的屍體,手握雙股劍,一把鐫刻著Windows,一把鐫刻著Office,旁邊是躊躇滿志的Intel,傲然站在山上,「還有誰??!!」
那是2001年。
------------------
感謝評論區的指正。
鄙人愚見,DirectX搭上了Windows這趟順風車。當時的微軟有實力,有決心,也有貫徹到底的執行力,和今日之大船難掉頭的窘境比不可同日而語。OpenGL的硬體兼容性不如DirectX。用OpenGL寫一個程序,在nVidia上跑起來了,百分之八十是沒法在intel上跑,百分之九十九沒法在AMD上跑。OpenGL直到目前為止如果不用DSA的話,設置一個對象的屬性還得先綁定,這樣一來就使得code變得高度依賴於一個時刻在變的狀態,而且很多驅動的實現某些特定的狀態下有各種bug,極難調試。例如我之前在intel上跑一個程序,如果不每幀都重新設置一個framebuffer object的render target, 那個framebuffer到了下一幀就莫名其妙的失效了,而在NV和AMD上都沒有此問題,但是AMD又出了另外一個問題。
DirectX的好處有微軟幫你測試兼容性。一個驅動想拿到WDDM認證,先得跑通積累了十幾年的test set,這樣一來在實際中遇到問題的可能性就大為減少了。另外DX有開發調試環境的優勢,以及更合理的API設計。
雖然說NSight現在也支持OpenGL調試了,但是他現在只支持到OpenGL 4.3。這意味這如果要調試shader,就沒法用DSA擴展。而DirectX就不存在這種開發工具支持和新功能只能選其一的問題。
=============
順便補充一下什麼是DSA以及這說明了OpenGL一直以來是多麼的傻逼。
在OpenGL裡面,創建一個紋理、FrameBuffer之類的東西之後,如果要設置這個對象的屬性,必須先綁定,整個流程是這樣的:tex = CreateTexture(); //創建對象BindTexture(0, tex); //把對象綁定在0這個位置SetTextureParameteter(0, param, value); //把0這個位置的對象的param參數設置成value簡直是愚蠢到家了。因為很多渲染命令都depend on當前綁定的對象,為了設置一個其他對象的值,會破壞當前的綁定,如果自己不恢復回去,剩下的代碼可能就不能工作了。為了解決這個問題,他們在OpenGL 4.5才加入一個叫做直接狀態訪問(Direct State Access)的擴展,這個擴展是幹什麼的呢?就是把上述過程變成這樣:
tex = CreateTexture();SetTextureParameter(tex, param, value);也就是正常人使用的各種API的一貫方式。把一個常識性的做法引入OpenGL,就成了OpenGL近幾年來的一個重大突破性新功能,簡直是笑話。你覺得終於能使用正常的API了?不行 - 大部分驅動現在都不支持OpenGL 4.5, intel 只支持到4.2。NV雖然支持,但是你想用NSight調試的話,還是老老實實用4.3以前的API。
曾經有人說OpenGL是狀態機模型,所以它更加貼近硬體,效率更高,云云。
事實上這些說法都是狗屁,狀態機只是OpenGL的設計者們一時的喜好而已。早期硬體還沒有現在設計這麼複雜,當然是狀態機為主的沒錯,但是也和OpenGL的狀態機八杆子打不著關係。兩套狀態機的映射,bug多,overhead大。所以為什麼專業顯卡買那麼貴?和硬體關係不大,基本上你多出的錢,九成都是交給驅動了。
當然,考慮到應用領域,OpenGL提供了很多不錯的特性,比如即時繪製,累積緩衝,Polygon,AA Line等等,但是這些特性都是給CAD這樣的工業軟體用的,遊戲基本上用不著。既然好的都用不著了,狀態機那套時代渣滓,就更犯不著繼承了。
於是Game開發者就都去用DX了。如果Linux上有類似於DX的介面,只要它真正被廣泛支持了,包括但不限於OpenGL DSA 擴展,相信我,沒有哪個開發者會腦袋抽風繼續跟隨坑爹的狀態機的。補充一下Windows的限制。
在Direct3D在9.0c後就不支持Windows XP了,Direct3D 11.1也只有限度支持Windows 7。那麼即使有SM 4.0或以上的硬體也無法在較早版本的Windows中使用。
而OpenGL只需要顯卡廠商繼續提供驅動,便可以在各Windows版本里使用最新的硬體功能。很重要的歷史原因 @vczh已經提到了。
對於從遊戲開發者角度而言,OpenGL 曾經是個沒人用的東西,Windows / Xbox 上可以用 DirectX,PS3 和 Wii 則又是另外的圖像API。直到iPhone的興起,OpenGL 居然又活了過來,你看現在連 WebGL 都出現了,有一種統一天下的感覺。
遊戲開發者又開始重視 OpenGL 了,當然主要還是 OpenGL ES。對於顯卡公司而言,Windows 上的 D3D 驅動特別重要,會針對各種流行遊戲進行定製、優化、hack……至於 OpenGL 驅動,似乎只要滿足 CAD 大廠的需求即可,畢竟幾乎沒有 Windows 上的 OpenGL 遊戲啊……
現階段,從性能考慮(D3D 驅動會特別優化),大型的遊戲還是以 D3D 的形式發布,不排除 OpenGL 的優化上去以後也會有大型的桌面 OpenGL 遊戲。
對於微軟而言,他對於OpenGL的限制非常多,比如WindowsRT,Windows Phone是不支持OpenGL,Windows商店裡的應用也必須是DirectX的。你要知道,至少到vs2008,vs自帶的opengl頭文件都只是1.1版本的,你這叫人如何用?
微軟為了發展DX抑制OpenGL幾乎每一本OpenGL書籍都會提到。
-------分割更新--------
再有就是DX的SDK屬於雖然要自己下而且很大但是可以開箱即用,OpenGL就不一樣了,glew,glext,glut等等一大堆各式版本的頭文件,還要自己保證兼容等等問題……不說了,都是淚
效率不敢多說,至少DirectX的api手感用起來特別舒服。OpenGL總覺得各種設計得莫名其妙……
近10年來,opengl追趕dx就跟java追趕C#一樣。opengl原本是一種設計來做CAD的api,後來被用來搞遊戲,火了之後不思進取,造成了計算模型落後到爆炸,後面才慢慢改成了dx11現在的樣子的。
而且opengl煞筆還要怪那些A開頭公司的編譯器。眾所周知,一個公司一旦以A開頭,那他自主研發的編譯器就跟垃圾一樣。opengl(和opencl一樣)標準要求驅動程序自己去寫編譯器,就別說linux了,在windows上不同的卡都有互相不兼容的bug。而directx的標準要求驅動程序解釋一個指令集的中間語言,不兼容的情況就少了好多,雖然還有,但是已經沒什麼所謂了。
不過由於底子不好,opengl的api用起來始終沒有dx11那麼舒服。
P.S.,由於opencl也是一個德行,在windows上的A卡定義一個struct都會導致驅動程序崩潰什麼的,讓人怎麼用啊,只能選cuda或directcompute了。
我大學的圖形學課程教了我OpenGL入門。
如果改成DirectX入門我估計要掛到天荒地老...OpenGL上手容易:強大的glut封裝了很多諸如創建窗口之類的繁瑣工作,而且一開始你根本不需要接觸複雜的頂點緩衝之類的複雜概念,挨著調用glVertex(),glColor()之類的函數就可以一個一個的將頂點畫上去。反觀DX,除了從一開始你就得掌握一些windows編程知識用於基本的創建窗口之外,你還必須掌握頂點緩衝,一次性傳輸所有頂點進去才可以讓DX進行繪製。作為新手,用OpenGL畫一個正方體比DX容易太多... 也更容易建立初始的成就感和興趣...
事實上老師根本沒有講到頂點緩衝以後的知識。畢竟是計算機圖形學,不是OpenGL課... 這些都是我後來自學的。不過還好我學了,DX才能入門..
作為一個兩邊都接觸過的碼農來回這個帖子。因為太久沒碰GL,可能有誤,歡迎指出。代碼我就不貼了。
...好像偏題了主要是產業鏈控制力和生態營造的問題,這個已有帖子講過了,不多說。從使用者的角度補充兩句。dx流行主要是因為:在適配管理方面,它對開發者比ogl更友好。
在遊戲產業里其實有很大一塊成本涉及「適配優化」,不同設備、不同平台的適配,不同vendor顯卡的適配,不同版本驅動的適配,等等。幫助內容提供者專註遊戲內容創作而非無休止的適配技術工作,是圖形API最大價值所在。真正理性的遊戲開發商都明白,遊戲製作的核心在於內容成本,而非其技術支撐成本,但真正的遊戲產品必須得考慮對不同顯卡的支持,以覆蓋儘可能多的用戶群,從遊戲開發商的角度,適配工作實際上屬於商業價值不高的工作(比方說,有很多專給遊戲廠做移植 適配的外包廠),在成本上拖後腿,但卻不能不去做,所以這裡的重點在於,作為開發者,誰能幫我節省這塊成本我就挺誰。
基本上,從圖形API使用者的角度,ogl使用者看待適配問題(如feature,即你在圖形編程中能使用的技術功能)是以「顯卡+驅動版本」的組合為粒度單位,也就是說不同顯卡feature不同,甚至同一顯卡不同驅動版本的feature不同。而dx使用者看待適配問題則是以d3d level(如d3d9 d3d11)為粒度單位,只要明確了顯卡的support level,至少feature上能保持一致,最大區別一般在於性能差異。前者適配粒度顯然比後者要細得多,隨之而來的適配工作量也大的多。這個是從使用者的角度所看到的dx比ogl流行的根本原因。顯然opengl更好,看起來更開放的樣子;雖然沒怎麼接觸過具體項目的編程,opengl的樣常式序還是跑過幾個的。。。
然而在windows上用opengl,就和現在微軟在ios上推office365一樣的可笑, 看看曾經叱詫風雲的網景吧?
至於首帖提到的介面友好性:
難道windows代碼很容易入手,看看各類的win代碼書籍吧,我不相信沒人會覺得是醜陋的代碼,如果你真用過其他現代語言的玩意兒的話。。。
強烈建議初學計算機圖形學的玩家不要跳OpenGL這個坑,可能在你編譯第一個demo的時候,這輩子就和CG絕緣了。下面就是我的血淚史:
首先,OpenGL自身功能集成度太低,你要麼選擇大量的附加依賴項,要麼寫大量的代碼。於是各種附加依賴層出不窮,從創建Wnd的glut到windows擴展glew,你都需要了解學習。不過你學習的過程就會驚喜的發現,有一些竟然不更新了,XP available ONLY 哦!剩下那些有更新也是一個丑的不能看的網站(還不如GNU系列的網站,你懂得),只提供源碼(由於伺服器緣故,下載速度讓我還以為被牆了),需要自己編譯。很多還是有多層依賴的,這些都需要自己一層一層的下載編譯。而且由於C++編譯選項千奇百怪,你必須要注意每個庫的編譯,否則鏈接錯誤就是個災難。而且由於都是自己編譯的,拿到別人的電腦上也沒法用,別人也需要重新編譯,甚至還要修改一些頭文件的引用!面對一堆不是你寫的,一坨宏和依賴項的C++頭文件,去修改,畫面真美。而且每換一個地方就要編譯20分鐘,那酸爽也是絕了。
而且你想寫原生的windows窗口,使用Windows Message Loop,而不是用glut的玩具一樣的功能,由於沒有Help Templates,我當時為了寫一個支持多重採樣的窗體,看了十幾個OpenGL的英文(中文幾乎沒有開發者!呵呵)wiki和網上教程,才理解了gl繪圖上下文的「二次創建」還有顏色模式。最後寫出了一個好幾百行、N多函數滿地宏的main.cpp。當我給別人講這些的時候,別人都覺得是天書。而一年之後,我也忘了。而DX3D我下載了Sample之後,由於有Templates、Help Tools,我根本不操心窗體創建、Message Loop,可以直奔主題編輯圖形,感覺直接到了天堂。
此外,OpenGL裡面各種綁定,API介面,讓人頭暈目眩,一個函數N個參數(而且參數名字長相還特別像,還都是宏,酸爽你懂得),還由於開發者少,生態差,沒有一份清晰的文檔,也沒有特別好的教程。當時為了學習OpenGL,我買了一本紅寶書,簡直是API Reference + 計算機圖形學導論啊,就覺得100塊錢買了個磚,根本看不下去。順帶一提,這個綁定機制極其反人類,當時一不小心綁定錯了一個ID,各種詭異的現象都出現了,因為模型庫都來自於修改第三方,debug用了一天,順便讀了一次3000多行的3D圖形導入庫,對這一坨坨的遞歸找BUG,學到的知識簡直豐富無比,DEBUG技能點不知道增長了多少。
同樣是由於生態差,目前本應該主流使用的GLSL也很難找到資料學習,所以只能用1.1版本的API。然而放棄GLSL就等於回到了那個固定流水的老GPU時代,現代GPU的高效運算、多線程根本用不到了,又回到那個CPU運算為主,命令列表渲染的低效率時代。老師講解的模型視點變換、透視變換,本來都應該是自己用GLSL實現的,結果都變成了調用現成API,學的東西和練習的東西完全脫節,導致課程實驗效果很差,學生們做起來都是十分痛苦。最後圖形學的知識幾乎成了死記硬背來考試的,學生也沒有在實驗中獲得多少快樂(個別如我這種喜歡自虐的除外。
當然,最大的問題是難以調試!純C++的OpenGL出BUG時儘管看不到調試的圖形反應,但是起碼能看到數據反映。但是加入了著色器以後的,如果C++部分編譯、運行全部正常,然而卻沒有任何圖像或者不盡如人意的話,恭喜你,鍋都在GLSL的部分,而這一部分根本你不能調試,只能對著黑屏發獃思考哪個公式不對,那個數據傳遞有問題,可能一折騰幾個小時就過去了。後來儘管有nSight,但是筆記本雙顯卡還不能用(默哀~,不知道現在改進了嗎?)。這樣的調試支持,可以說是要把開發者逼上梁山,不能Debug還玩毛線啊。
網上有人評論,OpenGL你看一本紅寶書下去,寫出的代碼都未必能運行;但是你用DX3D,HelloWorld Sample能跑,基本就可以出程序了。看我想他們易用性差距也就這麼大吧。
最後,因為OpenGL的一坨坑,我差點放棄學習計算機圖形學,幸好我憑藉「毅力」挺了過來,還做出了一個有天空盒、地形、模型導入、粒子系統、反狗牙的小圖形引擎,拿了很高的分數。儘管如此,這兩天搞畢設,我寧願用從來沒有接觸過的DX3D做,也不願意再碰OpenGL了,畢竟少生點氣,多活兩年比啥也重要。原本我是OGL的堅決擁護者,但是自從用了DX9之後。。。。。我可恥地叛變了。
OGL用起來太難受,各種狀態設置,相比之下還是DX的比較方便點。還有HLSL裡面的EFFECT框架,簡直方便到爆!嗯,除了WINDOW那噁心地命名方式和那噁心的編程風格之外。那些東西就是逼著你轉JAVA或者C#的。windows對OpenGL的支持有限制,linux上不能直接跑DirectX,只能在wine里跑 ~~
題主的這個問題也就是為什麼linux下的遊戲沒有windows下的多的原因了~個人感覺是 OGL 的API 不好用。話說現在鼓吹轉投OGL的一部分原因竟然是中國網吧大部分都還在用XP,DX新特性沒法用……
移動時代已然來臨,現狀正改變。而且windows專有遊戲漸漸會出人們的視野。再看API狀況會大不同。
大多數遊戲引擎都是兩種api都支持的,雖然從dx9以後,dx已經甩ogl好幾條街,但是,只跨平台一條,就能保證ogl不死,而移動設備的崛起,正式宣告ogl的春天
DX6 7的時代,directX的殺手應用其實是directdraw,當年因為硬體限制,3D遊戲畫面太有風格,2D遊戲依然佔有大量份額,典型的就是暴雪成名作:魔獸2,暗黑1,偽3D的FPS毀滅公爵,雷神之錘等。
沒有Windows, DX是什麼?
前幾天剛好 @戴一冕 給我看Matlab運行bench的結果,同樣的配置下Linux表現遠好於Windows,檢查分項結果後發現差距全出在3D渲染上,而Matlab在兩個平台上都是用OpenGL的,可見Windows對OpenGL做了很大限制?
推薦閱讀:
※遊戲的漢化過程是怎樣的?
※如何評價虛擬搖桿在手游中的廣泛運用?
※獨立遊戲在國內有戲嗎?
※是否非攻擊性的交互難以在塑造情感的同時塑造遊戲性?
※你會開發一個什麼樣的遊戲給女朋友當生日禮物?