• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            實時陰影繪制技術研究

            C++博客 首頁 新隨筆 聯系 聚合 管理
              48 Posts :: 20 Stories :: 57 Comments :: 0 Trackbacks
            圖形世界分裂的兩派——理清D3D和OpenGL的脈絡(上)

            [圖形世界分裂的兩派]

            計算機三維圖形是指將用數據描述的三維空間通過計算轉換成二維圖像并顯示或打印出來的技術,API(Application Programming Interface)即“應用程序接口”是連接應用程序與操作系統、實現對計算機硬件控制的紐帶,Direct3D和OpenGL是目前的兩大3D圖形 API,要在你的3D顯卡上進行3D特效的制作、實現都必須通過它們(Vooodoo迷們肯定對Glide接口記憶尤深,可惜已隨著3dfx的倒閉而作 古,其它還有Heidi等接口)。關于D3D和OpenGL的理論知識可以寫一大堆厚厚的書,在這里我只為大家簡單介紹一下基礎知識,有興趣深入研究的朋 友可以自己上網查詢相關資料。

            Direct3D(D3D)


            Direct 3D是基于微軟的通用對象模式COM(Common Object Mode)的3D圖形API。它是由微軟(Microsoft)一手樹立的3D API規范,微軟公司擁有該庫版權,它所有的語法定義包含在微軟提供的程序開發組件的幫助文件、源代碼中。Direct3D是微軟公司DirectX SDK集成開發包中的重要部分,適合多媒體、娛樂、即時3D動畫等廣泛和實用的3D圖形計算。自1996年發布以來,Direct3D以其良好的硬件兼容 性和友好的編程方式很快得到了廣泛的認可,現在幾乎所有的具有3D圖形加速的主流顯示卡都對Direct3D提供良好的支持。但它也有缺陷,由于是以 COM接口形式提供的,所以較為復雜,穩定性差,另外,目前只在Windows平臺上可用。



            作為微軟DirectX技術的組件之一,Direct 3D也隨著DirectX的升級而不斷更新,同時在微軟的全力扶植下,Direct 3D技術的發展速度極快,DirectX 7:正式支持硬件T&L(光影變換)、DirectX 8:對Pixel Shader(像素著色器)Vertex Shader(頂點著色器)的支持、DirectX 9:提供2.0版本的可編程頂點和像素著色模式,顯卡硬件廠商也紛紛以對最新的D3D特效的硬件支持為賣點。遺憾的是,由于平臺的局限性等原因,D3D應 用至今仍主要集中于游戲和多媒體方面,專業高端繪圖應用方面,老牌的3D API---OpenGL仍是主角。

            OpenGL


            OpenGL的英文全稱是“Open Graphics Library”即“開放的圖形程序接口”,它是計算機工業標準應用程序接口,主要用于定義二維三維圖形。

            OpenGL是一套底層三維圖形API,之所以稱之為底層API,是因為它沒有提供幾何實體圖元,不能直接用以描述場景。但通過一些轉換程序,可以很方便的將AutoCAD、3DS等圖形設計軟件制作的DFX和3DS模型文件轉換成OpenGL的頂點數據。

            OpenGL是與硬件無關的軟件接口,使用它圖形軟件生產廠商再不用為各種不同的機型開發設計不同的軟件,只要操作系統使用了OpenGL適配器就可以達 到相同的效果,它是一個開放圖形庫,目前在Windows、MacOS、OS/2、Unix/X-Windows等系統下均可使用,且僅在窗口相關部分 (系統相關)略有差異,因此具有良好的可移植性,同時調用方法簡潔明了,深受好評,應用廣泛。OpenGL能在網絡環境下以客戶機/服務器模式工作,充分 發揮集群運算的威力,是專業圖形處理、科學計算等高端應用領域的標準圖形庫。



            將OpenGL稱之為SGI的OpenGL毫不為過,它源于SGI公司為其圖形工作站開發的IRIS GL,在跨平臺移植過程中發展成為OpenGL。SGI在1992年7月發布1.0版,后成為工業標準,由成立于1992年的獨立財團OpenGL Architecture Review Board (ARB)控制。SGI等ARB成員以投票方式產生標準,并制成規范文檔(Specification)公布,各軟硬件廠商據此開發自己系統上的實現。只 有通過了ARB規范全部測試的實現才能稱為OpenGL,現在的ARB投票成員包括SGI、Intel、IBM、nVIDIA、ATi、 Microsoft、Apple等業界群英。2001年8月ARB批準了1.1版本,最新版規范是2002年7月24日通過的1.4版本。

            看完了上面關于D3D和OpenGL的介紹,可能會給人這樣一種印象:D3D和OpenGL井水不犯河水,一個定位于高端工業標準,一個定位于低端娛樂,互不相干,但其實它們暗底下早就已經開始在較勁了。

            雖然早在WinNT 3.51 時代,Microsoft就已經實現了它的OpenGL 版本,但卻不肯隨其Windows95 提供,稱該API 只適合高端應用,而Win95面向一般消費者,用不到。但后來大名鼎鼎的ID Software 的高手,DOOM、Quake之父John Carmack在開發下一代三維圖形引擎時戲稱Direct 3D為可怕的、支離破碎的API,并極力建議采用OpenGL,此后以他為代表的一大批游戲開發人員開始多方呼吁MS積極支持OpenGL。 Microsoft終于在Win95的OSR2版本里集成了OpenGL。

            1999年SGI宣布與Microsoft合作開發Ferihant,即Windows的下一代圖形處理體系,包括DirectX與OpenGL的低級圖 形處理接口和以場景圖支持為特點的高級接口,并且就此停止對其在Windows下的OpenGL實現的支持以示決心。此舉舉世矚目,大家都以為 Windows圖形處理快要過上幸福生活了,然而,不久,SGI宣布中止合作,并撤回派出的科學家,Ferihant基本上夭折。SGI 稱終止合作的原因是Microsoft不肯積極合作,光想把SGI 的技術合并進DirectX,真正內幕不詳。不過以SGI在圖形處理界的老大地位來說,還是有幾分可信度的,因為Microsoft最初支持OpenGL 就不積極。



            由于要考慮到團隊中大多數人的利益,由ARB架構檢查委員會維護的OpenGL總是停滯不前,唯一的進展僅是OpenGL擴展指令的推出。這些擴展指令是 一些繪圖功能,像是ClearCoat、Multisample、視頻及繪圖的整合工具(某些是通過OpenML的努力而開發出來的,它本身屬于 OpenGL ARB擴展指令之一)。這正好給也是ARB成員之一的Microsoft找到了借口,他抱怨ARB對市場的反映極為遲鈍,因而拋開OpenGL,頃其所有 的開發資源,獨自全力投入使DirectX成為高端繪圖、與游戲開發API的工作上。

            D3D和OpenGL的互相滲透也早已初露端倪,你可以在市面上看到不少采用OpenGL的游戲如QuakeIII、重返德軍總部等等,也可以看到Direct 3D憑著自身的優勢,在3DS Max上漸漸超越OpenGL,關于這方面具體的介紹會在文章后面部分講到。

            OpenGL與DirectX代表著繪圖世界分裂的兩派。
            [它們如何工作?]

            前面我們已經看到,由于種種原因,我們不得不接受兩個3D API的現實。雖然如此,顯卡對D3D和OpenGL的支持卻不是分裂的,聰明的硬件廠商有辦法讓它的顯示芯片很完美的同時提供對D3D和OpenGL的 硬件支持。說到這里,我們不得不感謝nVIDIA,除了對D3D的支持,從它的Riva128芯片組開始,nVIDIA就提供對OpenGL的極佳的支 持。現在,我們的主板上不必插上Direct3D和OpenGL兩塊顯卡,也不必不時把VGA接口從一塊顯卡換到另一塊顯卡,能夠避免這樣恐怖的情景,這 真是值得欣慰的。還記得嗎?Voodoo讓2D和Glide統一的方式是插兩塊顯卡再用一根信號連接線將它們連起來。

            游戲程序員們曾經對OpenGL的技術和畫質推崇倍至,以至于微軟被迫在Windows系統中引入OpenGL,并且在Windows平臺上出現了 Quake II、QuakeIII、重返德軍總部等一批優秀的基于OpenGL API的游戲,而同時期的D3D游戲沒有哪一款能在畫質上超越這些OpenGL游戲的,一直到微軟發布DirectX 7,這種情況還是沒有發生多大的改變,DirectX只是作為一個能用于快速開發游戲的API而存在著,但是當微軟在2001年發布了DirectX 8以后,局面終于被扭轉了,DirectX 8是DirectX發展史上一個里程碑式的產品,它在2D、3D、視頻、音頻以及交互式輸入設備接口方面進行了許多重要的改進,其中,在3D圖形處理方面 尤其做了劃時代的改進,可以說,作為一個游戲API,D3D 8已經超越了OpenGL。出現這樣的情況決非偶然:OpenGL是由ARB這一官僚機構管理的,官僚主義帶來的自然是OpenGL發展的停滯不前,以至 于在OpenGL 1.0推出后的相當長的一段時間里,OpenGL唯一做的只是增加了一些擴展指令集,可笑的是最新的OpenGL 1.4中的一項Vertex編程框架技術還被同為ARB成員之一的微軟指控侵犯了DirectX 8的專利;而Direct3D這邊卻得到了微軟傾盡全力支持,技術更新極快。不超越OpenGL才怪呢。

            DirectX 7在處理3D的時候是遵循一種傳統的方式:

            CPU頂點數據---〉
            T&L引擎---〉裁減/三角形設置/光柵化---〉多紋理混合處理---〉霧混合---〉透明度/模板和深度測試---〉幀緩沖

            上面是傳統(如DirectX 7和OpenGL 1.2)3D圖形處理流水線的情況,雖然這種架構在多年的實踐中被證明是一種高效率的3D圖形處理方式,在硬件上容易實現,編程也相對簡單。但是采用這種 方式,軟件開發人員不可能干預3D圖形處理的過程,他們惟一要做的工作就是將硬件支持的各種效果事先規劃好,再送入3D流水線進行處理。3D圖形處理器所 能完成的工作在硬件設計好以后就不能被改變了。可以說這種結構在很大程度上制約了軟件開發者的想象力和創造力。而DirectX 8在傳統3D圖形處理流水線中的兩個地方進行了改進,增加了“可編程”特性:

            CPU頂點數據---〉
            Vertex Shader、T&L引擎---〉裁減/三角形設置/光柵化---〉Pixel Shader、多紋理混合處理---〉霧混合---〉透明度/模板和深度測試---〉幀緩沖

            上面就是DirectX 8可編程3D圖形處理流水線的示意圖。與過去的處理方式相比,DirectX 8對兩個部分進行了改進:一個可編程的Vertex Shader(頂點著色引擎)代替了過去的幾何變換和光源處理(T&L)引擎;而可編程的Pixel Shader(像素著色引擎)則加入了過去的紋理處理流水線。

            當然未來的走向還有可能變化。采用像素著色與頂點著色的缺點,在于并無標準的可編程能力供繪圖硬件之用,以至于DirectX 9未正式出現之前,兩大GPU制造商Nvidia與ATI在DirectX的運用上已經分道揚鑣了,這可能會對Direct3D產生不利的局面。 OpenGL則不甘示弱,即將出臺的OpenGL 2.0會試圖將穩定性及開放標準,帶至可編程繪圖及GPU上,很可能再次全面超越DirectX。一些人懷疑Microsoft聲稱擁有OpenGL 2.0部分功能專利權,OpenGL 2.0將是OpenGL下一個重要修正版。

            毫無疑問,目前的市場上,娛樂級的3D顯卡競爭是最激烈的,目前能夠完全硬件支持DirectX 8的顯卡主要有:nVIDIA的Geforce3以上、ATi的Radeon8500以上級別的顯卡以及SiS的Xabre、Matrox Parhelia-512等其它廠商的顯卡。而考慮到性價比等因素,只有nVIDIA、ATi兩大顯卡領域的領頭羊是最佳選擇。要想發揮nVIDIA、 ATi的3D性能,用好它們的驅動程序也是極其重要的,關于nVIDIA、ATi驅動程序版本及D3D、OpenGL支持情況、設置界面我們會在后面的應 用篇講到。
            [細談D3D、OpenGL]

            如果你對各顯卡硬件廠商系列顯卡的發展史知之甚少,識別一塊顯卡對D3D和OpenGL的支持情況,最直接的方法就是看它的規格說明。

            以這塊麗臺Quadro4 550 XGL專業顯卡為例:


            麗臺Quadro4 550 XGL

            隨卡的說明書上標明“麗臺Quadro4 550 XGL的產品特性:硬體疊覆平面、硬體防鋸齒線條、雙面投影、全景防鋸齒、第二代閉塞選擇、第二代光速記憶體架構、單一顯示器支援 2048x1536、第二代nfiniteFX引擎、硬體支援Microsoft? DirectX? 8 和 OpenGL? 1.3。”很清楚,這是一塊硬件支持DirectX 8和OpenGL 1.3的Quadro4核心的顯卡,千萬不要被JS的花言巧語蒙騙了。

            讓我們先選擇一款現在最流行的《魔獸爭霸III》游戲來試試D3D和OpenGL吧。《魔獸爭霸III》是今年剛推出的全3D的游戲,《魔獸爭霸III》 默認啟動DX8.1的D3D模式,但還有一種模式就是OpenGL的3D模式, 并不是暴雪公司不愿意設它為主要模式,而是OpenGL是屬于專業三維,有一部分游戲顯卡還不支持或不完全支持這個功能。要想打開OpenGL模式,我們 需要編輯一下《魔獸爭霸III》的快捷方式,在exe文件后面加上-opengl參數,再運行快捷方式進入游戲即可。要想返回D3D模式,也只要把- opengl參數去掉即可。


            D3D截圖


            OpenGL截圖

            OpenGL模式與D3D模式相比,唯一比較明顯的就是字體變得有些模糊。


            D3D截圖


            OpenGL截圖

            從游戲截圖中我們可以看到D3D和OpenGL模式下,游戲畫面幾乎沒有任何區別。設計兩個API的作用在于,在你的顯卡運行某個API出現貼圖錯誤或者 或者運行速度跟不上時可以試著切換另一個API來糾正,據說在OpenGL運行《魔獸爭霸III》并在控制面板中啟用OpenGL的"MIP線性過濾功能 "(MIP就是快速線性圖像處理)可以提升游戲速度10%。
            [再聊專業應用]

            再來看看D3D和OpenGL在3DS MAX 5.0中的表現(使用顯卡:Geforce3 Ti500)。

            3D Studio MAX 5.0是Discreet公司今年6月份發布的最新三維動畫創作軟件。3DS MAX在全球有數以百萬計的使用者,超過了其它幾種主要3D動畫軟件的用戶總數。同時,3DS MAX也是在專業軟件中為用戶考慮最多的軟件之一,在它支持的圖形標準上就可以看出這一點。3DS MAX共支持4種3D顯示接口,分別是Heidi、OpenGL、Direct3D和 Custom。其中Heidi是由AutoDesk公司自己開發的3D API,缺省情況下采用軟件方式進行3D模型的顯示,雖然能夠顯示的效果有限,不過由于Heidi的效率出奇的高,因此它對于顯卡硬件功能和性能較弱的用 戶來說還是不錯的。OpenGL是目前主流的3D API,3DS MAX毫無保留的對此提供了支持。OpenGL效率很高,它可以很好的利用硬件性能(包括硬件T&L)來加速模型的顯示。在DirectX 8未推出以前,OpenGL也是能夠顯示最多效果的3D API。在3DS MAX中,Direct3D過去主要是為了使不支持OpenGL的低端顯卡能夠用來對動畫制作進行加速。不過,由于過去Direct3D的效率不高,功能 有限,而且采用這種方案的用戶也不多,因此長期以來沒有得到足夠的重視。直到支持DirectX 8的3DS MAX 4和Geforce3顯卡的推出,才使這種情況發生了極大的變化。和之前的4.X系列不同的是,MAX 5.0已經把一些基本的硬件Vertex、Pixel Shader Plug-in默認地加載了,當采用Direct 3D驅動模式的時候,我們就能應用上硬件Shader帶來的好處了。在3D Studio MAX 5.0目錄的scenes、Version5Features、DirectXFeatures文件夾下有兩個應用了DirectX 8特性的模型,它們利用了Pixel Shader的貼圖,表現出了極其逼真的環境反射效果等(詳見下圖)。這樣的實時渲染效果已經極其接近于最終的渲染效果,這是目前的標準OpenGL接口 所做不到的。

            如果你使用的是nVIDIA Quadro系列的顯卡,也可以考慮用基于OpenGL的專業的MAXtreme來代替標準的OpenGL接口,與3DS MAX提供的標準OpenGL接口相比,MAXtreme能夠提供更多的效果和更好的性能,如高質量透明度、真實感覺的霧化效果、各種紋理過濾方式等。另 外,MAXtreme對于顯示的加速作用是十分明顯的,在MAXtreme中打開Triangle Strip選項可以使復雜線框模式下顯示性能提高50%以上。



            3DS MAX共支持4種3D顯示接口,支持DirectX 8.1(配合Geforce3以上顯卡)




            3DS MAX 5.0的D3D和OpenGL設置窗口









            biplane.max模型的DirectX 8和標準OpenGL的實時顯示效果



            TigerTank.max模型的DirectX 8實時顯示效果



            TigerTank.max模型的標準OpenGL實時顯示效果

            關于OpenGL和D3D的設置后的效果比較以及產生畫質差異的原理分析:兩大API各有自己的特性,有相同又有不同之處,就好像子集與交集。比如 OpenGL 1.4的新功能包括深度紋理和陰影紋理,可以支持實時引擎和相關圖象渲染技術,一個Vertex編程框架,支持用戶定義幾何,光照和陰影程序的階段設置, 支持高級一般應用Shading語言,支持自動紋理mipmap生成,同樣的增強功能還包括多繪圖陣列,Windows光柵定位,用戶定義霧表坐標軸和第 二個顏色,點參數,LOD等等功能,而DirectX 8.1也包括Vertex編程。有興趣詳細比較的朋友可以訪問以下鏈接:

            http://www.opengl.org/developers/documentation/OpenGL14.html

            http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28000410

            目前的兩大主力娛樂級顯卡廠商:nVIDIA的顯示卡對兩大API的兼容性都極佳,由于對OpenGL的支持過于優秀,nVIDIA甚至早就開始打入了專業顯卡領域。ATi在收購了FireGL以后也開始涉足專業顯卡。

            從Geforce256開始,nVIDIA每推出一款圖形芯片,都會針對主流市場和專業市場推出不同的產品: Geforce256/Geforce2/Geforce2 MX/Geforce2 Pro/Geforce3對應Quadro/Quadro2/Quadro2 MXR/Quadro2 Pro/Quadro DCC。以前nVIDIA的Quadro系列產品都是由德國的ELSA公司獨家推出的。包括象ELSA Gloria DCC(NV20 Quadro DCC)、ELSA Gloria4(NV25)等產品。Geforce與Quadro和核心十分相近,一些硬件發燒友成功的將普通的Geforce顯卡修改為昂貴的 Quadro專業顯卡。
            但這并不意味著現在的專業三維圖形卡與娛樂級顯卡差別不大,它們還是有很大的區別的。

            專業顯卡需要的不僅僅是貼圖和渲染速度,作為專業級的顯卡,它必須具備如下幾個特點:1、單位時間內處理三角形的能力要高;2、完善支持OpenGL; 3、具備極高的穩定性和兼容性;4、3D處理流程的全硬件化;5、顯寸盡可能大;6、價格較昂貴。在執行工業級應用程序時,設計人員絕對無法忍受任何不穩 定、缺乏效率的繪圖系統,在圖像準確度與品質上也毫不妥協。專業圖形加速卡的賣點恰恰不在于多邊形產生速度或像素填圖率等指標上,而是在調整驅動程序以及 提供繪圖的精確性方面。這也是為什么專業圖形卡,特別是高端圖形卡價位高得離譜的最主要原因。高檔專業顯卡的驅動程序往往都帶有對所有OpenGL函數提 供完善支持的OpenGL客戶端驅動程序(ICD),這些優化程序使用其專業的接口,通過與專業軟件的“無縫”結合,對提高機械CAD、建筑、動畫、模擬 等領域的工程師們的工作效率可以起到非常大的幫助。

            目前的專業顯卡市場上:3Dlabs WildCat系列、ATi FireGL4牢牢占領了高端圖形卡市場;Elsa Gloria系列、ATi FireGL2在中端市場上占半壁江山(包括最新的Quadro4、Radeon 8800、FireGL X1);Elsa的Synergy系列以超低價格搶占了低端市場,與3Dlabs Oxygen VX1/GVX1打得不亦樂乎。

            根據以上我們對各種3D API的了解,我們在進行電腦硬件系統配置時應該從應用重點出發選擇顯示卡。如果我們的電腦在PⅡ 233以上機型,平時又主要用于一般文字處理和游戲,或者也業余搞些3D圖形制作等,那么可以選擇支持Direct 3D和OpenGL兩種3D API的AGP顯示卡;如果你的電腦準備用于專業性的3D圖形制作,那你必須考慮選擇除了支持D3D和OpenGL外還支持MAXtreme、HeiDi 的專業圖形卡了。從實際應用情況看,對于大部分電腦業余愛好者只要選擇能支持最常用的DirectX(Direct 3D)和OpenGL的3D顯示卡就可以了。另外,我們在選擇3D顯示卡時,要注意對比新產品廣告宣傳中所列舉的支持不同的3D API時的測試數據,同時注意所能支持的3D API類型和數量,具體到Direct 3D測試數據時還可以注意它究竟能支持多少項(D3D可以支持12種以上3D圖形處理效果)D3D的功能。

            當你看到一個陌生的3D游戲畫面時,你能立刻看出它是基于D3D還是OpenGL的嗎?或許John Carmack可以,但我想我們大多數人都不能。我們需要知道的是我的應用程序需要哪種3D API才能運行得更有效率,哪種3D API可以讓我的游戲跑得更快更靚。

            posted on 2006-01-06 22:32 苦行僧 閱讀(3852) 評論(1)  編輯 收藏 引用 所屬分類: 轉載

            Feedback

            # re: 圖形世界分裂的兩派——理清D3D和OpenGL的脈絡(上) 2006-04-10 21:22 microsoftxiao
            你好,我想文下在游戲中使用.x .3ds .max文件也可以實時渲染嗎?  回復  更多評論
              

            人妻少妇久久中文字幕| 97久久香蕉国产线看观看| 无码专区久久综合久中文字幕 | 亚洲国产精品无码久久久久久曰| 国内精品久久九九国产精品| 2021久久国自产拍精品| 国产综合久久久久| 国内精品人妻无码久久久影院| 无码人妻久久一区二区三区免费| 亚洲国产一成人久久精品| 一本色道久久综合狠狠躁| 一本一道久久综合狠狠老| 亚洲AV成人无码久久精品老人| 亚洲精品无码成人片久久| 久久精品人人做人人妻人人玩| 久久精品亚洲日本波多野结衣 | 久久本道久久综合伊人| 久久久久久国产精品免费免费 | 亚洲中文字幕无码一久久区| 亚洲午夜久久久影院伊人| 久久影院综合精品| 亚洲国产精品久久久久婷婷老年| 狠狠色丁香婷婷综合久久来来去 | 无码国内精品久久人妻| 国产精品久久久福利| 国产成人精品久久一区二区三区av | 综合网日日天干夜夜久久| 人妻无码αv中文字幕久久| 色综合久久中文色婷婷| 很黄很污的网站久久mimi色| 97久久婷婷五月综合色d啪蜜芽 | 久久久久久九九99精品| 国内精品久久久久久久久电影网 | 国内精品伊人久久久久影院对白 | 亚洲色大成网站www久久九| 麻豆精品久久精品色综合| 人人狠狠综合久久亚洲| 精品国产91久久久久久久| 亚洲精品综合久久| 青青青国产成人久久111网站| 久久久久久久久久久|