[英]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>(...);
在該調用中,您指定類型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#代碼可能是將其轉換的最佳選擇。 根據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.