Direct3D 9 と Direct3D 11 の間の重要な変更点Important changes from Direct3D 9 to Direct3D 11

概要Summary

このトピックでは、DirectX 9 と DirectX 11 の大まかな違いについて説明します。This topic explains the high-level differences between DirectX 9 and DirectX 11.

Direct3D 11 は、グラフィックス ハードウェアに対する下位レベルの仮想化インターフェイスである Direct3D 9 と基本的に同じ種類の API です。Direct3D 11 is fundamentally the same type of API as Direct3D 9 - a low-level, virtualized interface into graphics hardware. これまでどおり、さまざまなハードウェア実装でグラフィックス描画操作を実行できます。It still allows you to perform graphics drawing operations on a variety of hardware implementations. グラフィックス API のレイアウトは Direct3D 9 から変更されています。具体的には、デバイス コンテキストの概念が拡張され、グラフィックス インフラストラクチャ専用の API が追加されました。The layout of the graphics API has changed since Direct3D 9; the concept of a device context has been expanded, and an API has been added specifically for graphics infrastructure. Direct3D デバイスに格納されたリソースには、リソース ビューと呼ばれるデータ ポリモーフィズムの新しいメカニズムが用意されています。Resources stored on the Direct3D device have a novel mechanism for data polymorphism called a resource view.

コア API の関数Core API functions

Direct3D 9 では、使い始める前に、Direct3D API へのインターフェイスを作成する必要がありました。In Direct3D 9 you had to create an interface to the Direct3D API before you could start using it. Direct3D 11 ユニバーサル Windows プラットフォーム (UWP) ゲームでは、D3D11CreateDevice という静的関数を呼び出して、デバイスとデバイス コンテキストを作成します。In your Direct3D 11 Universal Windows Platform (UWP) game, you call a static function called D3D11CreateDevice to create the device and the device context.

デバイスとデバイス コンテキストDevices and device context

Direct3D 11 デバイスは、仮想化グラフィックス アダプターを表します。A Direct3D 11 device represents a virtualized graphics adapter. これは、GPU へのテクスチャのアップロード、テクスチャ リソースとスワップ チェーン上のビューの作成、テクスチャ サンプラーの作成など、ビデオ メモリ内にリソースを作成するために使います。It's used to create resources in video memory, for example: uploading textures to the GPU, creating views on texture resources and swap chains, and creating texture samplers. Direct3D 11 デバイス インターフェイスの用途の全一覧については、「ID3D11Device」と「ID3D11Device1」をご覧ください。For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Direct3D 11.A Direct3D 11. のデバイス コンテキストは、パイプラインの状態を設定し、レンダリング コマンドを生成するために使われます。device context is used to set pipeline state and generate rendering commands. たとえば、Direct3D 11 のレンダリング チェーンでは、デバイス コンテキストを使って、レンダリング チェーンを設定し、シーンを描画します (下記参照)。For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). デバイス コンテキストは、Direct3D デバイス リソースで使われるビデオ メモリにアクセス (マップ) するために使われます。また、定数バッファー データなどのサブリソース データを更新するためにも使われます。The device context is used to access (map) video memory used by Direct3D device resources; it's also used to update subresource data, for example constant buffer data. Direct3D 11 デバイス コンテキストの用途の全一覧については、「ID3D11DeviceContext」と「ID3D11DeviceContext1」をご覧ください。For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1. ほとんどのサンプルではイミディエイト コンテキストを使ってデバイスに直接レンダリングしていますが、Direct3D 11 では主にマルチスレッドに使われる遅延デバイス コンテキストもサポートしています。Note that most of our samples use an immediate context to render directly to the device, but Direct3D 11 also supports deferred device contexts, which are primarily used for multithreading.

Direct3D 11 では、D3D11CreateDevice を呼び出して、デバイス ハンドルとデバイス コンテキスト ハンドルの両方を取得します。In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. また、このメソッドでは、特定のハードウェア機能を要求し、グラフィックス アダプターでサポートされている Direct3D 機能レベルの情報を取得します。This method is also where you request a specific set of hardware features and retrieve information on Direct3D feature levels supported by the graphics adapter. デバイス、デバイス コンテキスト、スレッドの考慮事項について詳しくは、「Direct3D 11 のデバイスについて」をご覧ください。See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

デバイス インフラストラクチャ、フレーム バッファー、レンダー ターゲット ビューDevice infrastructure, frame buffers, and render target views

Direct3D 11 では、IDXGIAdapterIDXGIDevice1 COM インターフェイスを使って、DirectX Graphic Infrastructure (DXGI) API でデバイス アダプターとハードウェア構成を設定します。In Direct3D 11, the device adapter and hardware configuration are set with the DirectX Graphics Infrastructure (DXGI) API using the IDXGIAdapter and IDXGIDevice1 COM interfaces. 特定の DXGI インターフェイスでバッファーなどのウィンドウ リソース (表示またはオフ スクリーン) を作成し、構成します。IDXGIFactory2 ファクトリ パターンの実装では、フレーム バッファーなどの DXGI リソースを取得します。Buffers and other window resources (visible or offscreen) are created and configured by specific DXGI interfaces; the IDXGIFactory2 factory pattern implementation acquires DXGI resources such as the frame buffer. DXGI がスワップ チェーンを所有するため、画面にフレームを表示するために DXGI インターフェイスが使われます (「IDXGISwapChain1」をご覧ください)。Since DXGI owns the swap chain, a DXGI interface is used to present frames to the screen - see IDXGISwapChain1.

IDXGIFactory2 を使って、ゲームと互換性のあるスワップ チェーンを作成します。Use IDXGIFactory2 to create a swap chain compatible with your game. HWND のスワップ チェーンを作成する代わりに、コア ウィンドウ (コンポジション (XAML の相互運用機能)) のスワップ チェーンを作成する必要があります。You need to create a swap chain for a core window, or for composition (XAML interop), instead of creating a swap chain for an HWND.

デバイス リソースとリソース ビューDevice resources and resource views

Direct3D 11 では、ビューと呼ばれるビデオ メモリ リソースに対する追加のポリモーフィズム レベルをサポートしています。Direct3D 11 supports an additional level of polymorphism on video memory resources known as views. 基本的には、テクスチャに対する Direct3D 9 オブジェクトは以前は 1 つでしたが、それが 2 つになりました。1 つはデータを保持するテクスチャ リソースで、もう 1 つはレンダリングにビューを使う方法を示すリソース ビューです。Essentially, where you had a single Direct3D 9 object for a texture, you now have two objects: the texture resource, which holds the data, and the resource view, which indicates how the view is used for rendering. リソースに基づくビューでは、特定の目的にそのリソースを使うことができます。A view based on a resource enables that resource to be used for a specific purpose. たとえば、2D テクスチャ リソースを ID3D11Texture2D として作成し、それをシェーダーのテクスチャとして使うことができるように、2D テクスチャ リソースに対してシェーダー リソース ビュー (ID3D11ShaderResourceView) を作成します。For example, a 2D texture resource is created as an ID3D11Texture2D, then a shader resource view (ID3D11ShaderResourceView) is created on it so it can be used as a texture in a shader. また、描画面として使うことができるように、同じ 2D テクスチャ リソースに対してレンダー ターゲット ビュー (ID3D11RenderTargetView) を作成することもできます。A render target view (ID3D11RenderTargetView) can also be created on the same 2D texture resource so that it can be used as a drawing surface. 別の例として、1 つのテクスチャ リソースに対して 2 つの異なるビューを使うと、同じピクセル データが 2 つの異なるピクセル形式で表されます。In another example, the same pixel data is represented in 2 different pixel formats by using 2 separate views on a single texture resource.

基になるリソースは、そのリソースから作成されるビューの種類と互換性のあるプロパティを使って作成する必要があります。The underlying resource must be created with properties that are compatible with the type of views that will be created from it. たとえば場合、 ID3D11RenderTargetView が適用されるでその画面を作成、画面に、 D3D11_バインド_レンダー_ターゲットフラグ。For example, if an ID3D11RenderTargetView is applied to a surface, that surface is created with the D3D11_BIND_RENDER_TARGET flag. レンダリングと互換性のある DXGI サーフェス形式にも、画面があります (を参照してください DXGI_形式)。The surface also has to have a DXGI surface format compatible with rendering (see DXGI_FORMAT).

レンダリングに使うリソースのほとんどは、ID3D11Resource インターフェイスから継承します。このインターフェイスは、ID3D11DeviceChild から継承します。Most of the resources you use for rendering inherit from the ID3D11Resource interface, which inherits from ID3D11DeviceChild. 頂点バッファー、インデックス バッファー、定数バッファー、シェーダーはすべて Direct3D 11 リソースです。Vertex buffers, index buffers, constant buffers, and shaders are all Direct3D 11 resources. 入力レイアウトとサンプラーの状態は ID3D11DeviceChild から直接継承します。Input layouts and sampler states inherit directly from ID3D11DeviceChild.

リソース ビューの使用、DXGI_ピクセル形式を示す列挙値を書式設定します。Resources views use a DXGI_FORMAT enum value to indicate the pixel format. 常にではなく D3DFMT は、DXGI としてサポートされている_形式。Not every D3DFMT is supported as a DXGI_FORMAT. たとえば、形式はありません 24 bpp RGB D3DFMT に相当する DXGI で_R8G8B8 します。For example, there is no 24bpp RGB format in DXGI that is equivalent to D3DFMT_R8G8B8. いないすべての RGB 形式に対応する BGR も (DXGI_形式_R10G10B10A2_UNORM は D3DFMT_A2B10G10R10、D3DFMT に直接相当するものはありませんが、_A2R10G10B10)。There are also not BGR equivalents to every RGB format (DXGI_FORMAT_R10G10B10A2_UNORM is equivalent to D3DFMT_A2B10G10R10, but there’s no direct equivalent to D3DFMT_A2R10G10B10). これらの従来の形式のコンテンツをビルド時にサポートされている形式に変換する必要があります。You should plan to convert any content in these legacy formats to supported formats at build-time. DXGI の完全な一覧形式を参照してください、 DXGI_形式列挙体。For a complete list of DXGI formats see the DXGI_FORMAT enumeration.

Direct3D デバイス リソース (とリソース ビュー) は、シーンをレンダリングする前に作成します。Direct3D device resources (and resource views) are created before the scene is rendered. デバイス コンテキストは、後で説明するように、レンダリング チェーンを設定するために使われます。Device contexts are used to set up the rendering chain, as explained below.

デバイス コンテキストとレンダリング チェーンDevice context and the rendering chain

Direct3D 9 と Direct3D 10.x には、リソースの作成、状態、描画を管理する単一の Direct3D デバイス オブジェクトがありました。In Direct3D 9 and Direct3D 10.x, there was a single Direct3D device object which managed resource creation, state, and drawing. Direct3D 11 では、これまでどおり Direct3D デバイス インターフェイスでリソースの作成を管理しますが、すべての状態と描画操作は Direct3D デバイス コンテキストを使って処理します。In Direct3D 11, the Direct3D device interface still manages resource creation, but all state and drawing operations are handled by using a Direct3D device context. デバイス コンテキスト (ID3D11DeviceContext1 インターフェイス) を使って、レンダリング チェーンを設定する例を次に示します。Here's an example of how the device context (ID3D11DeviceContext1 interface) is used to set up the rendering chain:

  • レンダー ターゲット ビュー (と深度ステンシル ビュー) の設定と消去Set and clear render target views (and depth stencil view)
  • 入力アセンブラー ステージ (IA ステージ) の頂点バッファー、インデックス バッファー、入力レイアウトの設定Set the vertex buffer, index buffer, and input layout for the input assembler stage (IA stage)
  • パイプラインへの頂点シェーダーとピクセル シェーダーのバインドBind vertex and pixel shaders to the pipeline
  • シェーダーへの定数バッファーのバインドBind constant buffers to shaders
  • ピクセル シェーダーへのテクスチャ ビューとサンプラーのバインドBind texture views and samplers to the pixel shader
  • シーンの描画Draw the scene

ID3D11DeviceContext::Draw メソッドの 1 つを呼び出すと、レンダー ターゲット ビューにシーンが描画されます。When one of the ID3D11DeviceContext::Draw methods is called, the scene is drawn on the render target view. すべての描画が完了したら、IDXGISwapChain1::Present1 を呼び出し、DXGI アダプターを使って、完成したフレームを表示します。When you're done will all your drawing the DXGI adapter is used to present the completed frame by calling IDXGISwapChain1::Present1.

状態の管理State management

Direct3D 9 では、SetRenderState、SetSamplerState、SetTextureStageState メソッドで設定された多数の個々のトグルを使って状態の設定を管理しました。Direct3D 9 managed state settings with a large set of individual toggles set with the SetRenderState, SetSamplerState, and SetTextureStageState methods. Direct3D 11 では、従来の固定関数パイプラインがサポートされないため、SetTextureStageState の代わりに、ピクセル シェーダー (PS) を記述します。Since Direct3D 11 does not support the legacy fixed-function pipeline, the SetTextureStageState is replaced by writing pixel shaders (PS). Direct3D 9 の状態ブロックに相当するものはありません。There is no equivalent to a Direct3D 9 state block. 代わりに、Direct3D 11 では、レンダリングの状態をグループ化する合理化的な方法を提供する 4 種類の状態オブジェクトを使って状態を管理します。Direct3D 11 instead manages state through the use of 4 kinds of state objects which provide a more streamlined way to group the rendering state.

D3DRS をサニティを使用する代わりに、たとえば、_ZENABLE、この DepthStencilState オブジェクトを作成して、他の関連設定の状態し、レンダリング時に、状態を変更します。For example, instead of using SetRenderState with D3DRS_ZENABLE, you create a DepthStencilState object with this and other related state settings and use it to change state while rendering.

Direct3D 9 アプリケーションを状態オブジェクトに移植する際は、さまざまな状態の組み合わせが、変更できない状態オブジェクトとして表されることに注意してください。When porting Direct3D 9 applications to state objects, be aware that your various state combinations are represented as immutable state objects. それらは一度作成し、有効な限り再利用する必要があります。They should be created once and re-used as long as they are valid.

Direct3D の機能レベルDirect3D feature levels

Direct3D には、機能レベルと呼ばれるハードウェア サポートを確認するための新しいメカニズムが用意されています。Direct3D has a new mechanism for determining hardware support called feature levels. 機能レベルにより、明確に定義された一連の GPU 機能を要求できるようになるため、グラフィックス アダプターが実行できる操作を簡単に判断できます。Feature levels simplify the task of figuring out what the graphics adapter can do by allowing you to request a well-defined set of GPU functionality. 9 など_機能は、シェーダーを含む、Direct3D 9 グラフィックス アダプターによって提供される機能の 1 レベルの実装が 2.x をモデル化します。For example, the 9_1 feature level implements the functionality provided by Direct3D 9 graphics adapters, including shader model 2.x. 9 以降_1 は最も低い機能レベル、9 の Direct3D のプログラミング可能なシェーダー モデルでサポートされている同じステージされた頂点シェーダーとピクセル シェーダーをサポートするすべてのデバイスを期待できます。Since 9_1 is the lowest feature level, you can expect all devices to support a vertex shader and a pixel shader, which were the same stages supported by the Direct3D 9 programmable shader model.

ゲームでは D3D11CreateDevice を使って、Direct3D デバイスとデバイス コンテキストを作成します。Your game will use D3D11CreateDevice to create the Direct3D device and device context. この関数を呼び出す際に、ゲームでサポートできる機能レベルの一覧を指定します。When you call this function you provide a list of feature levels that your game can support. この関数は、その一覧からサポートされる最高の機能レベルを返します。It will return the highest supported feature level from that list. たとえば、ゲームが 9 以上を含めるように対する BC4/BC5 テクスチャ (DirectX 10 ハードウェアの機能) を使用できる場合_1 から 10_サポートされている機能レベルの一覧では 0。For example if your game can use BC4/BC5 textures (a feature of DirectX 10 hardware), you would include at least 9_1 and 10_0 in the list of supported feature levels. ゲームが DirectX 9 ハードウェア上で実行し、に対する BC4/BC5 テクスチャを使用できない、 D3D11CreateDevice 9 が返されます_1。If the game is running on DirectX 9 hardware and BC4/BC5 textures can't be used, then D3D11CreateDevice will return 9_1. その場合は、別のテクスチャ形式 (とより小さいテクスチャ) にフォールバックできます。Then your game can fall back to a different texture format (and smaller textures).

Direct3D 9 ゲームを拡張して、より高い Direct3D 機能レベルをサポートする場合は、まず、既にある Direct3D 9 グラフィックス コードの移行を完了させることをお勧めします。If you decide to extend your Direct3D 9 game to support higher Direct3D feature levels then it's better to finish porting your existing Direct3D 9 graphics code first. ゲームが Direct3D 11 で動作するようにすると、拡張グラフィックスを使った追加のレンダリング パスの追加が簡単になります。After you have your game working in Direct3D 11, it's easier to add additional rendering paths with enhanced graphics.

機能レベルのサポートについて詳しくは、「Direct3D 機能レベル」をご覧ください。See Direct3D feature levels for a detailed explanation of feature level support. Direct3D 11 機能の一覧については、「Direct3D 11 の機能」と「Direct3D 11.1 の機能」をご覧ください。See Direct3D 11 Features and Direct3D 11.1 Features for a full list of Direct3D 11 features.

機能レベルとプログラム可能なパイプラインFeature levels and the programmable pipeline

ハードウェアは Direct3D 9 から進化を続けており、いくつかの新しいオプション ステージがプログラム可能なグラフィックス パイプラインに追加されています。Hardware has continue to evolve since Direct3D 9, and several new optional stages have been added to the programmable graphics pipeline. グラフィックス パイプラインの一連のオプションは、Direct3D 機能レベルによって異なります。The set of options you have for the graphics pipeline varies with the Direct3D feature level. 機能レベル 10.0 には、GPU でのマルチパス レンダリング用のオプションのストリーム アウトがあるジオメトリ シェーダー ステージが含まれています。Feature level 10.0 includes the geometry shader stage with optional stream out for multipass rendering on the GPU. 機能レベル 11_ハードウェア テセレーションで使用するためのドメイン シェーダー、ハル シェーダー、0 が含まれます。Feature level 11_0 include the hull shader and domain shader for use with hardware tessellation. 機能レベル 11_10.x のみを含める機能レベルが DirectCompute の制限付き形式のサポートに 0 が DirectCompute のシェーダーの完全なサポートにも含まれます。Feature level 11_0 also includes full support for DirectCompute shaders, while feature levels 10.x only include support for a limited form of DirectCompute.

すべてのシェーダーは、Direct3D 機能レベルに対応するシェーダー プロファイルを使って HLSL で記述します。All shaders are written in HLSL using a shader profile that corresponds to a Direct3D feature level. シェーダー プロファイルは、vs を使用してをコンパイルする HLSL シェーダーのため、互換性のある上向き、_4_0_レベル_9_1 または ps_4_0_レベル_9_1 はすべてのデバイスで動作します。Shader profiles are upwards compatible, so an HLSL shader that compiles using vs_4_0_level_9_1 or ps_4_0_level_9_1 will work across all devices. シェーダーのプロファイルはない下位互換性があるため vs を使用して、シェーダーのコンパイル_4_1 は 10 の機能レベルでのみ動作_1, 11_0、または 11_1 デバイス。Shader profiles are not downlevel compatible, so a shader compiled using vs_4_1 will only work on feature level 10_1, 11_0, or 11_1 devices.

Direct3D 9 では、共有配列と一緒に SetVertexShaderConstant と SetPixelShaderConstant を使ってシェーダーの定数を管理していました。Direct3D 9 managed constants for shaders using a shared array with SetVertexShaderConstant and SetPixelShaderConstant. Direct3D 11 では、頂点バッファーやインデックス バッファーと同じようなリソースである定数バッファーを使います。Direct3D 11 uses constant buffers, which are resources like a vertex buffer or index buffer. 定数バッファーは、効率的に更新できるように設計されています。Constant buffers are designed to be updated efficiently. すべてのシェーダー定数を 1 つのグローバル配列にまとめる代わりに、定数を論理グループに整理し、1 つ以上の定数バッファーを使って管理します。Instead of having all the shader contants organized into a single global array you organize your constants into logical groupings and manage them through one or more constant buffers. Direct3D 9 ゲームを Direct3D 11 に移植する場合は、定数バッファーを適切に更新できるように整理してください。When you port your Direct3D 9 game to Direct3D 11, plan to organize your constant buffers so that you can update them appropriately. たとえば、フレームごとに更新されないシェーダーの定数は別の定数バッファーにグループ化します。そうすると、より動的なシェーダーの定数と一緒にそのデータをグラフィックス アダプターに絶えずアップロードする必要がなくなります。For example, group shader constants that aren't updated every frame into a separate constant buffer, so that you don't have to constantly upload that data to the graphics adapter along with your more dynamic shader constants.

  最も Direct3D 9 アプリケーション、シェーダーの広範な使用が従来の固定機能の動作の使用に混在場合があります。Note   Most Direct3D 9 applications made extensive use of shaders, but occasionally mixed in use of the legacy fixed-function behavior. Direct3D 11 では、プログラム可能なシェーダー モデルしか使わないことに注意してください。Note that Direct3D 11 only uses a programmable shading model. Direct3D 9 の従来の固定関数機能は推奨されなくなりました。The legacy fixed-function features of Direct3D 9 are deprecated.