我正在尝试将在XNA中呈现的图像保存到磁盘。这实际上非常简单,但是我需要为每个通道提供完整的32位浮点精度,而不仅仅是0-255范围。
我一直在研究使用纹理打包(将浮动转换为4组件ARGB),但我担心我会以这种方式失去精度。我需要非常高的准确度。
我正在研究的另一种方法是使用着色器并将float组件与2147483647(max positive int)相乘,然后遍历每个位并在渲染图像中存储二进制0或1。之后可以在常规代码中重新组合每个图像以重建完整精度浮点数。这是有效的,但问题是,着色器模型3.0似乎不能正确支持32位int。我得到的只是24位精度。
有没有办法以更直接和准确的方式做到这一点?
答案 0 :(得分:0)
既然你说你的四个通道都使用了32位精度,我假设你的纹理使用SurfaceFormat.Vector4
,这是 - 据我所知 - 只有128 XNA支持的位纹理格式。在这种情况下,从您渲染的纹理中检索实际数据非常容易:
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);