情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 の XAML & Direct3D アプリ

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

このトピックでは、XAML および Direct3D アプリの構造について説明し、さらに Windows Phone SDK 8.0 に含まれているプロジェクト テンプレートについて説明します。この種類のアプリでは、DrawingSurface コントロールを使用します。このコントロールでは、Direct3D を使用して、XAML コントロールおよびコンテンツの背後やインラインで表示されるグラフィックをレンダリングできます。DrawingSurface のサイズとレイアウトは、他の XAML コントロールの場合と同じように処理されます。

別の種類のアプリは Direct3D with XAML アプリです。このアプリは DrawingSurfaceBackgroundGrid コントロールを使用します。このコントロールを使用すると、グラフィックは、フレーム内のすべての要素を含むページ上の他の XAML 要素の下に画面全体にわたって表示されます。アプリに適したコントロールの選択の詳細については、「Windows Phone 8 のゲームに適したプロジェクト テンプレートを選択する」を参照してください。

XAML および Direct3D アプリは、XAML ベースの Windows Phone アプリと Windows Phone ランタイム を基にしたコンポーネントという 2 つのコンポーネントで構成されます。Windows Phone ランタイム コンポーネントは、Direct3D グラフィック デバイスを作成し、それを使用して XAML アプリと共有するテクスチャを作成します。Windows Phone ランタイム コンポーネントは、Direct3D を使用してテクスチャ上に描画します。XAML エンジンは、DrawingSurface コントロールの境界内の画面にテクスチャをコピーするスワップ チェーンを維持します。共有テクスチャは、XAML エンジンと Windows Phone ランタイム コンポーネントが同時にテクスチャ上で動作しないことが重要であるため、"同期テクスチャ" と呼ばれます。これらのすべての要素を調整する作業は複雑ですが、さいわいなことに、Windows Phone SDK 8.0 には、ユーザーのために低レベルのインフラストラクチャを実装するプロジェクト テンプレートがあります。このプロジェクト テンプレートを使用して新しいアプリを作成することができます。その後で F5 キーを押すと、デバイスの画面または Windows Phone Emulator に 3D キューブが直ちにレンダリングされます。このトピックの残りの部分では、XAML および Direct3D アプリ用のプロジェクト テンプレートについて説明します。

XAML と Direct3D プロジェクト テンプレートを使用し、複数のページが含まれる場合、プロジェクト テンプレートに含まれるファイルを次のように変更する必要があります。これにより、ユーザーがページ間を移動するときに、メモリが正しく管理されます。これらの変更は、プロジェクト テンプレートの将来のリリースに含まれます。

プロジェクト テンプレートを更新するには

  1. MainPage.xaml.cs で、次の行を

    
    private Direct3DInterop m_d3dInterop = new Direct3DInterop();
    
    
    

    次のように置き換えます

    
    private Direct3DInterop m_d3dInterop = null;
    
    
    
  2. MainPage.xaml.cs で、DrawingSurface コントロールの Loaded イベント ハンドラーを次のように置き換えます。

    
    private void DrawingSurface_Loaded(object sender, RoutedEventArgs e)
    {
        if (m_d3dInterop == null)
        {
            m_d3dInterop = new Direct3DInterop();
    
            // Set window bounds in dips
            m_d3dInterop.WindowBounds = new Windows.Foundation.Size(
                (float)DrawingSurface.ActualWidth,
                (float)DrawingSurface.ActualHeight
                );
    
            // Set native resolution in pixels
            m_d3dInterop.NativeResolution = new Windows.Foundation.Size(
                (float)Math.Floor(DrawingSurface.ActualWidth * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f),
                (float)Math.Floor(DrawingSurface.ActualHeight * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f)
                );
    
            // Set render resolution to the full native resolution
            m_d3dInterop.RenderResolution = m_d3dInterop.NativeResolution;
    
            // Hook-up native component to DrawingSurface
            DrawingSurface.SetContentProvider(m_d3dInterop.CreateContentProvider());
            DrawingSurface.SetManipulationHandler(m_d3dInterop);
        }
    }
    
    
    
  3. Direct3DInterop.cpp で、CreateContentProvider メソッドの定義を次の内容で置き換えます。

    
    IDrawingSurfaceContentProvider^ Direct3DInterop::CreateContentProvider()
    {
    	ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
    	return reinterpret_cast<IDrawingSurfaceContentProvider^>(provider.Get());
    }
    
    
    

このセクションでは、XAML および Direct3D アプリのプロジェクト テンプレートに含まれているファイルについて説明します。

XAML および Direct3D アプリを作成する場合は、Windows Phone SDK 8.0 に含まれる XAML および Direct3D アプリのプロジェクト テンプレートを使用して作業を開始する必要があります。新しいプロジェクトを作成するには、Visual Studio で、[ファイル] メニューの [新しいプロジェクト] をクリックし、[Visual C#] または [Visual Basic] の下で [Windows Phone XAML および Direct3D アプリ] をクリックします。

このテンプレートは、マネージ XAML ベース アプリと このテンプレートは、マネージ XAML ベース アプリと Windows Phone ランタイム コンポーネントという 2 つのプロジェクトを含む新しいソリューションを作成します。XAML アプリは、通常の Windows Phone アプリとほとんど同じです。このアプリでは、XAML とマネージ コードを使用して UI を実装しますが、その方法は Direct3D グラフィックを使用しないアプリの場合と同じです。唯一の違いは、数行のコードがプロジェクトに追加されており、それにより、Direct3D グラフィックが表示される DrawingSurface コントロールが追加され、Windows Phone ランタイム コンポーネントへの接続が設定されることです。

Windows Phone ランタイム コンポーネント プロジェクトには、純粋なネイティブの Windows Phone 用 Direct3D アプリ内のファイルに類似しているファイル、および Windows 8 用 Direct3D プロジェクト テンプレートに類似しているファイルがいくつか含まれています。これらのファイルは、グラフィック デバイスのセットアップを処理し、画面上にキューブを描画するサンプル コードを含んでいます。Windows Phone ランタイム コンポーネントとメイン アプリケーション、および Direct3D グラフィックを XAML UI に合成する基になる XAML エンジンとの間の通信に使用されるいくつかの追加のファイルがあります。アプリの作成をすぐに始める予定で、かつアプリを機能させる低レベルの技術的な詳細に興味がない場合は、XAML ベースの UI とマネージ コードをホストする MainPage クラス、共有テクスチャへの実際の描画が実行される場所となる CubeRenderer クラス、およびタッチ入力について説明する Direct3DInterop に関するセクションを読むだけでもかまいません。残りの部分は、テンプレートで提供されるコードに関する説明よりも詳しい説明になっています。

マネージ XAML アプリ

前に説明したように、XAML および Direct3D テンプレートの一部として作成された XAML アプリ プロジェクトは、Direct3D を使用しない通常の Windows Phone アプリとほとんど同じです。ただし、2 つのファイルに若干の追加のコードがあります。

MainPage.xaml

このファイルは、XAML ベースの Windows Phone アプリの UI を定義します。このプロジェクト テンプレートと共に、DrawingSurface コントロールが追加されます。このコントロールは、電話でサポートされる他の XAML コントロールと同じように操作できます。コントロールのサイズは変更することができます。コントロールの前後に他のコントロールを追加したり、StackPanelGrid などのコンテナーを使用して、UI で表示される場所を制御することができます。


<Grid x:Name="LayoutRoot" Background="Transparent">
    <DrawingSurface x:Name="DrawingSurface" Loaded="DrawingSurface_Loaded" />
</Grid>


MainPage.xaml.cs

メイン ページの分離コード ファイルで、DrawingSurface コントロールが実際の Direct3D 描画を実行する Windows Phone ランタイム コンポーネントにフックされます。ページの上部にある using ディレクティブは、Windows Phone ランタイム コンポーネントが含まれる名前空間を参照します。名前空間の名前は、プロジェクトを作成したときに指定した名前に "Comp" を付けたものになります。この例では、プロジェクト名は "XAMLD3DExample" です。


using XAMLD3DExampleComp;


次に、Direct3DInterop 型のメンバー変数が宣言されます。Direct3DInterop は、Windows Phone ランタイム コンポーネントによって公開されるクラスです。このクラスについてはこのチュートリアルで後で詳しく説明します。


private Direct3DInterop m_d3dInterop = null;


MainPage.xaml.cs でテンプレートが作成する唯一のメソッドは、DrawingSurface コントロールの Loaded イベント ハンドラーです。 このメソッドの最初の部分は、Direct3DInterop クラスの WindowBoundsNativeResolution、および RenderResolution プロパティを設定します。これらのプロパティにより、Windows Phone ランタイム コンポーネントは、DrawingSurface コントロールと同じサイズで同期テクスチャを作成できます。WindowBounds プロパティはデバイス非依存ピクセル (DIP) で表されたサイズを使用します。これは、DrawingSurface およびすべてのコントロールが ActualWidth および ActualHeight プロパティに使用するのと同じ単位です。 NativeResolution プロパティと RenderResolution プロパティでは、寸法を物理ピクセル単位で表すことが前提となっています。したがって、サイズは ScaleFactor プロパティで乗算し、100 で除算することによって変換されます。これにより、サポート対象のすべての画面解像度で正しいサイズ (ピクセル単位) になることが保証されます。数式に .5 ピクセルを加算し、Floor 関数を呼び出すことにより、寸法が最も近い整数に切り上げられます。

サイズ プロパティの設定後に、 DrawingSurfaceコントロールの SetContentProvider(Object) メソッドが、Direct3DInterop メソッド CreateContentProvider によって返されたオブジェクトを使用して呼び出されます。この呼び出しで、Windows Phone ランタイム コンポーネントを、Direct3D を使用して DrawingSurface コントロールのコンテンツを描画するプロバイダーとして設定します。このチュートリアルで後で説明するように、プロジェクト テンプレートは CreateContentProvider ヘルパー メソッドを使用して、コンテンツ プロバイダーを設定するための低レベルの呼び出しをカプセル化できるように構造化されます。

次に SetManipulationHandler(Object) が呼び出され、Direct3DInterop オブジェクトが渡されます。これにより、ユーザーが DrawingSurface コントロール内をタッチしたときに、PointerPressed()PointerMoved()、および PointerReleased()タッチ イベントを受け取るように Direct3DInterop を登録します。MainPage 分離コードページ内でタッチ イベントを取得してからコンポーネントにデータを手動で渡すよりも、Windows Phone ランタイム コンポーネント内でこれらのイベントを直接使用する方がパフォーマンスが向上します。


private void DrawingSurface_Loaded(object sender, RoutedEventArgs e)
{
    if (m_d3dInterop == null)
    {
        m_d3dInterop = new Direct3DInterop();

        // Set window bounds in dips
        m_d3dInterop.WindowBounds = new Windows.Foundation.Size(
            (float)DrawingSurface.ActualWidth,
            (float)DrawingSurface.ActualHeight
            );

        // Set native resolution in pixels
        m_d3dInterop.NativeResolution = new Windows.Foundation.Size(
            (float)Math.Floor(DrawingSurface.ActualWidth * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f),
            (float)Math.Floor(DrawingSurface.ActualHeight * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f)
            );

        // Set render resolution to the full native resolution
        m_d3dInterop.RenderResolution = m_d3dInterop.NativeResolution;

        // Hook-up native component to DrawingSurface
        DrawingSurface.SetContentProvider(m_d3dInterop.CreateContentProvider());
        DrawingSurface.SetManipulationHandler(m_d3dInterop);
    }
}


Windows ランタイム コンポーネント

このセクションでは、XAML および Direct3D アプリ プロジェクト テンプレートの一部として作成される Windows ランタイム コンポーネントについて説明します。このプロジェクトのファイルの多くは、DrawingSurface コントロールとコンポーネントのフックの低レベルの詳細を処理します。ほとんどの場合、これらを変更する必要はありません。

Direct3DInterop.h

このヘッダー ファイルは Direct3DInterop クラスを宣言します。このクラスは、XAML エンジンと作成した Direct3D コードの間のプロキシとして機能します。このクラスは、PointerPressed()PointerMoved() および PointerReleased() イベントを含む IDrawingSurfaceManipulationHandler インターフェイスを実装します。


public ref class Direct3DInterop sealed : public Windows::Phone::Input::Interop::IDrawingSurfaceManipulationHandler


Direct3DInterop.cpp

Direct3DInterop 実装ファイル内には、MainPage.xaml.cs の DrawingSurface_Loadedイベント ハンドラーから呼び出される CreateContentProvider メソッドの定義があります。このメソッドは、Direct3DContentProvider クラスの新規インスタンスを初期化し、IDrawingSurfaceContentProvider としてキャストします。IDrawingSurfaceContentProvider の定義を見ると、メンバーが定義されていないことがわかります。これはコードを使用して実装するインターフェイスではないためです。Direct3DContentProvider クラスは、Windows ランタイム C++ テンプレート ライブラリ (WRL) を使用して実装されます。このメソッドは、クラスを Windows Phone ランタイム インターフェイスとしてキャストし、XAML エンジンによってアクセスできるようにします。アプリを開発するときにこれらの実装の詳細について心配する必要はありません。ここでは情報提供のみを目的として説明しています。


IDrawingSurfaceContentProvider^ Direct3DInterop::CreateContentProvider()
{
	ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
	return reinterpret_cast<IDrawingSurfaceContentProvider^>(provider.Get());
}


次に、Direct3DInterop.cpp は、MainPage.xaml.cs の DrawingSurface_Loaded イベント ハンドラーから呼び出される SetManipulationHost(DrawingSurfaceManipulationHost) メソッドの実装を提供します。これにより、Direct3DInterop クラスは、DrawingSurface コントロールからタッチ入力イベントを受け取れるようになります。このテンプレートは、独自のコードを追加できるタッチ入力イベント用スタブアウト ハンドラーも提供します。


void Direct3DInterop::SetManipulationHost(DrawingSurfaceManipulationHost^ manipulationHost)
{
	manipulationHost->PointerPressed +=
		ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerPressed);

	manipulationHost->PointerMoved +=
		ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerMoved);

	manipulationHost->PointerReleased +=
		ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerReleased);
}



void Direct3DInterop::OnPointerPressed(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
	// Insert your code here.
}

void Direct3DInterop::OnPointerMoved(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
	// Insert your code here.
}

void Direct3DInterop::OnPointerReleased(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
	// Insert your code here.
}


次に、RenderResolution プロパティの setter が定義されます。レンダラー (後述) が存在する場合に、そのレンダラーが新しい解像度で更新されてから、RecreateSychronizedTexture が呼び出されて、新規サイズで同期テクスチャが再作成されることがわかります。


void Direct3DInterop::RenderResolution::set(Windows::Foundation::Size renderResolution)
{
	if (renderResolution.Width  != m_renderResolution.Width ||
		renderResolution.Height != m_renderResolution.Height)
	{
		m_renderResolution = renderResolution;

		if (m_renderer)
		{
			m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
			RecreateSynchronizedTexture();
		}
	}
}


次に、Direct3DInterop.cpp が Connect および Disconnect メソッドを定義します。Connect は、SetContentProvider(Object) の呼び出しが完了した後に呼び出されます。このメソッドでは、新しい CubeRenderer が作成され、その Initialize メソッドが呼び出されます。このときに、Direct3D グラフィック デバイスと同期テクスチャが初めて作成されます。この呼び出し中にさらに、CubeRenderer が頂点バッファーやシェーダーなどのデバイスに依存するリソースを作成します。なお、MainPage.xaml.cs で計算されたサイズがここで提供されるため、同期テクスチャは正しいサイズで作成されます。関連付けられた DrawingSurface コントロールが XAML ビジュアル ツリーから消去されるときに Disconnect が呼び出されます。


HRESULT Direct3DInterop::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host)
{
	m_renderer = ref new CubeRenderer();
	m_renderer->Initialize();
	m_renderer->UpdateForWindowSizeChange(WindowBounds.Width, WindowBounds.Height);
	m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);

	// Restart timer after renderer has finished initializing.
	m_timer->Reset();

	return S_OK;
}

void Direct3DInterop::Disconnect()
{
	m_renderer = nullptr;
}


テクスチャがレンダリングされる前に、フレームごとに PrepareResources メソッドが XAML エンジンによって呼び出されます。 アプリが DrawingSurface を使用して、UI 要素や現在アニメーション化されていない 3D シーンなど、フレームごとに変化しないアイテムを描画する場合は、同期テクスチャを複数のフレームでレンダリングせずに表示できます。これを行うには、PrepareResources でチェックを実行して、テクスチャをレンダリングする必要があるかどうかを判別し、レンダリングする必要がない場合は、contentDirty 変数を false に設定しますcontentDirty が false の場合、ファイルで次に定義されている GetTexture が、現在のフレームでは呼び出されません。


HRESULT Direct3DInterop::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty)
{
	*contentDirty = true;

	return S_OK;
}


Direct3DInterop クラスには、メソッド GetTexture の 2 つのオーバーロードがあります。最初のものは、CubeRenderer オブジェクトで Update および Render を呼び出します。これらのメソッドで、コードがゲームの状態を更新し、Direct3D を呼び出して、共有テクスチャを描画します。

XAML エンジンは、UI を更新するごとに、PrepareResources (上記) を呼び出します。RequestAdditionalFrame を呼び出すことで、現在のフレームの終了後にできるだけ早く UI を再描画するように XAML エンジンに指示します。RequestAdditionalFrame は、Connect を呼び出した後、Disconnectを呼び出す前に、Windows Phone ランタイム コンポーネントの任意の場所で呼び出すことができます。電力消費量を最小限に抑えるために、GetTexture から RequestAdditionalFrame の呼び出しを削除し、代わりに、再描画が必要なときにのみコードの他の場所から呼び出すようにします。静的コンテンツの描画の場合は、呼び出しの間隔を数秒空けることができます。また、アニメーション コンテンツの場合は、秒ごとに複数回呼び出すことができます。GetTexture 内から RequestAdditionalFrame を呼び出すと、可能な限り新しいフレームが継続的に要求され、描画サーフェイスで可能な最大フレームレートになります。


HRESULT Direct3DInterop::GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle)
{
	m_timer->Update();
	m_renderer->Update(m_timer->Total, m_timer->Delta);
	m_renderer->Render();

	RequestAdditionalFrame();

	return S_OK;
}


GetTexture の 2 つ目のオーバーロード (引数を取りません) は、DrawingSurface コントロールと Windows Phone ランタイム コンポーネントの間で共有される同期テクスチャへの参照を取得するために XAML エンジンによって呼び出されます。ほとんどの場合、このメソッドのコードを変更する必要はありません。


ID3D11Texture2D* Direct3DInterop::GetTexture()
{
	return m_renderer->GetTexture();
}


Direct3DBase.cpp

Direct3DBase は、Direct3D アプリ、Windows Phone、Windows 8 などで使用される多くの Direct3D プロジェクト テンプレートで使用されるクラスです。このクラスの実装は、XAML &amp; Direct3D アプリのテンプレートでは少々異なりますが、構造と機能はよく似ています。このクラスは、CreateDeviceResources を直ちに呼び出す Initialize メソッドを公開します。このメソッドは、D3D11CreateDevice を呼び出して Direct3D グラフィック デバイスを作成します。デバイスのスワップ チェーンは作成されないことに注意してください。これは、Windows Phone ランタイム が、画面に直接ではなく、同期テクスチャに描画するためです。このデバイスのスワップ チェーンは、XAML エンジンによって作成および保持され、同期テクスチャを画面に描画します。

このチュートリアルで前に説明したように、Direct3DBase は、DrawingSurface コンポーネントのサイズが設定されるときに呼び出される UpdateForWindowSizeChange メソッドおよび UpdateForRenderResolutionChange メソッドを公開します。UpdateForRenderResolutionChange は、同期テクスチャに関係するリソースを null に設定してから、それらを再作成する CreateWindowSizeDependentResources を呼び出します。これらのリソースには、同期テクスチャを表す ID3DTexture2D が含まれます。このテクスチャは、XAML エンジンと Windows Phone ランタイム コンポーネントで共有され、さらにテクスチャを描画するために必要なレンダリング ターゲット ビュー、深度ステンシル テクスチャ、ビューポートで共有されます。

CubeRenderer.cpp

CubeRenderer クラスは Direct3Dbase から継承します。このクラスは、共有テクスチャにキューブを描画するいくつかの Direct3D サンプル コードを提供します。このファイルもさまざまなプラットフォーム上の Direct3D テンプレートに共通です。Direct3D を初めて使用するときには、ある程度時間をかけてこのファイル内のコードを変更し、画面に描画される内容を変更したい場合もあります。最終的に自分のゲームに合わせて作成したクラスでこのクラスを置き換えることがよくありますが、基本的な構造は維持する必要があります。たとえば、Direct3DBase から自分のクラスを継承する必要があります。

CubeRenderer.cpp には、CreateDeviceResources のメソッドの定義が含まれています。このメソッドは最初に同じ名前の Direct3DBase メソッドを呼び出し、そこでグラフィック デバイスが作成されます。その呼び出しの後で、メソッドがデバイスに依存するリソースを作成することができます。テンプレート内のサンプル コードは、キューブのジオメトリを定義する頂点バッファーとインデックス バッファーを作成し、さらに共有テクスチャ上にキューブを描画する方法を定義する頂点シェーダーとピクセル シェーダーを作成します。

次に、CreateWindowSizeDependentResources メソッドが定義されます。これは、同じ名前の Direct3DBase クラスのメソッドを呼び出してから、DrawingSurface コントロールのサイズに基づいて、射影行列を作成します。

最終的に、CubeRenderer.cpp は、フレームごとに 1 回呼び出される Update メソッドと Render メソッドを実装します。Update では通常、ゲーム内のオブジェクトがフレームごとに新しい場所に更新されます。サンプル コードでは、ビューとモデルの行列が更新され、キューブが画面上で回転します。Render では、共有テクスチャに描画するための Direct3D 呼び出しが実行されます。このメソッドに含めるコードはゲームによって大きく異なりますが、レンダリングの前に、Direct3DBase で作成されたレンダリング ターゲット ビューにレンダー ターゲットが設定されることに注意する必要があります。この呼び出しは、後続の描画呼び出しにより、デバイスのバック バッファーやその他のレンダー ターゲットではなく、XAML エンジンと Windows Phone ランタイム コンポーネントで共有されたテクスチャに描画されることを意味します。


	m_d3dContext->OMSetRenderTargets(
		1,
		m_renderTargetView.GetAddressOf(),
		m_depthStencilView.Get()
		);


Direct3DContentProvider.cpp

Direct3DContentProvider.cpp は、XAML エンジンと Windows Phone ランタイム コンポーネントのフックの低レベルの詳細を処理します。ほとんどの場合、ゲームを実装するためにこの動作を変更する必要はないので、この動作はこのクラス内にカプセル化されました。

このクラスの GetTexture メソッドには、共有テクスチャの BeginDraw メソッドと EndDraw メソッドの呼び出しがある点に留意してください。これらの呼び出しは、テクスチャを描画できる期間を定義します。テクスチャは、スレッド間で同期されるので、このコード ブロックの前後にテクスチャを変更しようとすると失敗します。アプリのグラフィック デバイスを使用して引き続き、作成した他のテクスチャに描画することができますが、同期テクスチャに描画することはできません。


		hr = m_synchronizedTexture->BeginDraw();
		
		if (SUCCEEDED(hr))
		{
			hr = m_controller->GetTexture(size, synchronizedTexture, textureSubRectangle);
		}

		m_synchronizedTexture->EndDraw();


表示: