簡體   English   中英

XNA Texture2D GetData

[英]XNA Texture2D GetData

這是我從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);上收到錯誤 它說:

Microsoft.Xna.Framework.Graphics.dll中發生了類型為'System.ArgumentException'的未處理異常。其他信息:您在此方法中用於T的類型對該資源來說是無效的大小。

有人知道這是什么問題嗎?

基本上, GetData方法要求一個數組來接收數據。

根據MSDN,此方法可以引發兩個不同的異常: ArgumentNullException和/或InvalidOperationException

如果您正在獲取第一個,則可能是因為在與GetData一起使用時, depthTextureData值為null。

如果不是這種情況,是否在調用方法時嘗試指定T的類型,如Microsoft文檔中所示?

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

在該調用中,您指定類型TColor ,然后使用最喜歡的重載傳遞它的實例。

如果您仍然無法解決問題,則可能需要查看格式類型(有關問題的完整說明,請參見此處的答案):

以下是可能的格式類型。

您將必須檢查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#代碼可能是將其轉換的最佳選擇。 根據Wikipedia的介紹,16個像素存儲在8個字節中,這使得每個像素有一個字節,因此從理論上講byte[] data = new byte[(Width * Height) / 2]應該可以提取數據。

Dxt1
Dxt3
Dxt5

這是一種特殊情況,只需使用HalfVector4作為類型,就可以了。 HdrBlendable

實際上我的數據類型是Color,但是我必須使用Bgra4444。 要使用此數據類型,我必須使用命名空間Microsoft.Xna.Framework.Graphics.PackedVector,然后制作Bgra4444數組,並使用ToVector4()轉換浮點向量(r,g,b,a)以使用浮點向量陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM