C# SlimDX访问缓冲区数据
我有一个带有一些顶点数据的缓冲区。我需要能够访问该缓冲区中的数据,以便从中提取单个顶点。我试着这样做:C# SlimDX访问缓冲区数据,c#,directx-11,slimdx,C#,Directx 11,Slimdx,我有一个带有一些顶点数据的缓冲区。我需要能够访问该缓冲区中的数据,以便从中提取单个顶点。我试着这样做: Surface surface = mBuffer.AsSurface(); DataRectangle data = surface.Map(MapFlags.Read); 但这会返回一个异常,即 传递给返回函数的参数无效 我也尝试过使用MapFlags.Write和MapFlags.Discard。没有区别 这是针对DirectX11的。我假设您的缓冲区是使用动态/默认或不可变标志创建的
Surface surface = mBuffer.AsSurface();
DataRectangle data = surface.Map(MapFlags.Read);
但这会返回一个异常,即
传递给返回函数的参数无效
我也尝试过使用MapFlags.Write
和MapFlags.Discard
。没有区别
这是针对DirectX11的。我假设您的缓冲区是使用动态/默认或不可变标志创建的。 这些缓冲区不能直接从CPU读取 要实现这一点,您需要创建一个暂存缓冲区,该缓冲区的大小与其他缓冲区的大小相同
BufferDescription bd = new BufferDescription()
{
BindFlags = BindFlags.None,
CpuAccessFlags = CpuAccessFlags.Read | CpuAccessFlags.Write,
OptionFlags = ResourceOptionFlags.None,
SizeInBytes = size, //Size must be same as your other buffer
Usage = ResourceUsage.Staging,
};
然后需要使用deviceContext将顶点缓冲区复制到暂存缓冲区
deviceContext.CopyResource(yourVertexBuffer, yourStagingBuffer);
现在,您可以映射暂存缓冲区并使用以下方法读取数据:
DataStream ds = deviceContext.MapSubresource(yourStagingBuffer, MapMode.Read, MapFlags.None).Data;
//Do something with your datastream
//don't forget to unmap
deviceContext.UnmapSubresource(yourStagingBuffer, 0);
你的评论总是很有帮助的。我也面临着类似的问题。我试图复制屏幕的一部分作为纹理。我希望可以先跳过将其复制到位图。有什么想法吗?@JeroenvanLangen您有输出复制API不确定这是否在SlimDX中实现(在SharpDX中实现了),但在笔记本电脑上也有缺陷。评论有点太短,无法给出详细的答案,请随意提问。