Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SlimDX访问缓冲区数据_C#_Directx 11_Slimdx - Fatal编程技术网

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中实现了),但在笔记本电脑上也有缺陷。评论有点太短,无法给出详细的答案,请随意提问。