【问题标题】:XNA Texture2D GetDataXNA Texture2D 获取数据
【发布时间】:2014-12-19 17:25:53
【问题描述】:

这是我从 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 的类型对此无效 资源。

有人知道是什么问题吗?

【问题讨论】:

    标签: c# xna


    【解决方案1】:

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

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

    如果你得到第一个,那可能是因为当你将它与GetData 一起使用时,depthTextureData 的值是 null。

    如果不是这样,你有没有尝试在调用方法时指定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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-14
        • 2013-07-10
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        相关资源
        最近更新 更多