Microsoft DirectX

DirectX Runtime

DirectXのランタイム (DLL) には大きく分けて2種あり、1つはd3d11.dllやd2d1.dllなどのような基本ランタイム、そしてもう1つはd3dx11_43.dll、D3DCompiler_43.dll、XAudio2_7.dllやxactengine3_7.dllといったSDK依存の追加ランタイムである。前者はWindowsオペレーティングシステム (OS) のセットアップ時（プリインストール）、もしくはMicrosoft Updateなどを通して最新のサービスパックや更新プログラムの適用時にシステムコンポーネントとして標準インストールされる一方で、後者はアプリケーションの開発に使用したDirectX SDK（Windows SDK）のバージョンに依存し、またMicrosoft Update経由でのインストールはできないため、DirectXアプリケーションの利用者がマイクロソフトの配布サイトからDirectXエンドユーザーランタイムのセットアッププログラムをダウンロードして明示的にインストールするか、もしくはDirectXアプリケーションの開発者がアプリケーションのセットアッププログラムに必須ランタイムのインストール機能を含める必要がある。なお、Windows SDK 8.0付属のD3DCompiler_46.dllや、Windows SDK 8.1/10付属のD3DCompiler_47.dllなどは、OSによっては標準でインストールされておらず、また単独のエンドユーザー向けインストーラーも提供されていないため、開発者が対象環境に応じて明示的にアプリケーションに同梱しておく必要がある。
Windows 8.x以降は前者の基本ランタイムに加えて後者の追加ランタイムのうち特定のバージョン（XInput1_4.dllやXAudio2_8.dllなど）が最初からシステムコンポーネントとしてプリインストールされており、Windows 8/RT向けストアアプリ、Windows 8.1/RT 8.1向けストアアプリおよびユニバーサルWindowsプラットフォーム (UWP) アプリの開発では基本ランタイムと、この特定のバージョンの追加ランタイムのみを使うことができる。
DirectXを使用したアプリケーションプログラムを実行する際、「xxx.dllが見つからなかったため、このアプリケーションを開始できませんでした。……」といったエラーに対処するには、DirectXランタイムのアップデートが必要になる。ただし、使用するOSによっては完全に実行不可能である場合もある。例えばWindows XPではDirectX 10以降を使用したアプリケーションは実行できない。また、Windows Vista/7/8.xではDirectX 12を利用することはできない。

歴史

1994年終盤、マイクロソフトはWindows 95をリリースしようとしていたが、当時のプログラマは、Windows 95よりもむしろMS-DOSの方がゲームプログラミングに適していると考える傾向にあった。「どのようなプログラムを作れるか」というのはOSの評価基準として大きなウェイトを占める。マイクロソフトの三人の社員、クレイグ・アイスラー、アレックス・ジョン、エリック・イングシュトロームは、この傾向を危惧していた。
MS-DOSの環境下では、プログラムはビデオカード、キーボード、マウス、サウンドカードなど様々なシステムパーツに直接アクセスできていたが、Windows 95ではメモリ保護のためにこれらの直接のアクセスが制限されてしまっていた。あと数ヶ月でWindows 95がリリースされるという中で、マイクロソフトはWindows 95におけるプログラムの自由度を上げる仕組みを作り上げなければならなかった。アイスラーとジョンとイングシュトロームの三人はこれらの問題解決に乗り出した。こうして作られたのがDirectXである。
DirectXの最初のバージョンはWindows Games SDKとして1995年9月にリリースされた。これはWindows 3.1にあったWinG APIとDCI (Display Control Interface) とを32ビット用に移植したものである。このとき、マイクロソフトはATIの開発チームからゲームグラフィックの基本部分についての技術提供を受けた。これ以降、アイスラー（開発リーダー）、ジョン、イングシュトローム（プログラム責任者）の三人のチームを中心としてDirectXの開発が進められ、最終的にはこれ以降のすべてのWindowsにおいてDirectXがマルチメディア機能を担うことになった。DirectX 1から5までの開発でのドタバタは、アイスラーのブログに詳しく書かれている。
DirectXの登場より前に、マイクロソフトはOpenGLをWindows NTに搭載してしまっていた。OpenGLは、動作に（当時においては）ハイスペックな環境が必要だった上に、用途もCADやエンジニアリングに限られていた。そんな中Direct3Dは、ゲーム用としてはオーバースペック気味だったOpenGLの軽量版として設計され、ここからDirect3DとOpenGLとの、ユーザー同士の対立が始まった。Windows専用だったDirect3Dはマイクロソフトの3E戦略（embrace, extend, extinguish―吸収、拡大、根絶）だとOpenGLユーザーから非難されることとなった。しかしDirectXには、サウンドやジョイスティックなど、OpenGLがカバーできない機能が含まれていたため、DirectX上の他のAPIとOpenGLとを組み合わせて使われることが多かった。後にはOpenGLとSDLの組み合わせも多い。OpenGLはDirect3Dが先行して実装したジオメトリシェーダーやコンピュートシェーダーといった機能を数年遅れで取り入れるなど、Direct3Dの影響を受けている部分がある。
ゲーム機では、セガのドリームキャストにWindows CEと共にDirectXが世界で初めて用いられた。その後、マイクロソフトのXboxとXbox 360にも搭載された。XboxのコンソールAPIはマイクロソフトとNVIDIA（Xboxのカスタムグラフィックチップの開発元）で共同開発された。Xbox APIはDirectX 8.1に近いが、コンソール上からアップデートができないところが他と異なる。XboxのコードネームはDirectXboxだったが、商品名は短縮してXboxとなった。

DirectX 9のリリース

2002年にマイクロソフトは、以前よりもはるかに長いシェーダープログラムを扱えるシェーダーモデル2.0（頂点シェーダー2.0、ピクセルシェーダー2.0）と高級シェーディング言語HLSLをサポートしたDirectX 9をリリースした。2004年8月にはさらに機能を強化したシェーダーモデル3.0を導入したDirectX 9.0cをリリースし、それ以降もDirectX一式の更新を続けている。
DirectX SDK February 2005を最後に、DirectShowはDirectX SDKから取り除かれ、代わりにMicrosoft Platform SDKへ移動された（DirectX SDK April 2005以降にはDirectShow関連ファイルが含まれない）。しかしPlatform SDKに付属するDirectShowのサンプルをビルドするためにはDirectX SDKが必要である。

DirectX 10のリリース

2006年にリリースされたDirectX 10は、WDDM/DWM/DXGI 1.0とともにWindows Vista専用として提供され、Windows XP以前のOSにはバックポートされなかった。
DirectX SDK August 2007を最後に、DirectMusicはDirectX SDKから取り除かれた。
2008年にはWindows Vista SP1と同時に、DirectX 10のマイナーバージョンアップとしてDirectX 10.1がリリースされた。

DirectX 11のリリース

2009年、Windows 7と同時にDirectX 11がリリースされた。DirectX 11のうち、GPGPUのために導入されたAPIであるDirectComputeについては、当初はDirectX 11（シェーダーモデル5.0）世代のハードウェアのみに対して提供される予定だったが、2008年11月に開催されたハードウェア技術者向け国際会議「WinHEC 2008」にて「DirectX 10世代のハードウェアでもサポートする」との発表があった。最終的に、DirectX 10.x（シェーダーモデル4.x）世代のGPUでも、DirectX 11 APIを通してDirectComputeが利用できるようになった。なおWindows Vista SP2およびWindows Server 2008 SP2向けのプラットフォーム更新プログラムKB971644には、DirectX 11のバックポートが含まれている。
DirectX 11.0のリリース後、Windows 8/8.1向けにそのマイナーアップデート版としてDirectX 11.1/11.2がリリースされた。Windows SDK 7.1およびDirectX SDK June 2010までは、Windows SDKとDirectX SDKとが別々に提供されてきたが、Windows SDK 8.0ではDirectX SDKと統合された。つまり、DirectX 11.1/11.2の開発環境は、Windows SDK 8.0/8.1に統合されることになった。Visual Studio 2012/2013には、それぞれWindows SDK 8.0/8.1がバンドルされている。なお、Windows SDK 8.0以降では後述するようにいくつかの補助ライブラリが廃止されているものの、DirectX 9/10/11のコアライブラリは含まれているため、Windows XP/Vista/7向けのDirectXアプリケーションを開発することも可能である。しかし、Windows SDK 8.0/8.1に同梱されているXAudio2 (v2.8) はWindows 8以降でしか利用できないため、旧OS上でも利用可能なXAudio2 (v2.7以前) を利用するアプリケーションを開発する場合は旧DirectX SDKが別途必要となる。
2013年3月に、Windows 7 SP1およびWindows Server 2008 R2 SP1向けのプラットフォーム更新プログラムKB2670838がリリースされた。この更新プログラムには、DirectX 11.1のバックポートも含まれている。なお、KB2670838の副作用として旧DirectX SDKに付属するグラフィックス分析ツールPIX for Windowsが動作しなくなる。DirectX 11.1がインストールされた環境では、代わりにVisual Studio 2012以降に統合されているGraphics Diagnosticsを使う必要があるが、Windows 7上では一部の機能が利用できない。

DirectX 12のリリース

DirectX 11は2009年にリリースされてからDirectX 11.1/11.2のようなマイナーチェンジに終始し、メジャーアップデートとなるDirectX 12のロードマップは長らく示されていなかった。その間、OpenGLは組み込み向けのOpenGL ESとともに順調にバージョンアップを重ね、DirectX (Direct3D) に追いつくだけでなく一部ではDirectXを超える機能をサポートし始めていた。また、AMDは従来のDirectXやOpenGLよりもハードウェアに近いローレベルな制御を可能とする独自APIとして2013年にMantleを発表した。
DirectXが最先端のリアルタイムグラフィックスシーンを牽引していた時代から変化を迎えつつあったが、GDC 2014ではついにDirectX 12の発表が行なわれ、特にDirect3D 12に関してはDirect3D 11までの高レベルAPIを刷新し、オーバーヘッドを低減したゲームコンソールに近いローレベルな制御を可能とするグラフィックスAPIとなることが明らかにされた。
DirectX 12はWindows 10専用としてそれに標準搭載される形で2015年7月に正式リリースされ、コマンドキューベースの効率的なマルチスレッドレンダリング機能や、マルチGPUによる分散レンダリングの標準化など、近代的なハードウェア設計に沿う形で革新的な多数の機能を備えるに至っている。
一方で、従来の手厚い高レベルレイヤーであるDirectX 11にも、DirectX 12で導入された新機能の一部が盛り込まれる形で、DirectX 11.3/11.4のようにDirectX 12と平行してアップデートが継続されている。

補助ライブラリ

DirectXのうち、Direct3Dにはマイクロソフト純正の補助ライブラリとして、D3DX (Direct3D Extension) と呼ばれるDirect3D拡張ライブラリが存在する 。Direct3D自体はバッファ／テクスチャメモリの管理やプリミティブの描画といった比較的ローレベルかつ最低限の機能しか持たないが、D3DXには3Dグラフィックスプログラミングで必要となる算術演算、スプライト、メッシュ／テクスチャの読み書きといった比較的高レベルの機能が実装されている。主にDirect3D 9向けのD3DX9、Direct3D 10向けのD3DX10、そしてDirect3D 11向けのD3DX11およびD3DCSX11が存在する。多くのD3DX機能はd3dx9_XX.dll、d3dx10_XX.dll、d3dx11_XX.dllなどのコンポーネントに、C/C++用の関数・クラスや、COMインターフェイスとして実装されている。D3DXランタイムはDirect3D本体（コアコンポーネント）とは異なり、前述のようにWindows OSのセットアップやWindows Updateによるシステム更新ではインストールされず、またアプリケーションの開発に使用したDirectX SDKのバージョンによって必要となるDLLが異なるため、エンドユーザー環境でD3DXを使用するためにはDirectXエンドユーザーランタイムのインストールが必要となる。
Windows SDKとDirectX SDKが統合されたWindows SDK 8.0では、D3DXは（D3DCSX11を除いて）廃止され、SDKに新しいバージョンが同梱されなくなっている。廃止されたD3DXの代わりに、Windows SDK 8.0以降では算術ライブラリとしてDirectXMath が標準提供されている。また、DirectXTK、DirectXTex、DirectXMeshといったオープンソースのC++専用補助ライブラリが開発され、MITライセンスでGitHubにて公開されている（開発当初はMs-PLライセンスでCodePlexにて公開されていた）。なおWindows 8およびVisual Studio 2012以降でも旧DirectX SDKをインストールするか、DirectXエンドユーザーランタイムをインストールすることでD3DXを利用することは可能だが、Windowsストアアプリ（WinRTアプリ、Modern UIアプリ）の開発ではD3DXを使用することはできず、D3DXを使用できるのはデスクトップアプリケーションのみとなっている。
そのほか、旧DirectX SDKにはDXUTと呼ばれるフレームワークがソースコードごと同梱されており、SDKに付属するマイクロソフト公式のサンプル実装に使われていたほか、NVIDIA・インテル・AMDといったハードウェアベンダーが独自に作成・公開するDirectXサンプルにもフレームワークとしてしばしば使われていたが、DXUTもWindows SDK 8.0以降には同梱されない。DXUT自体はDirectX 11.x用のもの (DXUT11) がGitHubにて公開・メンテナンスされている。Effects 11 (FX11) と呼ばれるシェーダーエフェクトフレームワークも、DXUT同様にGitHubに移管されている。また、Visual Studio 2012以降には、Direct3D/Direct2DベースのWinRTアプリケーションプロジェクトテンプレートが含まれている。
旧DirectX SDKの最終バージョンJune 2010がサポートするVisual Studioはバージョン2008/2010のみだが、旧SDKに付属していたサンプルのうち、多くはVisual Studio 2012以降向けに更新されたものがMSDN Code Galleryに移管されている。この更新によってD3DXなどの廃止されたライブラリへの依存も排除されている。
なお、DirectX Graphics SamplesがMITライセンスでGitHubにて公開されており、DirectX 12のサンプルおよびユーティリティライブラリが含まれている。例として、Direct3D 12用のC++ヘッダーベース補助ライブラリであるD3D12 Helper Library (d3dx12.h)、DirectX 12 EngineのStarter KitであるMiniEngine、Direct3D 12用メモリ管理ライブラリであるD3D12 Residency Starter Libraryなどが含まれている。

.NET Framework用ラッパー

かつてDirectX 7.0およびDirectX 8.0でC++向け以外にVisual Basic用のインターフェイスが提供されたものの、基本的にDirectXはC++言語専用のAPIである。ここでは.NET Framework言語環境向けにラップされたマネージコードライブラリを紹介する。

Managed DirectX (MDX)

Managed DirectXは.NET Frameworkで動作するアプリケーションからDirectXを呼び出すためのAPIである。Managed DirectXを使うと、.NET Framework上で動作するどんな言語からでもDirectXを呼び出すことができる。また、テクスチャオブジェクトをSystem.Drawing.Bitmapオブジェクトから生成できるなど、.NET Frameworkとの相互運用も強化されている。なお、Managed DirectX 1.1のグラフィックスコンポーネントはDirect3D 9およびD3DX 9を内部で使用している。Managed DirectX 1.1の後継であるManaged DirectX 2.0の開発は中止され、Microsoft XNA (XNA) に置き換えられることになったが、そのXNAも2014年4月に開発・サポートを終了した。

Microsoft XNA

XNAおよびXNA Game StudioはWindows、Xbox 360、Windows Phone、およびZune用のマルチプラットフォーム対応ゲーム開発環境・実行環境である。対応するアプリケーション開発言語はC# (Visual C#) のみであり、VB.NETやC++/CLIなどの他の.NET言語からは利用できない。グラフィックスコンポーネントの内部ではDirect3D 9が使用されている。

SlimDX

Managed DirectX 2.0はキャンセルされたが、後継のXNAは基本的にC#からしか利用できない上、Xbox 360とWindows双方に互換性のあるコードを記述することを主目的として開発されており、Managed DirectXの方向性とはやや異なるAPI（ゲームアプリケーション向けのフレームワーク）となっている。このため、Windowsプラットフォームにおける.NET用にDirectXのAPIをカプセル化した、SlimDXと呼ばれるライブラリが有志によって開発・提供されていたが、2012年1月を最後に更新されておらず、公式サイトも2019年現在は消失している。SlimDXはMDXのように、Direct3Dコアライブラリに加えてDirect3D拡張ライブラリであるD3DXもカバーする。

SharpDX

SharpDXはDirectX Graphics、DirectX Audio、DirectX Inputなどのマネージラッパーを提供するオープンソースのプロジェクトである。ライセンス形態はMITライセンスとなる。SharpDXは従来のデスクトップアプリのほか、Windowsストアアプリからも利用できる。バージョン2.6.3時点でDirectX 9、DirectX 10、DirectX 11をサポートする。Windows 10と同時に正式リリースされたDirectX 12 (Direct3D 12) も、バージョン3.0にて対応したが、DirectX 10 (Direct3D 10) など一部のレガシーAPIのサポートが終了している。2019年5月をもって、開発を終了することがアナウンスされた。

用途

主な違いは、DirectXは基本的に3DグラフィックAPIのみに限定されるものではなく、サウンド処理やヒューマンデバイス入出力処理、ネットワーク処理までを内包するトータルなマルチメディアアプリケーション（代表的なものはゲームなど）の作成用API/SDKを指向するものである一方、OpenGLは純然たる3DグラフィックAPIとして設計されている点にある。またDirectXはWindowsや、Windows系OSを採用したDreamcastやXbox、Xbox 360等のゲーム機の動作する限られたプラットフォームでしかサポートされないのに対し、OpenGLはクロスプラットフォームであるという点である。
DirectXはその出自から、主にWindows用ゲームの分野で使用されてきたが、Direct3Dに関しては同環境における標準的な3DグラフィックAPIとしても用いられるようになり、ゲームに限らない一般的な3DアプリケーションやOSのグラフィカルシェル環境にまで用いられるようになった。また、Direct2D/DirectWriteはIEやFirefoxといったWebブラウザーにおけるレンダリングエンジンのハードウェアアクセラレーターとして採用されている。
一方のOpenGLは、歴史的および機能的な理由から、3DCGの製作工程やCAD、データ可視化などの用途に、グラフィックワークステーションやEWS等のプロフェッショナルな分野で使用されてきた。またパーソナルユーザー向けの3Dデスクトップ環境において標準的な描画APIとしても用いられており、これらの環境では3DビデオゲームのグラフィックAPIとしても標準的な立場にある。このように、両者をその用途によって明確に区別することは困難となりつつある。
また、Direct3Dが標準的な3DグラフィックAPIとして定着したPC/Windows系の環境においてもOpenGLは今なお共存しており、実際にDirectXの登場以前から登場初期頃には、PC (Windows) 用ゲームの3DグラフィックAPIとしてOpenGLや、OpenGLを簡略化し3dfx社製グラフィックカードVoodooの専用APIとしたGlideがデファクトスタンダードとして用いられて来た歴史もあり、両者を比較する文脈においてよく言われるような単純な競合関係として説明することも、実態として困難と言える。Windows環境においては、3DCG製作ソフトにおける作業中のリアルタイムプレビュー表示に、Direct3DとOpenGLのうちどちらを使用するかをユーザーが選択できるものも存在する。

グラフィックスドライバー

WindowsがOS標準機能でサポートするOpenGLバージョンは1.1までだが、Windows Vista以降ではデフォルトでOpenGLはDirect3DのラッパーAPIとして実装されている。ハードウェアベンダーが提供しているOpenGL対応ドライバー（ICD, Installable Client Driver）をインストールするまで、OpenGL APIによってハードウェアアクセラレーターを直接駆動することはできない  。デバイスドライバにより、任意のレイヤーからラッパーAPIからネイティブAPIに置き換える、UNIXのDevice Independent InterfaceとDevice Dependent InterfaceメカニズムをMicrosoft独自の仕様で取り込んだ物で、OpenGLアプリケーションを実行していても実はDirect3Dを駆動している場合がある（特に低価格グラフィックスボードはMicrosoftの実装によりOpenGLの実体をDirect3Dまかせにしている）。この機構はOpenGLのほかにGraphics Device Interface (GDI) にも適用されており、MicrosoftがDirectXの実装を推進する基盤となっている。
また、WindowsではICDをインストールするまで、（たとえハードウェアがOpenGL 1.2以降をサポートしていても）OpenGL 1.2以降の機能を使用することはできない。

ANGLE

GoogleのANGLEプロジェクトのように、OpenGLそのものではなく、内部でDirect3Dを使用したラッパーを経由して、Windows上でWebGLやOpenGL ESを間接的に実現するライブラリも存在する。ANGLEはハードウェアベンダーのOpenGLドライバー（ICD）を経由せず、Direct3Dを利用してOpenGL APIを実現している 。

GPGPU

DirectXはバージョン11において、GPGPU用APIであるDirectComputeをDirect3Dの一部（コンピュートシェーダー）として包括的に実装している。OpenGLもまたバージョン4.3において、Direct3Dと同様のコンピュートシェーダーを導入している。なお、Direct3D/OpenGLともに、GPGPUを含むクロスプラットフォームなヘテロ環境用アクセラレーターAPIであるOpenCLとの連携（相互運用）を行なう拡張機能が用意されている。