XNA Texture2D GetData

时间:2014-12-19 04:06:07

标签: c# xna

这是我从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其他信息:The   您在此方法中使用T的类型是无效的大小   资源。

有谁知道这是什么问题?

2 个答案:

答案 0 :(得分:2)

基本上,GetData方法要求数组接收数据。

根据MSDN,此方法可以抛出两个不同的例外:ArgumentNullException和/或InvalidOperationException

如果您要获得第一个,可能是因为depthTextureData的值在您使用GetData时为空。

如果不是这种情况,您是否尝试在调用方法时指定T的类型,如microsoft documentation所示?

backBufferData.GetData<Color>(...);

在该调用中,您指定类型T将是Color,然后使用您最喜欢的任何重载来传递它的实例。

如果仍然无法解决问题,您可能需要查看格式类型(问题的完整说明,可以找到答案here):

Here是可能的格式类型。

您必须检查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类型,你就可以了。 HdrBlendable

答案 1 :(得分:1)

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