8

texture2dをデバイス レンダー ターゲットとして設定します。描画後、レンダー ターゲットからピクセルを直接読み書きし、それを表示するにはどうすればよいですか。

4

1 に答える 1

13

別のシェーダーへの入力として使用する場合: - D3D11_BIND_RENDER_TARGET および D3D11_BIND_SHADER_RESOURCE を使用して texture2D を作成したことを確認します。

  • テクスチャをレンダー ターゲットとしてバインドし、レンダリングします。
  • レンダー ターゲットとしてアンバインドし、シェーダー リソースとしてバインドして、次のシェーダーで使用します。
  • テクスチャをターゲットとリソースとして同時にバインドすることはできないことに注意してください。

C++ をピクセルの配列として使用して CPU 上のテクスチャにアクセスすることが意図されている場合は、いくつかの作業を行う必要があります。残念ながら、現在の GPU アーキテクチャでは、texture2D のピクセルに直接アクセスすることはできません。これは、ピクセルが実際には特別な形式 (swizzled 形式) で GPU メモリの可能性に存在するためです。

  • GPU がレンダリングできるテクスチャを作成します。
  • GPU の出力を受け取るために使用されるステージング テクスチャ (D3D11_USAGE_STAGING) を作成します。
  • GPU テクスチャにレンダリングします。
  • ID3D11DeviceContext::CopyResource() または ID3D11DeviceContext::CopySubresource() を発行します。
  • ステージング リソースで ID3D11DeviceContext::Map() を呼び出して、ピクセルにアクセスします。
  • ステージング リソースで ID3D11DeviceContext::Unmap() を呼び出します。
  • ID3D11DeviceContext::UpdateSubresource() を呼び出して、GPU が持つリソースのバージョンを更新します。

ご覧のとおり、これは確かに簡単な一連の操作ではなく、今日の GPU アーキテクチャが実行するように最適化されていることに反します。私は確かにそれをお勧めしません。

この道をたどる場合は、GPU メモリ リードバックに伴うパフォーマンスに関するすべての懸念事項についても必ずお読みください。 =vs.85).aspx#Performance_Considerations

于 2013-02-20T13:27:20.500 に答える