这是我从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的类型是无效的大小 资源。
有谁知道这是什么问题?
答案 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)以使用浮点数向量阵列。