XNA Texture2D GetData
本文关键字:GetData Texture2D XNA | 更新日期: 2023-09-27 18:34:37
这是我从 Kinect 的 depthFrame 创建 Texture2D 的代码:
private short[] depthData;
private Texture2D depthTexture;
Color[] depthTextureData;
if (null == this.depthData || this.depthData.Length != frame.PixelDataLength)
{
this.depthData = new short[frame.PixelDataLength];
this.depthTexture = new Texture2D(
this.GraphicsDevice,
frame.Width,
frame.Height,
false,
SurfaceFormat.Bgra4444);
this.backBuffer = new RenderTarget2D(
this.GraphicsDevice,
frame.Width,
frame.Height,
false,
SurfaceFormat.Color,
DepthFormat.None,
this.GraphicsDevice.PresentationParameters.MultiSampleCount,
RenderTargetUsage.PreserveContents);
}
frame.CopyPixelDataTo(this.depthData);
depthTextureData = new Color[frame.Width * frame.Height];
depthTexture.GetData(depthTextureData);
我在depthTexture.GetData(depthTextureData);
上收到一个错误,它说:
类型为"System.ArgumentException"的未处理异常发生在 Microsoft.Xna.Framework.Graphics.dll 附加信息: 在此方法中用于 T 的类型对此大小无效 资源。
有人知道问题是什么吗?
基本上,GetData 方法要求一个数组来接收数据。
根据 MSDN,此方法可以引发两个不同的异常:ArgumentNullException 和/或 InvalidOperationException。
如果您获得第一个,则可能是因为当您将其与 GetData
一起使用时,depthTextureData
的值为 null。
如果不是这种情况,您是否尝试在调用该方法时指定T
的类型,如 Microsoft 文档所示?
backBufferData.GetData<Color>(...);
在该调用中,您指定类型 T
将是一个 Color
,然后使用您最喜欢的重载传递它的实例。
如果您仍然无法解决问题,您可能需要查看格式类型(问题的完整解释,答案可以在这里找到(:
以下是可能的格式类型。
您将必须检查texture.Format
并为其SurfaceFormat
使用正确的数据结构。
例如。
var b = new Bgr565[result.Width * result.Height];
tex.SetData(b);
以下SurfaceFormat
具有可以使用的相应值类型。
Color
Bgr565
Bgra5551
Bgra4444
NormalizedByte2
NormalizedByte4
Rgba1010102
Rg32
Rgba64
Alpha8
Single
Vector2
Vector4
HalfSingle
HalfVector2
HalfVector4
Dxt
格式意味着纹理被压缩,您需要知道压缩后的大小,获取数据,然后解压缩。
您可以在某处找到 DXT1 和 DXT5 解压缩库。不幸的是,我找不到任何托管的东西,所以不安全的 C# 代码可能是转换它的最佳选择。根据维基百科,16 个像素存储在 8 个字节中,这使得每个像素有一个字节,因此理论上byte[] data = new byte[(Width * Height) / 2]
应该用于提取数据。
Dxt1
Dxt3
Dxt5
这是一个特例,只需对类型使用 HalfVector4
,您就可以了。可混合
。 要使用这种数据类型,我必须使用命名空间Microsoft.Xna.Framework.Graphics.PackedVector,然后创建一个Bgra4444数组并使用ToVector4((转换浮点向量(r,g,b,a(以使用数组的浮点向量。