1

私の問題は、2つの異なるRenderTarget2Dを画面に描画しようとしていますが、最後に描画されたものだけが表示されることです。Drawコードは次のようになり、メソッドで描画する必要があるクラスの各インスタンスによって1回ずつ、2回呼び出されます。

public override void Draw()
{
  gfxDevice.SetRenderTarget(myRenderTarget);
  gfxDevice.Clear(Thistle);

  //pseudocode
  foreach (something in a list)
  { spritebatch.begin();
    spritebatch.DrawString(something);
    spritebatch.end();
  }

  //reset to the backbuffer 
  gfxDevice.SetRenderTarget(null);
  gfxDevice.Clear(backgroundColor)  //Here is what I thought the offending line was


  //draw the RenderTarget to backbuffer
  spriteBatch.Begin();
  spriteBatch.Draw(myRenderTarget, rect, this.backgroundColor);
  spriteBatch.End();

私が解決策だと思ったのはgraphicsDevice、メソッドが呼び出されるたびにクリアを停止するDraw()ことですが、そうしないと、新しく描画されたrendertarget以外はすべて醜い紫色に描画されます。このような:ここに画像の説明を入力してください

紫色は、この質問End()のおかげで、スプライトバッチを実行した結果だと思います

両方のRenderTargetが適切に描画されるようにするには、何を変更する必要がありますか?つまり、両方のウィジェットが適切なColor.Thistle背景とともに描画されますか?

これ理想的には、画面は次と両方の組み合わせのように見えます。これ

4

1 に答える 1

5

gfxDevice.Clear(backgroundColor)呼び出しを削除する必要があるのは正しいです。バックバッファに描画してからバックバッファをクリアすると、明らかに、クリアする前に描画したものは表示されません。

何かをレンダリングする前に、つまりフレームの先頭で、バックバッファをクリアしたいとします。

編集

提供されているソースコードを詳しく調べた後、ここで実際に何が起こっているのかがわかったと思います。これは、レンダーターゲットを使用する際の注意点の1つです。

あなたが見ている奇妙な紫色は、実際には、によって引き起こされたものではありませんSpriteBatch.End()。これは、XNAがメモリをリセットしたときに、レンダリングターゲットが自動的にクリアされる色です。

XNAはいつレンダーターゲットのメモリをクリアしますか? そのレンダリングターゲットがアクティブターゲットとしてグラフィックスデバイスに設定されているときはいつでも。 したがって、を呼び出すたびにSetRenderTarget(null)、XNAはバックバッファのメモリを消去し、それをその素敵な紫色にリセットします。

これを回避するには、バックバッファに何かを描画する前に、すべてのレンダリングターゲットを描画する必要があります。次に、バックバッファをアクティブなレンダーターゲットとして設定し、以前に更新したすべてのレンダーターゲットを1回のパスで描画します。

于 2012-08-24T16:47:12.937 に答える