OpenGL ES 2.0 から Direct3D への移植の計画Plan your port from OpenGL ES 2.0 to Direct3D

重要な APIImportant APIs

iOS または Android プラットフォームからゲームを移植している場合、OpenGL ES 2.0 に多大な投資を行ってこられたものと思われます。If you are porting a game from the iOS or Android platforms, you have probably made a significant investment in OpenGL ES 2.0. グラフィックス パイプラインのコードベースを Direct3D 11 と Windows ランタイムに移す準備をしているときは、開始する前に何点か注意してください。When preparing to move your graphics pipeline codebase to Direct3D 11 and the Windows Runtime, there are a few things you should consider before you start.

ほとんどの移植作業では、通常、最初にコードベースを調べて、2 つのモデル間で共通する API とパターンをマップします。Most porting efforts usually involving initially walking the codebase and mapping common APIs and patterns between the two models. このトピックを読んで内容を確かめれば、このプロセスが少し楽になるはずです。You'll find this process a bit easier if you take some time to read and review this topic.

OpenGL ES 2.0 から Direct3D 11 にグラフィックスを移植する際に注意する必要のある事柄を次に示します。Here are some things to be aware of when porting graphics from OpenGL ES 2.0 to Direct3D 11.

特定の OpenGL ES 2.0 プロバイダーに関する注意事項Notes on specific OpenGL ES 2.0 providers

このセクションの移植に関するトピックでは、Khronos Group によって作成された OpenGL ES 2.0 仕様の Windows 実装を参照します。The porting topics in this section reference the Windows implementation of the OpenGL ES 2.0 specification created by the Khronos Group. OpenGL ES 2.0 コード サンプルは、いずれも Visual Studio 2012 と基本的な Windows C 構文を使って開発されたものです。All OpenGL ES 2.0 code samples were developed using Visual Studio 2012 and basic Windows C syntax. Objective-C (iOS) または Java (Android) コードベースから移植する場合は、用意されている OpenGL ES 2.0 コード サンプルで、類似の API 呼び出し構文またはパラメーターが使われていない可能性があることに注意してください。If you are coming from an Objective-C (iOS) or Java (Android) codebase, be aware that the provided OpenGL ES 2.0 code samples may not use similar API calling syntax or parameters. このガイダンスでは、できるだけプラットフォームにとらわれずに説明します。This guidance tries to stay as platform agnostic as possible.

このドキュメントでは、OpenGL ES のコードと参照に 2.0 仕様の API のみを使います。This documentation only uses the 2.0 specification APIs for the OpenGL ES code and reference. OpenGL ES 1.1 または 3.0 から移植する場合もこのコンテンツは有用ですが、OpenGL ES 2.0 のコード例とコンテキストの一部に馴染みがない可能性があります。If you are porting from OpenGL ES 1.1 or 3.0, this content can still prove useful, although some of the OpenGL ES 2.0 code examples and context may be unfamiliar.

これらのトピックの Direct3D 11 のサンプルでは、Microsoft Windows C++ とコンポーネント拡張 (CX) を使います。The Direct3D 11 samples in these topics use Microsoft Windows C++ with Component Extensions (CX). このバージョンの C++ 構文の詳細については、読み取るVisual CComponent Extensions for Runtime Platforms、およびクイック リファレンス (C++\CX)します。For more info on this version of the C++ syntax, read Visual C++, Component Extensions for Runtime Platforms, and Quick Reference (C++\CX).

ハードウェア要件とリソースについてUnderstand your hardware requirements and resources

OpenGL ES 2.0 でサポートされる一連のグラフィックス処理機能は、Direct3D 9.1 で提供される機能にほぼ対応しています。The set of graphics processing features supported by OpenGL ES 2.0 roughly maps to the features provided in Direct3D 9.1. Direct3D 11 で提供される高度な機能を利用する場合は、移植の計画段階では Direct3D 11 のドキュメントを、最初の作業を終えた段階では「DirectX 9 からユニバーサル Windows プラットフォーム (UWP) への移植」のトピックをご覧ください。If you want to take advantage of the more advanced features provided in Direct3D 11, review the Direct3D 11 documentation when planning your port, or review the Port from DirectX 9 to Universal Windows Platform (UWP) topics when you're done with the initial effort.

初期移植作業を簡単にするには、Visual Studio の Direct3D テンプレートを利用してください。To make your initial porting effort simple, start with a Visual Studio Direct3D template. 基本的なレンダラーが既に構成されており、ウィンドウの変更と Direct3D 機能レベルに関するリソースの再作成などの UWP アプリ機能がサポートされています。It provides a basic renderer already configured for you, and supports UWP app features like recreating resources on window changes and Direct3D feature levels.

Direct3D の機能レベルについてUnderstand Direct3D feature levels

Direct3d11 では、ハードウェア「の機能レベル」9 から_11 を 1 (Direct3D 9.1)_1。Direct3D 11 provides support for hardware "feature levels" from 9_1 (Direct3D 9.1) for 11_1. これらの機能レベルは、特定のグラフィックス機能とリソースの可用性を示します。These feature levels indicate the availability of certain graphics features and resources. 通常、ほとんどの OpenGL ES 2.0 プラットフォームは Direct3D 9.1 をサポート (機能レベル 9_1) 機能のセット。Typically, most OpenGL ES 2.0 platforms support a Direct3D 9.1 (feature level 9_1) set of features.

DirectX のグラフィックス機能と API の確認Review DirectX graphics features and APIs

API ファミリAPI Family 説明Description
DXGIDXGI DirectX Graphic Infrastructure (DXGI) は、グラフィックス ハードウェアと Direct3D の間のインターフェイスを提供します。The DirectX Graphics Infrastructure (DXGI) provides an interface between the graphics hardware and Direct3D. これは IDXGIAdapterIDXGIDevice1 の COM インターフェイスを使ってデバイス アダプターとハードウェア構成を設定します。It sets the device adapter and hardware configuration using the IDXGIAdapter and IDXGIDevice1 COM interfaces. バッファーなどのウィンドウ リソースを作成および構成する場合に使います。Use it to create and configure your buffers and other window resources. 特に、IDXGIFactory2 ファクトリ パターンは、スワップ チェーン (フレーム バッファーのセット) などのグラフィックス リソースを取得するために使われます。Notably, the IDXGIFactory2 factory pattern iis used to acquire the graphics resources, including the swap chain (a set of frame buffers). DXGI がスワップ チェーンを所有するため、画面にフレームを表示するために IDXGISwapChain1 インターフェイスが使われます。Since DXGI owns the swap chain, the IDXGISwapChain1 interface is used to present frames to the screen.
Direct3DDirect3D Direct3D は API のセットであり、グラフィックス インターフェイスの仮想表示を提供し、それを使ってグラフィックスを描画できるようにします。Direct3D is the set of APIs that provide a virtual representation of the graphics interface and allow you to draw graphics using it. バージョン 11 は、機能的に OpenGL 4.3 とほぼ同等です Version 11, is roughly comparable, feature-wise, to OpenGL 4.3. (OpenGL ES 2.0 では、その一方に似ています DirectX9、その代わり、および OpenGL 2.0 では、シェーダーのパイプラインを統合が OpenGL 3.0 の)面倒な作業のほとんどは、それぞれ個々 のリソースおよびサブリソース、レンダリングのコンテキストへのアクセスを提供する ID3D11Device1 と ID3D11DeviceContext1 インターフェイスで実行されます。(OpenGL ES 2.0, on the other hand, is similar to DirectX9, feature-wise, and OpenGL 2.0, but with OpenGL 3.0's unified shader pipeline.) Most of the heavy lifting is done with the ID3D11Device1 and ID3D11DeviceContext1 interfaces which provide access to individual resources and subresources, and the rendering context, respectively.
Direct2DDirect2D Direct2D は、GPU アクセラレーションが活用された 2D レンダリング用の API のセットです。Direct2D provides a set of APIs for GPU-accelerated 2D rendering. 用途は OpenVG と似ています。It can be considered similar in purpose to OpenVG.
DirectWriteDirectWrite DirectWrite は、GPU アクセラレーションが活用された高品質なフォント レンダリング用の API のセットです。DirectWrite provides a set of APIs for GPU-accelerated, high-quality font rendering.
DirectXMathDirectXMath DirectXMath は、一般的な線形代数と三角法の種類、値、関数を処理するための API とマクロのセットを提供します。DirectXMath provides a set of APIs and macros for handling common linear algebra and trigonometric types, values, and functions. これらの型と関数は、Direct3D とそのシェーダーの操作に対応しています。These types and functions are designed to work well with Direct3D and its shader operations.
DirectX HLSLDirectX HLSL Direct3D シェーダーで使われる現在の HLSL 構文です。The current HLSL syntax used by Direct3D shaders. Direct3D Shader Model 5.0 を実装します。It implements Direct3D Shader Model 5.0.

 

Windows ランタイム API とテンプレート ライブラリの確認Review the Windows Runtime APIs and template library

Windows ランタイム API は、UWP アプリの全体的なインフラストラクチャを提供します。The Windows Runtime APIs provide the overall infrastructure for UWP apps. 詳しくは、ここ をご覧ください。Review them here.

グラフィックス パイプラインの移植で使われる主要な Windows ランタイム API は次のとおりです。Key Windows Runtime APIs used in porting your graphics pipeline include:

また、Windows ランタイム C++ テンプレート ライブラリ (WRL) は、Windows ランタイム コンポーネントを作成して使うための下位レベルの方法を提供するテンプレート ライブラリです。Additionally, the Windows Runtime C++ Template Library (WRL) is a template library that provides a low-level way to author and use Windows Runtime components. UWP アプリ用の Direct3D 11 API は、スマート ポインター (ComPtr) など、このライブラリ内のインターフェイスおよび型と組み合わせたときに最適に動作します。The Direct3D 11 APIs for UWP apps are best used in conjunctions with the interfaces and types in this library, such as smart pointers (ComPtr). WRL について詳しくは、「Windows ランタイム C++ テンプレート ライブラリ (WRL)」をご覧ください。For more info on the WRL, read Windows Runtime C++ Template Library (WRL).

座標系の変更Change your coordinate system

ときとして初期移植作業に混乱を招く違いは、OpenGL の従来の右手による座標系から Direct3D の既定の左手による座標系への変更です。One difference that sometimes confuses early port efforts is the change from OpenGL's traditional right-handed coordinate system to Direct3D's default left-handed coordinate system. 座標モデルにおけるこの変更は、頂点バッファーの設定と構成から、マトリックスの数学関数の多くに至るまで、ゲームの多くの部分に影響します。This change in coordinate modeling affects many parts of your game, from the setup and configuration of your vertex buffers to many of your matrix math functions. 2 つの最も重要な変更は次のとおりです。The two most important changes to make are:

  • 三角形の頂点の順序を逆にし、Direct3D が前から時計回りにそれらをスキャンするようにします。Flip the order of triangle vertices so that Direct3D traverses them clockwise from the front. たとえば、頂点のインデックスが OpenGL パイプラインで 0、1、2 のとき、Direct3D に 0、2、1 として渡します。For example, if your vertices are indexed as 0, 1, and 2 in your OpenGL pipeline, pass them to Direct3D as 0, 2, 1 instead.
  • 効果的に z 軸座標を反転させるために、ビュー マトリックスを使って z 方向に -1.0f だけワールド空間を拡大します。Use the view matrix to scale world space by -1.0f in the z direction, effectively reversing the z-axis coordinates. そのためには、ビュー マトリックスの位置 M31、M32、M33 にある値の符号を逆にします (Matrix 型に移植するとき)。To do this, flip the sign of the values at positions M31, M32, and M33 in your view matrix (when porting it to the Matrix type). M34 が 0 でない場合は、その符号を同様に逆にします。If M34 is not 0, flip its sign as well.

ただし、Direct3D は右手による座標系をサポートできます。However, Direct3D can support a right-handed coordinate system. DirectXMath は、左手による座標系と右手による座標系を操作するさまざまな関数を提供します。DirectXMath provides a number of functions that operate on and across both left-handed and right-handed coordinate systems. 元のメッシュ データおよびマトリックスの処理の一部を維持するために使うことができます。They can be used to preserve some of your original mesh data and matrix processing. 具体的な内容を次に示します。They include:

DirectXMath のマトリックス関数DirectXMath matrix function 説明Description
XMMatrixLookAtLHXMMatrixLookAtLH カメラの位置、上方向、焦点を使って、左手による座標系のビュー マトリックスを作成します。Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookAtRHXMMatrixLookAtRH カメラの位置、上方向、焦点を使って、右手による座標系のビュー マトリックスを作成します。Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookToLHXMMatrixLookToLH カメラの位置、上方向、カメラの向きを使って、左手による座標系のビュー マトリックスを作成します。Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixLookToRHXMMatrixLookToRH カメラの位置、上方向、カメラの向きを使って、右手による座標系のビュー マトリックスを作成します。Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a camera direction.
Xmmatrixorthographiclh 関数XMMatrixOrthographicLH 左手による座標系の正投影マトリックスを作成します。Builds an orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterLHXMMatrixOrthographicOffCenterLH 左手による座標系のカスタム正投影マトリックスを作成します。Builds a custom orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterRHXMMatrixOrthographicOffCenterRH 右手による座標系のカスタム正投影マトリックスを作成します。Builds a custom orthogonal projection matrix for a right-handed coordinate system.
XMMatrixOrthographicRHXMMatrixOrthographicRH 右手による座標系の正投影マトリックスを作成します。Builds an orthogonal projection matrix for a right-handed coordinate system.
XMMatrixPerspectiveFovLHXMMatrixPerspectiveFovLH 視野に基づいて左手による遠近投影マトリックスを作成します。Builds a left-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveFovRHXMMatrixPerspectiveFovRH 視野に基づいて右手による遠近投影マトリックスを作成します。Builds a right-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveLHXMMatrixPerspectiveLH 左手による遠近投影マトリックスを作成します。Builds a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterLHXMMatrixPerspectiveOffCenterLH 左手による遠近投影マトリックスのカスタム バージョンを作成します。Builds a custom version of a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterRHXMMatrixPerspectiveOffCenterRH 右手による遠近投影マトリックスのカスタム バージョンを作成します。Builds a custom version of a right-handed perspective projection matrix.
XMMatrixPerspectiveRHXMMatrixPerspectiveRH 右手による遠近投影マトリックスを作成します。Builds a right-handed perspective projection matrix.

 

OpenGL ES2.0 から Direct3D 11 への移植についてよく寄せられる質問OpenGL ES2.0-to-Direct3D 11 porting Frequently Asked Questions

  • 質問:「一般は検索特定の文字列またはパターン OpenGL コードにして、Direct3D を置き換えることでしょうか。」Question: "In general, can I search for certain strings or patterns in my OpenGL code and replace them with the Direct3D equivalents?"
  • 回答:いいえ。Answer: No. OpenGL ES 2.0 と Direct3D 11 は、グラフィックス パイプライン モデルの異なる世代に基づいています。OpenGL ES 2.0 and Direct3D 11 come from different generations of graphics pipeline modeling. レンダリング コンテキストやシェーダーのインスタンス化など、概念と API の間に表面的な類似点はありますが、このガイダンスと Direct3D 11 のリファレンスを調べて、1 対 1 のマッピングを試みる代わりに、パイプラインを再作成するときに最適な選択ができるようにしてください。While there are some surface similarities between concepts and APIs, such as the rendering context and the instancing of shaders, you should review this guidance as well as the Direct3D 11 reference so you can make the best choices when recreating your pipeline instead of attempting a 1-to-1 mapping. ただし、GLSL から HLSL に移植する場合、GLSL の変数、組み込みメソッド、関数の一連の共通エイリアスを作成すると、移植が容易になるだけでなく、1 ペアのシェーダー コード ファイルだけを維持することができます。However, if you are porting from GLSL to HLSL, creating a set of common aliases for GLSL variables, intrinsincs, and functions can not only make porting easier, it allows you to maintain only one set of shader code files.