2011-08-06 4 views
3

XNAでアプリケーションを作成しています。このアプリケーションは、レンダリングターゲットが一度だけレンダリングされた後、無期限に使用されます。私が遭遇した問題は、コンピュータがスリープ状態になるかアプリケーションがフルスクリーンモードに入るなど、レンダーターゲットのコンテンツが失われたり廃棄されたりする状況があることです。レンダーターゲットの結果を非揮発性に保つにはどうしたらいいですか?

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

おそらく各結果をPNGイメージとして保存し、そのPNGをテクスチャとしてバックアップすることはできますが、多くのI/Oオーバーヘッドが追加されます。

提案?私がこれまでに見つけた

答えて

4

ほとんどのオプションは、私がMIPはテクスチャをマッピングしたいので新しいTexture2D.

RenderTarget2DからコピーするGetData()SetData()を使用することです、私は、各ミップレベルをコピーするために持っていたことが分かりましたそのように新しいテクスチャに個別にこれをしないと、オブジェクトはミップマップにデータがないので、離れていくと黒くなります。レンダーターゲットは、ミップマッピングされている必要があります。

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); 
} 
+0

RenderTargetsは暗黙的にTexture2Dに変換されませんか?同様に、Texture2D tex = myRenderTargetはうまくいくはずです。いずれにせよ、SetData()は高価なプロセスです。 –

+0

私が質問したように、ここでの目標は、フルスクリーンになるなど、RenderTarget2Dsが失われるため、無期限に使用できる不揮発性の「Texture2D」を得ることです。 –

+0

+1、これは私が与えた答えです。 @ A型の 'SetData'は、それをフレームごとに行うのは高価です。しかし、ロード時にそれほど悪くはありません。 –

1

私は

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

はトリックを行うべきだと考えています。 ShadermodelがPCとXboxでどのように動作するのか、Shadermodel 2+がどのように同等になったのかが関係しています。 (Xboxはデフォルトで出力バッファを上書きするので、古いレンダリングターゲットはクリアされますが、PCは他のメモリを使用します)

関連する問題