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 的类型对此大小无效 资源。

有人知道问题是什么吗?

XNA Texture2D GetData

基本上,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,您就可以了。可混合

实际上我的数据类型是Color,但我必须使用Bgra4444

。 要使用这种数据类型,我必须使用命名空间Microsoft.Xna.Framework.Graphics.PackedVector,然后创建一个Bgra4444数组并使用ToVector4((转换浮点向量(r,g,b,a(以使用数组的浮点向量。