【问题标题】:SlimDX Access Buffer dataSlimDX 访问缓冲区数据
【发布时间】:2015-05-07 15:25:39
【问题描述】:

我有一个包含一些顶点数据的缓冲区。我需要能够访问此缓冲区中的数据以从中提取单个顶点。我正在尝试这样做:

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

但是这会返回一个异常说

一个无效的参数被传递给返回函数。

我也尝试过使用MapFlags.WriteMapFlags.Discard。没有区别。

这是针对 DirectX11 的。

【问题讨论】:

    标签: c# directx-11 slimdx


    【解决方案1】:

    我想您的缓冲区是使用动态/默认或不可变标志创建的。 这些缓冲区不能直接从 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);
    

    【讨论】:

    • 您的 cmets 总是很有帮助的。我面临着类似的问题。我正在尝试将屏幕的(一部分)复制为纹理。我希望我可以跳过先将其复制到位图。有什么想法吗?
    • @JeroenvanLangen 你有输出重复 API msdn.microsoft.com/en-us/library/windows/desktop/… 不确定这是否在 SlimDX 中实现(在 SharpDX 中实现),但它在笔记本电脑上也有问题)。评论有点太短,无法详细回答,请随时提问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2012-10-25
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多