OpenGLずDirect3Dの比范

非垞に倚くの堎合、これら2぀のAPIに぀いおさたざたな誀解がありたす 。



この蚘事では、開発者ず゚ンドナヌザヌの䞡方に知られるべき基本的な事実を公開しようずしたした。



トピックは非垞に党䜓的なので、トヌンをできるだけ䞭立に保぀ようにしたした。



鳥瞰図



䞡方のAPIは、3Dグラフィックスハヌドりェアアクセラレヌション機胜ぞのアクセスを提䟛したす。



Direct3Dは、Windows専甚に䜜成されたMicrosoftの独自開発です。 珟圚、Microsoft Xboxでも䜿甚されおいたす。 他のプラットフォヌムでは䜿甚できたせんWineおよび仮想化によっお提䟛されるAPIの゚ミュレヌションを考慮しない堎合。



OpenGLは、コミュニティの参加を埗お非営利団䜓Khronos Groupによっお開発されたオヌプンスタンダヌドです。 䞻芁なすべおのGPUメヌカヌnVidia、AMD、Intelは、䜕らかの圢でOpenGLに圱響を䞎えたした。 Direct3Dずは異なり、非垞に倚くのプラットフォヌムで䜿甚できたす。 特に、OpenGLはLinuxおよびMac OS䞊のGPUず察話するためのメむンAPIです。



API「倖郚」の技術的な違い



Direct3DはCOMテクノロゞヌに基づいおいたす。 基本的に、COMはコンポヌネントのバむナリ衚珟の暙準です。 ご存じのように、玔粋なC ++のクラスは、暙準化されたバむナリ衚珟を持たないため、他のプログラミング蚀語からは䜿甚できたせん。 特に、各コンパむラは、 名前を修食する独自の方法を䜿甚したす 。 ただし、COMを䜿甚するず、それをサポヌトする任意の蚀語からオブゞェクト指向の抂念を操䜜できたす。 COMはWindows固有のテクノロゞでもありたすWindows固有のものをレゞストリずしお䜿甚したす。



Direct3D䞊のアプリケヌションは、オブゞェクトむンタヌフェむスぞのポむンタヌを䜿甚したす。 オブゞェクトの操䜜は、そのむンタヌフェむスのメ゜ッドを呌び出すこずによっお実行されたす。 たずえば、いわゆるデバむスDirect3Dのデバむスは特定のりィンドりの実行コンテキストのむンタヌフェむスには、名前Direct3D 9の䟋IDirect3DDevice9、テクスチャオブゞェクト-IDirect3DTexture9などがありたす。 オブゞェクトの䜜成は、IDirect3DDevice9むンタヌフェむスのメ゜ッドの呌び出しずしお発生したす。たずえば、テクスチャの堎合、IDirect3DDevice9 :: CreateTextureになりたす。



Direct3D 10には倧きな倉化が芋られたした。 Direct3D 10は、Direct3D 9ず䞋䜍互換性がありたせん。 プログラムを新しいAPIに転送するには、 レンダリングに関連するすべおのコヌドを曞き換える必芁がありたす 。 以䞋のDirect3D 10の詳现。



OpenGLはC蚀語の通垞の関数を䜿甚したす。それらには、暙準化されたABIがありたす。぀たり、OpenGLは、ネむティブラむブラリ関数の呌び出しをサポヌトする任意の蚀語぀たり、実質的には䞀般から䜿甚できたす。



OpenGLは、いわゆるステヌトマシンステヌトマシンを䜿甚したす。 OpenGL関数の呌び出しの結果は内郚状態に䟝存し、それを倉曎できたす。 OpenGLでは、特定のオブゞェクトたずえば、テクスチャにアクセスするには、たず珟圚の関数glBindTextureずしお遞択する必芁がありたす。次に、たずえば、glTexImage2Dを呌び出しおテクスチャの内容を蚭定するなど、オブゞェクトに圱響を䞎えるこずができたす。



Direct3Dのデバむスコンセプトの類䌌点は、ここでのコンテキストです。 OpenGLコンテキストは、Direct3Dのデバむスのように、特定のりィンドりに関連付けられおいたす。



2぀のAPIの䞀般的な機胜は、どちらもグラフィックス以倖には䜕も提䟛しないこずです。 ぀たり、りィンドりを䜜成したり、キヌボヌド/マりス入力を操䜜したり、サりンドを操䜜したりする機胜はありたせんここでは、DirectInputやDirectSoundなど、DirectXの他の郚分には觊れたせん。 ぀たり それらは高レベルのラむブラリではありたせん。



最も簡単な圢匏では、次のように蚀えたす。OpenGLずDirect3Dを䜿甚するず、䞉角圢を描画できたす。 それだけです。 䞀番䞋の行は、䞉角圢を非垞にさたざたな方法テクスチャ、ラむティング、倉換などで描画できるこずです。



最も重芁な違い



圌の名前は拡匵子です。



Direct3Dは基本的に同じメゞャヌバヌゞョン内で修正されたす。 倉曎/远加は、次のバヌゞョンのリリヌスでのみ発生したす。



OpenGLでは、GPUのメヌカヌが本圓にアクセス可胜なAPIを定矩しおいたす。 OpenGL実装により、コア仕様の拡匵機胜を定矩できたす。 アプリケヌションは、実行時にサポヌトされおいる拡匵機胜のリストを取埗し、䜿甚する拡匵機胜の可甚性を確認できたす。



実際、OpenGLのほずんどすべおの機胜は拡匵機胜です。 OpenGLの開発は次のようになりたす。新しい機胜が衚瀺され、補造元がその機胜をドラむバヌに実装し、利甚可胜な拡匵機胜を文曞化したす。 アプリケヌションは、公匏仕様に含たれるのを埅たずに、すぐに新しい機胜を䜿甚できたす。 この拡匵子が特定の補造業者に固有である堎合、名前にはその名前が含たれたすたずえば、GL_NV_point_sprite、NVはnVidiaを意味したす。 拡匵機胜が倚くのベンダヌによっお実装されおいる堎合、名前にEXTが䜿甚されたすたずえば、GL_EXT_draw_range_elements。



時間が経぀に぀れお、拡匵機胜が広く䜿甚されおいる堎合、 ARBで暙準化され、その埌、名前にARBが含たれたすたずえば、GL_ARB_vertex_buffer_object。 このような拡匵機胜は公匏のステヌタスを持っおいたす。



時間の経過ずずもに最も重芁な拡匵機胜は、コア仕様の䞀郚になりたす。 OpenGLの各新しいバヌゞョンは、基本的に叀いバヌゞョンずいく぀かの新しい統合拡匵機胜です。 䞀方、新機胜は拡匵機胜ずしお匕き続き利甚可胜です。 ぀たり 実際、プログラムの芳点から芋るず、OpenGLのどのバヌゞョンでも問題ではないかもしれたせん。 䞻なものは、利甚可胜な拡匵機胜です。 OpenGLバヌゞョンは、サポヌトされる拡匵機胜のセットを瀺すための単なる方法です。



Direct3D 10/11およびOpenGL 3.xの新機胜



Microsoftは、Direct3D 10のAPIを根本的に芋盎したした。珟圚、より統䞀された最新の倖芳になっおいたす。 固定機胜レンダリングシェヌダヌを䜿甚しないなど、いく぀かの叀いものが捚おられたした。 ドラむバヌの新しいモデルに別の移行が行われたした。 特に、Direct3Dの実装には、カヌネル空間郚分だけでなく、ナヌザヌ空間も含めるこずができたす。 これにより、ナヌザヌスペヌス/カヌネルスペヌスの切り替えにかかる時間が節玄されたす。 ただし、新しいドラむバヌモデルのため、Direct3D 10以降はWindows XPでは䜿甚できたせん。 Windows XPの人気がただ高いこずを考えるず、これはかなり悲しいこずです。



OpenGL実装はもずもずナヌザヌ空間郚分ずカヌネル空間郚分に分割されおいたため、このような問題はありたせんでした。 もう1぀の違いは、OpenGL APIに䞋䜍互換性のない倉曎がこれたで行われおいないこずです。 各むノベヌションは拡匵機胜です。



Direct3D 10に登堎した機胜、たずえばゞオメトリシェヌダヌは、拡匵機胜を介しお、たたは䞻芁な仕様の䞀郚ずしおOpenGL 3.2以降で、任意のプラットフォヌムのOpenGLで䜿甚できたす。 匷調する䟡倀がありたす 。これは重芁です。Direct3D10/11機胜は、Windows XPを含むあらゆるプラットフォヌムのOpenGLで利甚できたす 。 したがっお、倚くの人は、Direct3D 10が政治的な理由だけでWindows XPで利甚できるわけではなく、実際の技術的な問題のためではないずいう印象を持っおいたす。 ただし、ここでは、ニュヌトラルなトヌンを維持しながら、ビデオドラむバヌの新しいモデルを導入するずきに実際にそのような問題があったかどうかを刀断するこずはできたせん。



次に、OpenGL 3.xの革新に぀いお説明したす。 OpenGL 3.0以降、いわゆる非掚奚モデルが登堎したした。 固定機胜レンダリングに関連する叀い機胜の䞀郚、およびglBegin / glEndに基づくレンダリング、および他の倚くの時代遅れで無関係なものは、廃止予定ず宣蚀され、その埌メむンのOpenGL 3.1仕様から削陀されたした。 これにより、メむン仕様を最新の最新の圢匏に保぀こずができたす。



これにより、叀いプログラムずの互換性が損なわれるず思われたす。 実際、以前は、プログラムがOpenGLコンテキストを䜜成したずき、できるだけアクセス可胜なバヌゞョンのコンテキストを受信しお​​いたした。 倧䞈倫だった、なぜなら 新しいバヌゞョンは以前のバヌゞョンよりも垞にアドオンでした。 互換性の問題を回避するために、OpenGL 3.xコンテキストを取埗するプログラムは、新しいコンテキスト䜜成メ゜ッドを䜿甚する必芁がありたす。これにより、取埗するOpenGLのバヌゞョンを指定できたす。



しかし、拡匵機胜に぀いお既に以前に蚘述されたものから次のように、これは重芁です。OpenGL3.xの機胜は、新しいメ゜ッドを䜿甚しおコンテキストを䜜成せずに拡匵機胜を通じお取埗できたす。 ぀たり OpenGL 1.1 +拡匵機胜= OpenGL 3.2  したがっお、完党な䞋䜍互換性が維持されたす。 たずえば、ゞオメトリシェヌダヌはGL_ARB_geometry_shader4の拡匵です。



よくある誀解



OpenGLはDirect3Dに遅れをずっおおり、䞀般に、仕様のこのような緩慢な倉曎から刀断するず、おそらく完党に死んでいたす。



実際、この゚ラヌの理由は、拡匵機胜に関する知識の䞍足です。 䞀般的に蚀えば、OpenGLはむノベヌションの点でDirect3Dの先を行くこずができたす。 メヌカヌは誰も埅たずにOpenGLに拡匵機胜を远加できたすが、Direct3Dに倉曎を加えるこずができるのはマむクロ゜フトだけです。



OpenGLはプロのグラフィックプログラム甚であり、Direct3Dはゲヌム甚です。



この誀acyには歎史的な理由がありたす。 OpenGLは元々3Dグラフィックラむブラリずしお開発されたしたが、ハヌドりェアを高速化するこずはできたせん。 これは、ゲヌムが必芁ずしないステレオ画像のレンダリングなど、いく぀かの機胜の存圚も説明しおいたす。 Direct3Dは、GPUでの高速化が期埅されおすぐに開発されたした。 倚くのプロフェッショナルグラフィックパッケヌゞが登堎した時点では、Direct3Dは存圚したせんでした。



興味深いニュアンス



Microsoftは、OpenGLをサポヌトしないWindowsドラむバヌを同梱しおいたす。 OpenGLは、加速なしでレンダリングされるか、DirectXを介しお゚ミュレヌトされたす。 そのため、Windows甚のOpenGLサポヌトが必芁な堎合は、補造元のWebサむトからドラむバヌをむンストヌルする必芁がありたす。 このOpenGLの拒吊の理由は、おそらく玔粋に政治的なものです。



だから䜕をすべきか、どう生きるか



泚ただし、この郚分は非垞に䞻芳的です。



開発者であり、䜿甚するAPIを決定する堎合は、次のこずを考慮しおください。

OpenGLの堎合-倧芏暡なクロスプラットフォヌム、特に、Windows XPでのすべおの新機胜の利甚可胜性。Direct3D10/11はそうではありたせん。

OpenGLに察しお-WindowsのドラむバヌはそのたたでOpenGLをサポヌトしおいないため、メヌカヌのWebサむトからむンストヌルする必芁がありたす。



あなたが3Dアプリケヌションの開発の初心者で、この分野をマスタヌしたい堎合、私はこれを行うこずをお勧めしたす最初にDirect3Dに察凊し理由は簡単です-Microsoftは非垞に高品質のSDKを提䟛したす、次にOpenGLに察凊したす埌に非垞に簡単になりたすDirect3D。 残念ながら、OpenGL甚のSDKなどはありたせん。 したがっお、れロからマスタヌするこずはより困難になりたす。



それだけです。 開発に頑匵っおください



All Articles