0

XNA でレンダリングされた画像をディスクに保存しようとしています。これは実際には非常に簡単ですが、キッカーは、0 ~ 255 の範囲だけでなく、各チャネルに完全な 32 ビット浮動小数点精度が必要なことです。

テクスチャ パッキング (float を 4 コンポーネント ARGB に変換する) の使用を検討していますが、この方法では精度が失われるのではないかと心配しています。非常に高い精度が必要です。

私が調べていた別の方法は、シェーダーを使用し、float コンポーネントを 2147483647 (最大正の整数) で乗算し、各ビットを調べて、レンダリングされた画像にバイナリ 0 または 1 を格納することです。各画像は、後で通常のコードで再構築して、完全な精度の float を再構築できます。これは機能しますが、問題は、シェーダー モデル 3.0 が 32 ビットの int を適切にサポートしていないように見えることです。この方法で得られるのは24ビットの精度だけです。

より直接的かつ正確な方法でこれを行う方法はありますか?

4

1 に答える 1

0

4 つのチャネルのそれぞれに 32 ビット精度を使用しているとのことなので、テクスチャが を使用していると思います。SurfaceFormat.Vector4これは、私が知る限り、XNA でサポートされている唯一の 128 ビット テクスチャ フォーマットです。その場合、レンダリングしたテクスチャから実際のデータを取得するのは簡単です。

var tex = new Texture2D(GraphicsDevice, 1024, 1024, false, SurfaceFormat.Vector4);
var data = new Vector4[1024 * 1024];
tex.GetData<Vector4>(data);

dataあとは、後で読み取ることができるファイルに配列を保存するためのコードを記述するだけです。これは簡単です。次に、テクスチャを再構成できます。

Vector4[] data = LoadMyData();
tex.SetData(data);
于 2012-07-02T20:20:37.330 に答える