Microsoft DirectX
Microsoft DirectX
Microsoft DirectX(ダイレクトエックス)は、マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合である。オーバーヘッドを少なくしたデバイスの仮想化・抽象化を提供する。Windows・Xbox・Xbox 360・Xbox Oneなど、マイクロソフト製のプラットフォームおよびデバイスにおいて広く利用されている。APIの一部はハードウェアアクセラレーションに対応しており、DirectX互換のハードウェアとデバイスドライバーが搭載されたコンピュータ上では、CPUの負担を低減しつつ高速処理することができる。グラフィックスに関しては、DirectX (Direct3D) 互換のGPU(ビデオカードやオンボードグラフィックスなど)を利用することにより、高品質の2次元・3次元コンピュータグラフィックスを高速にレンダリングできる。
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/Windows Updateなどを通して最新のサービスパックや更新プログラムの適用時にシステムコンポーネントとして標準インストールされる一方で、後者はアプリケーションの開発に使用したDirectX SDK(Windows SDK)のバージョンに依存し、またMicrosoft Update/Windows Update経由でのインストールはできないため、DirectXアプリケーションの利用者がマイクロソフトの配布サイトからDirectXエンドユーザーランタイムのセットアッププログラムをダウンロードして明示的にインストールするか、もしくはDirectXアプリケーションの開発者がアプリケーションのセットアッププログラムに必須ランタイムのインストール機能を含める必要がある。なお、Windows SDK 8.0付属のD3DCompiler_46.dllや、Windows SDK 8.1/10付属のD3DCompiler_47.dllなどは、OSによっては標準でインストールされておらず、また単独のエンドユーザー向けインストーラーも提供されていないため、開発者が対象環境に応じて明示的にアプリケーションに同梱しておく必要がある。.NET Framework 4.7はD3DCompiler_47.dllに依存しているが、インストーラーに含まれていないため、Windows 7などの旧環境では別途D3DCompiler更新プログラムを事前に適用しておく必要がある。
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を利用することはできない。
DirectXの機能のうち、大部分はCOMインターフェイスの形で提供されている。DirectXのランタイムライブラリとSDKは、いずれもマイクロソフトのウェブサイトから無償でダウンロードできるが、プロプライエタリでソースコードは非公開である。また、単独のDirectX SDKは「June 2010」が最終バージョンであり、Windows 8向けの開発キットであるWindows SDK 8.0がリリースされた際にWindows SDKへと統合された。PIX for WindowsなどのツールやD3DXライブラリはSDK統合の際に廃止され、代替としてGraphics DiagnosticsがMicrosoft Visual Studioに用意されたり、DirectX Tool Kitなどのオープンソースライブラリが開発・公開されたりしている(#補助ライブラリ)。
DirectX Graphics: DirectX 8からの名称。
Direct3D (D3D) : 3次元グラフィックス。DirectXの進化の歴史においてもっとも重要なコンポーネントとなっており、DirectXといえば間接的にDirect3Dを指していることがある。
DirectCompute: Windows 7以降で利用可能な、GPGPU用API。実際にはDirect3D 11/12の一部である。DirectX 11をサポートするためのプラットフォーム更新プログラムとしてWindows Vistaにもバックポートされた。
DirectML (Direct Machine Learning) : Direct3D 12上に構築された、機械学習向けのローレベルなアクセラレーションライブラリ。Windows 10 1903以降で利用可能。
DirectX Graphics Infrastructure (DXGI) : Direct3D 10以降のグラフィックス基盤API。デバイスとの通信など、ローレベルタスクを担当する。
Direct2D (D2D) : Windows 7以降で利用可能な、新しい2次元グラフィックスAPI。バージョン1.0はWindows Vistaにもバックポートされた。
DirectWrite: Windows 7以降で利用可能な、新しい高品位テキスト描画API。バージョン1.0はWindows Vistaにもバックポートされた。
DirectDraw: 2次元グラフィックス(DirectX 7まで存在したが、DirectX 8以降はDirect3Dに吸収された)。
DirectX Audio: DirectX 8からの名称。
XACT: 更新終了。
DirectSound: サウンド再生及び録音。更新終了。
DirectSound3D (DS3D) : 3次元サウンド再生。
DirectMusic: DirectMusic Producerで作成された音楽トラックの再生。更新終了。
XInput: Xbox 360およびXbox One専用ゲームコントローラーに対応するAPI。Windows上でもこれらのデバイスをコンソール同等に利用することが可能になる。
DirectInput: キーボード、マウス、ゲームパッド、ジョイスティックからの入力処理、およびフォースフィードバックを扱う。DirectX 8以降更新終了。FPSゲーム開発のような用途であっても、キーボードやマウスはWM_INPUT (Raw Input) やWM_MOUSEMOVEなどを代わりに利用することが推奨されている。
DirectX Video Acceleration (DXVA) : 動画処理API。バージョン1.0はDirectShowの一部だったが、Windows Vistaから利用可能なバージョン2.0はDirectShowやからは独立している。
DirectShow: 各種音声・動画の再生・作成。後継としてが存在する。
DirectAnimation: 2D Webアニメーション用。
DirectX Media Objects: エンコーダー、デコーダー、エフェクトといったストリーミングオブジェクトのサポート。
DirectPlay: ネットワーク通信。DirectX 8以降更新終了。
DirectSetup: DirectXランタイムのセットアップ用であり、正確にはAPIではない。
DirectStorage: 最新のNVMeストレージデバイスに最適化された、低オーバーヘッドのI/Oを提供するAPI。DirectStorage 1.1では、Direct3D 12上に構築された、圧縮データをGPUで展開する機能もサポートする。Xbox Series X/SおよびWindows 10/Windows 11で利用可能。
DirectX APIは基本的にSide-by-Sideであり、複数のバージョンが競合することなく共存できるため、例えばDirectX 11がインストールされている環境でもDirectX 10およびそれ以前のバージョンを利用することは可能である。また、更新が終了したAPIのうち、OSに標準インストールされているコンポーネントに関しては、Windows 10などの新しいOSでも引き続きデスクトップアプリケーションにて標準的に利用すること自体は可能だが、Direct3D 8などのようにネイティブ64ビット版が用意されていないものも存在する。
DirectX 12およびDirectX 11.3はWindows 10 (Windows 10 for Desktop, Windows 10 for Xbox One, Windows 10 for Phone) 専用のバージョンである。PC用Windows 10のほか、Xbox One用Windows 10にも対応する。DirectX 12はWindows Phone (Windows 10 Mobile/Windows 10 IoT) にも対応することが報じられているが、DirectX 12/WDDM 2.0に対応するデバイスドライバーおよび機能レベル11_0以上に対応するハードウェアが必須となる。
DirectX 11.2はWindows 8.1以降/Xbox One専用のバージョンである。
Windows 7(一部DirectX 11.1に対応)/Windows VistaにおいてはDirectX 11.0、Windows XP・2000/Me/98/98SEはDirectX 9(9.0c)、Windows 95はDirectX 8(8.0a)が最新バージョンとなる。ただしPC-9800シリーズの場合はDirectX 7(7.0a)が最新バージョンであり、それ以上のバージョンは制限を解除しないとインストールできないようになっている。またWindows NT 4.0ではSP3以降に付随するDirectX 3相当機能が最新バージョンとなる。
一部のバージョンに関しては、Windows UpdateやWindowsストアを通じて、OSが対応する最新のDirectXをサービスパックなどの機能更新プログラムとともに入手することが可能である。例えばWindows XPの場合、Windows Update経由でSP2と同時にDirectX 9.0cを入手できる。Windows Vistaの場合、SP1と同時にDirectX 10.1を、またSP2+Platform Updateと同時にDirectX 11を入手できる。なお、DirectX 10以降は、Windows Display Driver Modelの導入を始めとして、Windowsのグラフィックスアーキテクチャに大規模な修正が加えられたことから、Windows XPなどの旧Windows製品では利用できない。新しいOSでは、対応する最新バージョンよりも古いバージョンのDirectXに関しても基本的にすべて利用可能である。
DirectX 4はリリースされなかった。Raymond Chenの著書The Old New Thing(邦訳:Windowsプログラミングの極意 歴史から学ぶ実践的Windowsプログラミング!)によると、DirectX 3がリリースされた後に、マイクロソフトは後継のバージョン4と5の開発を同時に始めた。バージョン5がより実りの多いものになる予定だったのに対し、バージョン4は小幅な機能拡張を伴う短期リリース版となる予定だった。しかしDirectX 4に実装される予定の機能はゲーム開発者の興味をそそらず、そのためDirectX 4はキャンセルされ、すべての機能をDirectX 5に組み込むことになったが、すでに執筆されていた多数のドキュメント内ではこれら2つのバージョンを明確に区別していた。マイクロソフトは混乱を避けるため、バージョン5をバージョン4にリネームするようなことはせず、バージョン4をスキップすることにした。
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となった。
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が必要である。
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がリリースされた。
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 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と平行してアップデートが継続されている。
2018年にリリースされたWindows 10 October 2018 Updateでは、DirectX Raytracing (DXR) の機能が追加された。アップデートされたDirectX 12 APIを通じて、DXR対応ハードウェア上でリアルタイムレイトレーシングを実行できるようになった。また、Windows 10バージョン1903では、DirectX 12をベースに実装された機械学習用のローレベルAPIとして、DirectMLが追加された。
マイクロソフトは2020年3月、「DirectX 12 Ultimate」を発表した。PCとXbox Series Xのグラフィックスプラットフォームを統一し、ゲームエコシステム全体の拡大を図ることを目的としている。Windows 10バージョン2004以降で利用可能。
DirectX 12 Ultimateは以下の4つの技術から成る。下位互換性があるので、DirectX 12 Ultimateに対応しているハードウェアはDirectX 12を使用する既存のアプリケーションを実行することもできる。
DirectX Raytracing 1.1 (DXR 1.1): リアルタイムレイトレーシングを実現するグラフィックスAPIの次期版。マイクロソフトとNVIDIAが共同開発。
Variable Rate Shading (VRS): シェーダーのピクセル解像度を状況に応じて変化させることで、見た目に影響を与えず描画を高速化。
Mesh Shaders: Turing世代のNVIDIA製GPUに追加されたシェーダー。
Sampler Feedback: 不要な計算を省いてレンダリング負荷を下げる技術の一つ。
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が標準提供されている。また、、、 といったオープンソースのC++専用補助ライブラリが開発され、MITライセンスでGitHubにて公開されている(開発当初はMs-PLライセンスでCodePlexにて公開されていた)。なおWindows 8およびVisual Studio 2012以降でも旧DirectX SDKをインストールするか、DirectXエンドユーザーランタイムをインストールすることでD3DXを利用することは可能だが、Windowsストアアプリ(WinRTアプリ、Modern UIアプリ)の開発ではD3DXを使用することはできず、D3DXを使用できるのはデスクトップアプリケーションのみとなっている。