gpt4 book ai didi

directx - 如何从 Direct3d11 中的顶点缓冲区读取顶点

转载 作者:行者123 更新时间:2023-12-01 09:00:48 33 4
gpt4 key购买 nike

我有一个关于顶点缓冲区的问题。如何从 D3D11 中的顶点缓冲区读取顶点?我想得到一个特定顶点的位置进行计算,如果这种方法是错误的,人们会怎么做?以下代码(显然)不起作用。

VERTEX* vert;
D3D11_MAPPED_SUBRESOURCE ms;
devcon->Map(pVBufferSphere, NULL, D3D11_MAP_READ, NULL, &ms);
vert = (VERTEX*) ms.pData;
devcon->Unmap(pVBufferSphere, NULL);

谢谢。

最佳答案

您的代码错误的地方:

  • 你要求 GPU 给你一个内存地址(Map()),
  • 存储此地址 ( operator=() ),
  • 然后说:“谢谢,我不再需要它了”( Unmap() )。

  • 取消映射后,您无法真正说出指针现在指向的位置。它可以指向已经分配了其他东西的内存位置或你女 friend 的笔记本电脑的内存(开玩笑=))。
    您必须复制数据(全部或部分),而不是介于 Map() 之间的指针 Unmap() : 使用 memcopy, for循环,任何东西。放入数组, std::vector ,BST,应有尽有。

    新手可能会在这里犯的典型错误:
  • 不查HRESULT来自 ID3D11DeviceContext::Map 的返回值方法。如果 map 失败,它可以返回它喜欢的任何指针。取消引用此类指针会导致未定义的行为。因此,最好检查任何 DirectX 函数返回值。
  • 不检查 D3D11 调试输出。它可以用通俗易懂的英语清楚地说出问题所在以及该怎么做(显然比我的英语好 =))。因此,您几乎可以立即修复错误。
  • 您只能阅读 ID3D11Buffer如果是 created D3D11_CPU_ACCESS_READ CPU 访问标志,这意味着您还必须设置 D3D11_USAGE_STAGING 用法标记。

  • 我们通常如何从缓冲区读取:
  • 我们不使用暂存缓冲区进行渲染/计算:它很慢。
  • 相反,我们从主缓冲区(非暂存且 CPU 不可读取)复制到暂存缓冲区( ID3D11DeviceContext::CopyResource() ID3D11DeviceContext::CopySubresourceRegion() ),然后将数据复制到系统内存( memcopy() )。
  • 我们在发布版本中不会这样做太多,它会损害性能。
  • 暂存缓冲区有两种主要的实际用途:调试(查看缓冲区是否包含错误数据并修复算法中的某些错误)和读取最终非像素数据(例如,如果您在计算着色器中计算科学数据)。
  • 在大多数情况下,您可以通过精心设计代码来完全避免暂存缓冲区。认为 CPU<->GPU 仅以一种方式连接:CPU->GPU。
  • 关于directx - 如何从 Direct3d11 中的顶点缓冲区读取顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17414491/

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