4

SpriteBatch.BeginRenderTargets をとの間で変更したいと思いSpriteBatch.Endます。私はすでにこれが機能することを知っています:

GraphicsDevice.SetRenderTarget(target1);
SpriteBatch.Begin()
SpriteBatch.Draw(...)
SpriteBatch.End()
GraphicsDevice.SetRenderTarget(target2);
SpriteBatch.Begin()
Spritebatch.Draw(...)
SPriteBatch.End()

しかし、私は本当にこれを機能させたいです:

SpriteBatch.Begin()
GraphicsDevice.SetRenderTarget(target1);
SpriteBatch.Draw(...)
GraphicsDevice.SetRenderTarget(target2);
Spritebatch.Draw(...)
SpriteBatch.End()

誰かがこれをしているのを見たことがありますが、その理由はわかりませんでした。

編集:なぜ私がこれをやりたいのかについてもう少し:

私のプロジェクトでは、SpriteSortMode.Immediate (必要に応じて BlendState を変更できるようにするため) を使用し、並べ替えられたスプライトのリストを単純に反復処理して、それらすべてを描画します。しかし今、いくつかのスプライトにマルチパスシェーダーを適用したいのですが、すべてではありません! 私はシェーダーにはまったく慣れていませんが、私が理解したことから、最初のパスを使用して中間スプライトにスプライトを描画し、2 番目のパスを使用して最終レンダー ターゲットに中間スプライトを描画する必要があります。(ガウスぼかしピクセルシェーダーを使用しています)。そのため、新しい開始/終了を作成することなく、目的のシェーダーを使用して、目的のターゲットに描画したいと考えています。

4

1 に答える 1

3

問題は、なぜそこでレンダー ターゲットを変更したいのかということです。

レンダー ターゲット (またはその他のレンダー ステート) が変更されたときにバッチを分割する必要があるため、パフォーマンスが向上することはありません。

SpriteBatch は、SpriteSortMode.Texture使用時のテクスチャなど、共通の属性によってスプライトをグループ化しようとします。つまり、テクスチャを共有するスプライトは、同じ描画呼び出し(バッチ) で描画されます。バッチを少なくすると、パフォーマンスが向上する可能性があります。ただし、描画呼び出し中に GPU の状態を変更することはできません。そのため、レンダー ターゲットを変更すると、とにかく 2 つの描画呼び出しを使用することになります。

したがって、2 番目の例が機能する場合でも、バッチの数は同じになります。

于 2013-03-01T16:04:07.720 に答える