Direct3Dとは
Direct3Dは、
マイクロソフトが提供するDirectXの一部である、3Dグラフィックスを描画するためのAPIです。主にWindowsプラットフォーム(Windows 95以降)で動作し、ゲーム開発などのパフォーマンスが重視されるアプリケーションで広く利用されています。また、家庭用ゲーム機である
XboxシリーズでもグラフィックスAPIの基盤として採用されています。Direct3DはD3Dという略称でも知られています。
概要
Direct3Dは、3Dグラフィックスの描画を高速化するために、グラフィックスボードなどの
ハードウェアアクセラレーションを利用することができます。これにより、複雑な3Dシーンを効率的にレンダリングすることが可能です。Direct3Dは、
Z[[バッファ]]、ステンシル
バッファ、カリング、アンチエイリアス、アルファブレンド、ミップマップ、
テクスチャマッピング、プログラマブルシェーダー、テッセレーションといった高度なグラフィックス機能をサポートしています。また、DirectXの他のテクノロジーと統合することで、ビデオマッピングや2Dオーバーレイなど、様々な視覚効果を組み込んだインタラクティブなメディアコンテンツを作成できます。
Direct3Dは、3Dレンダリングのための様々なコマンドを提供するAPIですが、バージョン8以降では2Dグラフィックス機能も包含し、従来のDirectDrawフレームワークを置き換える役割も担っています。
マイクロソフトは常に最新のテクノロジーをサポートするためにDirect3Dを更新し続けており、Direct3Dはハードウェアがサポートしていない機能に対してソフトウェアエミュレーションを提供するという重要な役割も持っています。ただし、ピクセルシェーダーのような負荷の高い処理は、ソフトウェアエミュレーションでは実用的ではありません。代わりに、リファレンスラスタライザ(REFデバイス)が提供されますが、これは
CPUで完全にエミュレートされるため非常に低速です。一方、Direct3D 10.1以降には、WARPという高速ソフトウェアデバイスが導入され、カジュアルな用途であれば十分に実用的なDirect3Dアプリケーションを作成できます。
Direct3Dの主な競合APIとしては、Direct3D 11までは
OpenGLが挙げられますが、Direct3D 12では、MetalやVulkanといったローレベルAPIが競合となります。これらのAPIとの比較では、それぞれに異なる設計思想と特徴があります。
アーキテクチャ
Direct3Dは、DirectX APIのサブシステムコンポーネントとして、グラフィックスアプリケーションとグラフィックスハードウェア間の通信を抽象化します。Direct3Dは、GDI(Graphics Device Interface)と比較してより薄い抽象化レイヤーを提供し、ディスプレイドライバーと直接通信することで高いレンダリングパフォーマンスを実現します。Windows Vista以降のバージョンでは、Direct3DがOSのグラフィックス基盤の中核となり、GDIはDirect3D上で動作するようになっています。
Direct3Dは、イミディエイトモード(IM)のグラフィックスAPIであり、各ビデオカードの3D機能への低レベルなインターフェースを提供します。Direct3D 7まではリテインドモード(RM)という高レベルなコンポーネントも存在しましたが、Direct3D 8以降では廃止されています。イミディエイトモードでは、デバイス、リソース、スワップチェーンという3つの主要な概念が提供されます。
デバイス:描画に必要な処理を行うソフトウェアまたはハードウェアを指します。アプリケーションはデバイスタイプを指定することで、アクセスすることができます。
HAL (hardware abstraction layer) デバイス:ハードウェアアクセラレータを使用する。
リファレンスデバイス:ソフトウェアレンダラーを使用。
ヌルリファレンスデバイス:何も描画しない。
プラグ可能ソフトウェアデバイス:カスタムソフトウェアレンダラーを使用。
スワップチェーン:1つ以上のバック
バッファサーフェスで構成され、描画はバック
バッファで行われ、最後にフロント
バッファに転送されることで画面に表示されます。
リソース:レンダリングに使用されるデータで、以下の属性を持ちます。
Type:リソースの種類(サーフェス、テクスチャ、
バッファなど)。
Pool:リソースの管理方法(デバイスメモリ、システムメモリなど)。
Format:メモリレイアウト(ピクセルデータの配置など)。
Usage:リソースの使用方法(動的、静的など)。
パイプライン
Direct3D 10以降では、パイプラインは以下のステージで構成されます。
1. インプットアセンブラー:パイプラインにデータを供給します。
2. バーテックスシェーダー:頂点処理(座標変換、ライティングなど)を行います。
3. ジオメトリシェーダー:プリミティブ(三角形など)を処理します。
4. ストリームアウトプット:結果をメモリに保存します。
5. ラスタライザー:プリミティブをピクセルに変換します。
6. ピクセルシェーダー:ピクセル処理(色決定など)を行います。
7. アウトプットマージャー:最終結果を生成します。
Direct3D 11以降では、テッセレーションステージ(ハルシェーダー、テッセレータ、ドメインシェーダー)が追加され、コンピュートシェーダーによるGPGPUもサポートされます。
コード記述例
Direct3DはCOMインターフェースを通じて利用され、オブジェクト指向的なコードを書く必要があります。Direct3D 7では、定義済みの頂点フォーマットが用意されていましたが、Direct3D 9以降では、ユーザーが自分で定義する必要があります。Direct3D 9からは、HLSLなどの言語を使用してプログラマブルシェーダーを記述し、デバイスに設定してから描画メソッドを呼び出す必要があります。
Direct3D 12では、シェーダープログラムを個別に設定する代わりに、パイプラインステートオブジェクト(PSO)としてまとめて設定する方式が採用されています。
ディスプレイモード
Direct3Dは、以下の2つのディスプレイモードをサポートします。
エクスクルーシブモード:全画面表示で、Direct3Dがディスプレイを直接制御します。
ウィンドウモード:ウィンドウ内に表示され、Direct3DがGDIと通信して画面を完成させます。
変遷
Direct3Dは、DirectXのバージョンアップとともに進化を続けてきました。以下に主な変遷をまとめます。
Direct3D (DirectX 3 - DirectX 5): ハードウェア抽象化レイヤー (HAL) とハードウェアエミュレーションレイヤー (HEL) を持ち、ソフトウェアエミュレーションをサポートしました。
Direct3D 6.0: 環境バンプマップなどをサポートしました。
Direct3D 7.0: ハードウェアT&L、マルチテクスチャなどをサポートしました。
Direct3D 8.0: プログラマブルシェーダー(アセンブラ)を初めてサポートしました。
Direct3D 9.0:
浮動小数点数テクスチャ、HLSLをサポートしました。
Direct3D 10.0: ジオメトリシェーダーをサポートしましたが、固定機能シェーダーを廃止しました。
Direct3D 11.0: ハルシェーダー、テッセレータ、ドメインシェーダー、コンピュートシェーダーをサポートしました。
Direct3D 12: ローレベルAPIとして大幅に再設計され、ハードウェアに近い制御を可能にしました。
オープンソース実装
Direct3Dは、WineやMesaなどのオープンソースプロジェクトによって、Unix系OSでも利用できるようになっています。WineはOpenGLをバックエンドに用いてDirect3D APIを実装し、Mesaはネイティブ実装を提供しています。また、VulkanをバックエンドにDirect3Dを実装するプロジェクトも存在します。
関連技術
High Level Shading Language (HLSL)
Microsoft DirectX
DirectDraw
DirectCompute
Direct2D
DirectWrite
OpenGL
WPF
Windows Display Driver Model
Metal (API)
Vulkan (API)