SlimDX Access Buffer数据

时间:2015-05-07 15:25:39

标签: directx-11 slimdx

我有一个带有一些顶点数据的缓冲区。我需要能够访问此Buffer中的数据以从中提取单个顶点。我想这样做:

Surface surface = mBuffer.AsSurface();
DataRectangle data = surface.Map(MapFlags.Read);

但是这会返回一个异常,说“将无效参数传递给返回函数”。我也尝试使用MapFlags.Write和MapFlags.Discard。没有区别。

这适用于DirectX11。

1 个答案:

答案 0 :(得分:0)

我认为您使用Dynamic / Default或Immutable标志创建缓冲区。 这些缓冲区无法直接从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);
相关问题