0

我正在尝试将在 XNA 中渲染的图像保存到磁盘。这实际上很容易,但更重要的是我需要每个通道的完整 32 位浮点精度,而不仅仅是 0-255 范围。

我一直在研究使用纹理打包(将浮点数转换为 4 分量 ARGB),但我担心这样会失去精度。我需要非常高的准确性。

我正在研究的另一种方法是使用着色器并将浮点分量与 2147483647(最大正整数)相乘,然后遍历每个位并在渲染图像中存储二进制 0 或 1。以后可以用常规代码重新组合每个图像,以重建全精度浮点数。这可行,但问题是,着色器模型 3.0 似乎不能正确支持 32 位 int。通过这种方式,我得到的只是 24 位精度。

有没有办法以更直接和准确的方式做到这一点?

4

1 回答 1

0

既然您说您的四个通道中的每一个都使用 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 回答