gpt4 book ai didi

c++ - 如何在DirectX 11中频繁更新顶点缓冲区数据?

转载 作者:行者123 更新时间:2023-12-02 10:23:37 25 4
gpt4 key购买 nike

我正在尝试使用dx中的map函数更新我的顶点缓冲区数据。虽然它确实会更新一次数据,但是如果我对其进行迭代,模型就会消失。我实际上是在尝试通过用户输入实时操纵顶点,并且这样做是要在选择顶点时每帧更新顶点缓冲区。

可能发生这种情况是因为Map函数禁用了GPU对顶点的访问,直到调用Unmap函数为止。因此,如果每帧访问都被阻止,则无法渲染网格是很有意义的。但是,当我每帧更新顶点,然后在一段时间后停止时,从理论上讲,网格应该再次出现,但事实并非如此。

我知道,每帧更新数据的正确方法是使用常量缓冲区,但是使用常量缓冲区操作顶点可能不是一个好主意。而且我认为没有其他方法可以更新顶点数据。我希望动态顶点缓冲区能够处理每一帧的更新。

    D3D11_MAPPED_SUBRESOURCE mappedResource;
ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE));

// Disable GPU access to the vertex buffer data.
pRenderer->GetDeviceContext()->Map(pVBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);

// Update the vertex buffer here.
memcpy((Vertex*)mappedResource.pData + index, pData, sizeof(Vertex));

// Reenable GPU access to the vertex buffer data.
pRenderer->GetDeviceContext()->Unmap(pVBuffer, 0);

最佳答案

由于已经解决了使用Discard的关键问题(这意味着您将无法从GPU检索内容),因此,我认为我会在选项方面添加一些内容。

我的问题是,您是需要性能还是在一个位置存储数据的便利?

您可以尝试几种配置。

  • 设置您的缓冲区以同时具有CPU读取和写入访问权限。但是,这意味着您将在总线上上下推缓冲器。最后,它还会在GPU上引起性能问题,例如阻塞等(等待数据移回到GPU上)。我个人不在编辑器中使用它。
  • 如果不是内存问题,请在CPU端设置缓冲区的副本,使用Discard设置每个帧的映射,并跨块复制数据。这是高性能的,但也会占用大量内存。显然,您必须管理将数据分区和索引到该空间中。我不使用它,但是我玩弄了,太费力了!
  • 咬住子弹,按照2映射到缓冲区,然后将每个顶点对象写入映射的缓冲区。我这样做,除非缓冲区变得巨大,否则我自己的编辑器中就不会出现问题。
  • 使用计算机着色器更新缓冲区,创建资源 View 和访问 View ,并通过恒定缓冲区传递更新。大锤破墙的位。而且仍然没有停止这一事实,您可能需要按照第1项将数据从GPU ala中撤回。

  • 管理缓冲区有一些变化,例如,您还可以尝试进行交错处理(2个副本,一个副本在GPU上,另一个副本正在写入)。有一些相当华丽的机制,例如在另一个线程中构建缓冲区的内容,然后标记更新。

    归根结底,DX 11无法提供(有人可能会更好地了解)直接编辑GPU内存中的数据的功能,CPU和GPU之间有很多转换。

    祝您选择哪种技术都好运。

    关于c++ - 如何在DirectX 11中频繁更新顶点缓冲区数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57285751/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com