3

一度だけレンダリングされ、その後無期限に使用されるレンダー ターゲットに依存するアプリケーションを XNA で作成しています。私が遭遇した問題は、コンピューターがスリープ状態になったときやアプリケーションがフルスクリーン モードになったときなど、レンダー ターゲットのコンテンツが失われたり破棄されたりする特定の状況があることです。

コンテンツが失われたときに各ターゲットに再レンダリングすることはオプションですが、多くのターゲットがある場合はかなりコストがかかる可能性があるため、最適なオプションではない可能性があります。

おそらく、それぞれの結果を PNG 画像として保存し、その PNG をテクスチャとしてロードすることもできますが、これには多くの I/O オーバーヘッドが追加されます。

提案?

4

2 に答える 2

4

これまでに見つけた最も可能性の高いオプションは、を使用GetData()してから新しいSetData()にコピーすることですRenderTarget2DTexture2D.

ミップ マップされたテクスチャが必要なので、各ミップ レベルを個別に新しいテクスチャにコピーする必要があることがわかりました。これを行わないと、ミップ マップにデータがないため、オブジェクトから離れるとオブジェクトが黒くなります。レンダー ターゲットもミップ マップする必要があることに注意してください。

Texture2D copy = new Texture2D(graphicsDevice,
    renderTarget.Width, renderTarget.Height, true,
    renderTarget.Format);

// Set data for each mip map level
for (int i = 0; i < renderTarget.LevelCount; i++)
{
    // calculate the dimensions of the mip level.
    // Math.Max because dimensions always non-zero
    int width = (int)Math.Max((renderTarget.Width / Math.Pow(2, i)), 1);
    int height = (int)Math.Max((renderTarget.Height / Math.Pow(2, i)), 1);

    Color[] data = new Color[width * height];

    renderTarget.GetData<Color>(i, null, data, 0, data.Length);
    copy.SetData<Color>(i, null, data, 0, data.Length);
}
于 2011-08-06T13:44:49.013 に答える
1

私は信じている

Presetnationparameters pp = graphics.PresentationParameters;
pp.RenderTargetUsage = RenderTargetUsage.PreserveContents;

トリックを行う必要があります。これは、シェーダーモデルが PC と Xbox でどのように機能するか、およびシェーダーモデル 2+ でどのように同等になったかに関係しています。(Xbox がデフォルトで出力バッファを上書きしているため、古いレンダー ターゲットはクリアされますが、PC は他のメモリを使用するだけです)

于 2013-10-26T13:34:03.790 に答える