我有一个带有一些顶点数据的缓冲区。我需要能够访问此Buffer中的数据以从中提取单个顶点。我想这样做:
Surface surface = mBuffer.AsSurface();
DataRectangle data = surface.Map(MapFlags.Read);
但是这会返回一个异常,说“将无效参数传递给返回函数”。我也尝试使用MapFlags.Write和MapFlags.Discard。没有区别。
这适用于DirectX11。
答案 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);