4

現在、Direct2D を使用してリアルタイム画像処理を行う Windows ストア用のアプリケーションを開発しています。さまざまなサイズの画像をサポートする必要があります。私が直面した最初の問題は、画像がサポートされている最大テクスチャ サイズよりも大きい場合の状況をどのように処理するかということです。いくつかの調査とドキュメントを読んだ後、解決策として VirtualSurfaceImageSource を見つけました。イメージを IWICBitmap としてロードしてから、CreateWICBitmapRenderTarget でレンダー ターゲットを作成するというアイデアでした (私の知る限り、これはハードウェア アクセラレーションではありません)。いくつかの描画操作の後、VirtualSurfaceImage ソース内の対応する領域を無効にするか、NeedUpdate コールバックが発生したときに結果を画面に表示したいと考えました。ID2D1Bitmap を作成し (ハードウェア アクセラレーション)、CreateWICBitmapRenderTarget で作成したレンダー ターゲットと無効化した領域を境界として CopyFromRenderTarget を呼び出すことで可能だと思っていたのですが、メソッドは結果として D2DERR_WRONG_RESOURCE_DOMAIN を返します。IWICBitmap を使用するもう 1 つの理由は、画像のピクセルを更新するためにアクセスする必要があるアプリケーションに関連するアルゴリズムの 1 つです。

問題は、なぜこのロジックが機能しないのかということです。これは、Direct2D を使用して私の目標を達成する正しい方法ですか? また、CreateWICBitmapRenderTarget で作成されたレンダー ターゲットがハードウェア アクセラレーションされていない限り、最大許容テクスチャ サイズよりも大きい画像を GPU で処理したい場合、これが最適なソリューションですか?

前もって感謝します。

4

1 に答える 1

3

テクスチャの制限を超える画像はソフトウェアで処理する必要があることは正しいです。

ただし、レンダリングするたびにそのイメージ全体が必要かどうかという問題があります。

ハードウェア アクセラレータを使用して、ソフトウェア ターゲットにロードされた大きなイメージの一部をレンダリングできます。

例えば、

  • ID2D1RenderTarget::CreateSharedBitmap を使用して、さまざまなリソースで使用できるビットマップを作成します。
  • 次に、ID2D1BitmapRenderTarget を作成し、それに大きなビットマップをレンダリングします。(必ず BeginDraw、Clear、DrawBitmap、EndDraw を実行してください)。ビットマップとレンダー ターゲットの両方をキャッシュして、連続する呼び出しで使用できます。
  • 次に、そのレンダー ターゲットから、ID2D1Bitmap::CopyFromRenderTarget メソッドを使用して、テクスチャ メモリに収まる部分を含む通常の ID2D1Bitmap にコピーします。
  • 最後に、それを実際のレンダー ターゲットに描画します。pRT->DrawBitmap
于 2013-07-04T11:57:40.263 に答える