2012-01-19 10 views
2

私はシェーダの周りをXNAの2Dで囲んでいます。このリンク私が遅延レンダリング(SpriteSortMode.BackToFront)に依存している視差システムを開発してきたので、私にとっては問題であるSpriteSortMode.Immediateを、使用する必要があると述べた上でXNA 2DシェーダとSpriteSortMode

http://msdn.microsoft.com/en-us/library/bb313868(v=xnagamestudio.31).aspx

SpriteSortModeの重要性を、シェイダーで説明することができますか?Immediateが必須か、自分の現在のシステムを維持するために何ができるか、そして一般的に何かを理解するのに役立ちますか?

さらに、私のゲームは、複数のSpriteBatch.Begin()/ End()コール(バックグラウンド描画、ゲーム、フォアグラウンド、HUDなど)を実行します。私はブルームの例がそのような場合にはうまくいかないことに気がつきました。私はそれがこれと何か関係があると推測しています。

一般的に、私はこれらの概念を理解するのに苦労しています。私はシェーダが何であるか、どのように機能しているかを知っていますが、XNAとのやりとりの仕方や何が起こっているのか分かりません。私は本当に啓発に感謝します。 :)

ありがとうございます!

+0

この質問からの回答は、いくつかの助けになるかもしれません:http://gamedev.stackexchange.com/questions/21220/how-exactly-does-xnas-spritebatch-work –

+0

シェイダーを適用したい場合は、 Immediateレンダリングを使用する必要はありませんが、スプライトごとのエフェクトとして必要な場合は、それを行います。 –

答えて

1

ソートモードは、レイヤードトランスペアレントレンダリングやデプスバッファを使用するような単純な操作を実行しようとすると問題になります。私はあなたがそれを達成するためにピクセルシェーダを使いたいので、何か自明ではないと思っています。

SpriteSortMode.Immediateは、ドローコールの順番どおりに物を描画します。別のモードを使用する場合、可能であればSpriteBatchはテクスチャで描画カードをビデオカードにグループ化します。これはパフォーマンス上の理由によるものです。

SpriteBatch.Beginに電話するたびに、新しいピクセルシェーダーを適用し、以前に設定したシェーダーを破棄することに注意してください。新しいスプライトがTintのカラーを適用するSpriteBatchの標準ピクセルシェーダであっても、SpriteBatch.Endを呼び出すと、現在のSpriteBatchコマンドをすべて実行するようにビデオカードに指示していることに注意してください。

これは、空想的なピクセルシェーダーの範囲が限定されている場合、既存のソート方法を維持できる可能性があることを意味します。言い換えれば、1つのEffectで背景を描画し、次に前景と文字を別のもので描画します。 SpriteBatchへの各Begin/End呼び出しは個別に扱うことができます。

Effect(熱波やブルームなど)を画面のすべてに適用することを目標にする場合は、別の方法もあります。ビデオカードのバックバッファに直接ではなく、作成するRenderTargetにすべてのグラフィックスをレンダリングすることができます。これを行う場合、レンダリングセクションの最後にGraphicsDevice.SetRenderTarget(null)と呼び出して、シーン全体に適用されるカスタムシェーダーを使用して完成したイメージをバックバッファーにペイントすることができます。

0

スプライトソートモードがシェーダーに与える影響を100%確信しているわけではありませんが、シェーダーを使用していたものに応じて変化すると思います。

複数の開始点と終了点を使用している場合は、Bloomを使用してください(できるだけ最小化したい場合)。レンダリングターゲットをスクリーンのサイズで作成し、現在のようにすべてを描画することができます。最後に、そのレンダリングターゲットを(graphicsdevice.SetRenderTarget(null);を使用して)取り込み、ブルームシェイダーでフルスクリーンレンダリングターゲット(0,0の位置)を描画します。さまざまなソートモードを使用してシーンのコンポーネントの

関連する問題