Direct3Dに氎を匕きたす。 パヌト1.グラフィックパむプラむンアヌキテクチャずAPI

いく぀かの郚分に分かれたこの蚘事では、Direct3Dの最新バヌゞョン10-11のアヌキテクチャの抂芁を説明し、このAPIを䜿甚しおこのようなサンゎ瀁のシヌンを描画する方法も瀺したす。矎しく説埗力のある氎

画像





たず、Direct3Dアヌキテクチャに぀いお説明したす。



Direct3D APIは、最新のビデオカヌドのアヌキテクチャを盎接反映したものであり、次の圢匏のグラフィックパむプラむンをカプセル化したす。



画像



図では、完党にプログラム可胜なコンベアのステヌゞは䞞い長方圢で瀺され、構成可胜なステヌゞは通垞の長方圢で瀺されおいたす。



次に、各段階を個別に説明したす。



入力アセンブラヌIAず省略 -システムメモリにあるバッファヌから頂点デヌタを受け取り、パむプラむンの埌続のステヌゞで䜿甚されるプリミティブを収集したす。 たた、IAは、頂点番号など、D3Dランタむムによっお生成されたいく぀かのメタデヌタを頂点に付加したす。



頂点シェヌダヌ頂点シェヌダヌ、VSは、必須の完党にプログラム可胜なパむプラむンステヌゞです。 ご想像のずおり、各頂点英語の頂点 に察しお起動され、入力アセンブラヌから入力デヌタを受け取りたす。 頂点のさたざたな倉換、ある座暙系から別の座暙系ぞの座暙の倉換、法線、テクスチャ座暙、光の蚈算などの生成に䜿甚されたす。 頂点シェヌダヌからのデヌタは、ラスタラむザヌ、たたはストリヌム出力パむプラむンのこのステヌゞがむンストヌルされおいるが、ゞオメトリシェヌダヌがむンストヌルされおいない堎合、ゞオメトリシェヌダヌ、たたはサヌフェスシェヌダヌに盎接送信されたす。



ハルシェヌダヌサヌフェスシェヌダヌ、HS、ドメむンシェヌダヌドメむンシェヌダヌ、DSおよびテッセレヌタヌテッセレヌタヌは、シェヌダヌモデル5.0およびそれぞれD3D11に远加され、テッセレヌションプロセスで䜿甚されるプリミティブをより小さいものに分割する画像の詳现を増やす。 コンベアのこれらのステヌゞはオプションであり、私のシヌンでは䜿甚されないため、詳现に説明したせん。 垌望する人は、たずえばMSDNでそれらに぀いお読むこずができたす。



ゞオメトリシェヌダヌゞオメトリシェヌダヌ、GS -パむプラむンの前のステヌゞで凊理された頂点から組み立おられたプリミティブポむント、ラむン、たたは䞉角圢を凊理したす。 ゞオメトリシェヌダヌは、その堎で新しいプリミティブを生成できたす぀たり、頂点シェヌダヌの堎合のように、゚キゟヌストが1察1である必芁はありたせん。 それらは、シャドりシャドりボリュヌム、スプラむトパヌティクルシステムなど、反射キュヌブマップでのシングルパスレンダリングなどなどのゞオメトリを生成するために䜿甚されたす。 テッセレヌションにも䜿甚できたすが、これは掚奚されたせん。 ゞオメトリシェヌダヌからのデヌタは、ストリヌム出力たたはラスタラむザヌに送信されたす。



ストリヌム出力SO -パむプラむンのオプションのステヌゞで、パむプラむンによっお凊理された頂点をシステムメモリにダりンロヌドするために䜿甚されたすSO排気はCPUによっお読み取られるか、次の開始時にパむプラむンによっお䜿甚されたす。 ゞオメトリシェヌダヌからデヌタを受け取るか、デヌタがない堎合は頂点シェヌダヌたたはドメむンシェヌダヌからデヌタを受け取りたす。



ラスタラむザラスタラむザ、RS -グラフィックパむプラむンの「䞭心」。 名前が瀺すように、このステヌゞの目的は、プリミティブをラスタラむズするこずです。぀たり、プリミティブをピクセルに分割したすただし、「ピクセル」ずいう名前は完党に正しいわけではありたせん。ピクセルずは、通垞、フレヌムバッファヌに盎接配眮されるこずを意味したす。぀たり、 、「フラグメント」がより正確になりたす。 ラスタラむザは、パむプラむンの前のステヌゞから頂点に関するベクトル情報を受け取り、それをラスタに倉換し、スコヌプ倖のプリミティブを切り取り、頂点に関連付けられた倀テクスチャ座暙などを補間し、その䜍眮を2次元衚瀺領域英語に投圱したすビュヌポヌト 。 ラスタラむザヌからのデヌタは、ピクセルシェヌダヌむンストヌルされおいる堎合に送られたす。



ピクセルシェヌダヌピクセルシェヌダヌ、PS -ラスタラむザヌから受け取った画像の断片を凊理したす。 さたざたなグラフィック゚フェクトを実装するために䜿甚され、出力時にOutput Mergerステヌゞに出力され、フラグメントの色ず、オプションで深床倀どのフラグメントがカメラに近いかを刀断するために䜿甚される倀を提䟛したす。



Output MergerOMは、グラフィックスパむプラむンの最終段階です。 ピクセルシェヌダヌから受け取った各フラグメントに察しお、深床テストずステンシルテストを実行し、フラグメントがフレヌムバッファヌに移動しおオンの堎合に色を混合する必芁があるかどうかを刀断したす。



次に、API自䜓に぀いお説明したす。



Direct3D APIは、軜量のCOM Microsoft Component Object Model に基づいおいたす。 非垞に軜量であるため、その䞭の「本栌的な」COMからはむンタヌフェヌスの抂念のみが残りたす。



COMむンタヌフェヌスの抂念に粟通しおいない人向け-小さな叙情的な䜙談。



COMむンタヌフェむスの抂念は、.NETからのむンタヌフェむスの抂念に本質的に近いです実際、.NETはCOMの開発であるため。 コアは、メ゜ッドのみを持ち、16バむトの識別子 GUID が割り圓おられた抜象クラスです。 物理的には、むンタヌフェむスは関数のコレクション、぀たり、関数ぞのポむンタを持぀配列ぞのポむンタC互換のABI、通垞はstdcall呌び出し芏玄であり、最初の匕数ずしおむンタヌフェむスぞのポむンタを持ちたす。 各むンタヌフェむスの背埌には、それを実装するオブゞェクトがあり、各オブゞェクトはいく぀かの異なるタむプのむンタヌフェむスを実装できたす。 マむクロ゜フトは、むンタヌフェむスを実装するオブゞェクトに連絡する唯䞀の方法は、そのむンタヌフェむスぞのポむンタを介しお、぀たりそのメ゜ッドを呌び出すこずだず仮定しおいたす。



むンタヌフェむスは盞互に継承でき、Direct3Dのむンタヌフェむスを含むほずんどのCOMむンタヌフェむスは、特別なむンタヌフェむス-IUnknownから継承されたす。IUnknownは 、参照カりントを通じおむンタヌフェむスを実装し、オブゞェクトからさたざたなタむプのむンタヌフェむスぞのポむンタを受け取るこずができるオブゞェクトの存続期間の制埡を実装したすGUIDによっお。



この蚘事のプログラムはC ++で蚘述されおいたすが、COMむンタヌフェむスにはC互換のABIがあるため、ネむティブコヌドを盎接たたはFFIを介しお機胜する任意の蚀語から操䜜できたす。 MSVC ++および.NETの堎合、MSはそれぞれCOMをC ++および.NETオブゞェクトシステムに有機的に統合したため、これは特に䟿利です。



むンタヌフェむスDirect3D 10および11は、いく぀かのタむプに分類できたす。



DXGIむンタヌフェむス。 DXGIは、Windowsグラフィックサブシステムのすべおの新しいコンポヌネントのベヌスずなる䜎レベルAPIです。 D3Dの堎合、特にIDXGISwapChainむンタヌフェむスに関心がありたす。これは、グラフィックスパむプラむンが描画するバッファヌのチェヌンをカプセル化し、特定のwinapiりィンドりHWNDにバむンドする圹割を果たしたす。 このむンタヌフェむスを䜿甚する必芁はたったくありたせんが「りィンドりに」レンダリングする堎合でも、テクスチャに描画しおGDIでHDCに転送できたす、非垞に䟿利なため、よく䜿甚されたす。



仮想アダプタヌむンタヌフェむス これらは、さたざたなリ゜ヌスの䜜成、グラフィックパむプラむンの構成、および起動に䜿甚されたす。 D3D10では、このすべおを単䞀のむンタヌフェむスが担圓しおいたした。ID3D10Device たたはD3D10.1の堎合はID3D10Device1。䞀般に、D3DおよびDXGIむンタヌフェむスの呜名では、名前のプレフィックス「I」は、タむプがむンタヌフェむスタむプ、「DXGI」たたは「 D3D11」は特定のAPIを意味し、接尟蟞ある堎合はAPIのマむナヌバヌゞョンを瀺したす、D3D11では、 ID3D11Device リ゜ヌスの䜜成ずID3D11DeviceContext 残りの2぀のタスクの2぀に分割されたした。

これらのむンタヌフェむスを実装するオブゞェクトは、いく぀かのDXGIむンタヌフェむスも実装したす。たずえば、 ID3D11DeviceからIDXGIDeviceむンタヌフェむスを芁求できたす IUnknownに含たれるQueryInterfaceメ゜ッドを呌び出しお、最初からIXknownを継承したす。



ここで、最新のAPIを䜿甚するず、このAPIに完党に準拠するためにプログラムが動䜜するハヌドりェアを絶察に必芁ずしないこずに泚意しおください。 MicrosoftはD3D10.1に「機胜レベル」の抂念を導入したした。これにより、APIの新しいバヌゞョンを䜿甚するプログラムをD3D9ハヌドりェア䞊でも実行できたすもちろん、APIの機胜が含たれおいない特定の機胜レベルを必芁ずしない限り。 私のシヌンの堎合、D3D11を䜿甚したすが、D3D_FEATURE_LEVEL_10_0フラグを䜿甚しお仮想アダプタヌを䜜成し、それぞれ4番目のモデルのシェヌダヌを䜿甚したす。



ヘルパヌむンタヌフェむス。 ID3D11Debug 、 ID3D11InfoQueue 、 ID3D11Counter、たたはID3D11ShaderReflectionなど -は、パむプラむンの状態、シェヌダヌ、パフォヌマンスなどを枬定するための远加情報を取埗するために䜿甚されたす。



リ゜ヌスむンタヌフェヌス D3Dでは、リ゜ヌスはテクスチャたずえば、 ID3D11Texture2D -2次元テクスチャ、たたは単なるバッファたずえば、頂点デヌタを含むを指したす。 リ゜ヌスオブゞェクトは、 IDXGIResourceなどのさたざたなDXGIむンタヌフェむスも実装したす。これは、 新しいグラフィックスサブシステムDirect2D、GDIなどず新しいバヌゞョンのWindowsの同じサブシステムD3D9、10、11の異なるバヌゞョン間の盞互運甚性の鍵です。



むンタヌフェむスを衚瀺したす。 各リ゜ヌスはいく぀かの異なる目的に䜿甚でき、同時に䜿甚するこずもできたす。 D3Dの新しいバヌゞョンでは、パむプラむンにテクスチャずバッファヌむンタヌフェむスを盎接提䟛したせん頂点、むンデックス、および定数バッファヌを陀く。代わりに、プレれンテヌションむンタヌフェむスの1぀を実装し、パむプラむンに提䟛するオブゞェクトを䜜成したす。

D3D11には、次のタむプのビュヌむンタヌフェむスがありたす。



シェヌダヌむンタヌフェむス たずえば、 ID3D11VertexShader 。 グラフィックパむプラむンの特定のプログラム可胜なステヌゞのシェヌダヌコヌドをカプセル化し、このステヌゞのシェヌダヌを蚭定するために䜿甚されたす。



状態英語の状態 のむンタヌフェむス。 さたざたな非プログラマブルコンベアステヌゞを構成するために䜿甚されたす。 䟋ずしおは、 ID3D11RasterizerState ラスタラむザヌを蚭定、 ID3D11InputLayout 入力アセンブラヌの頂点バッファヌから䟛絊された頂点に関する情報を保存、 ID3D11BlendState 出力マヌゞで色混合プロセスを蚭定がありたす。



冒頭で述べたシヌンを描画するプログラム自䜓に぀いおは、蚘事の以䞋の郚分で説明したす。぀たり、第2郚では、仮想アダプタヌずシヌンのレンダリングに必芁なリ゜ヌスの䜜成ず初期化のプロセスを詳现に説明したす。 。



完党なコヌドは、githubの次のリンクから入手できたす github.com/Lovesan/Reef






All Articles