【问题标题】:Query the Vertex Structure from returned Vertex Buffers从返回的顶点缓冲区中查询顶点结构
【发布时间】:2020-07-07 11:11:53
【问题描述】:

因此,在我的 DirectX 应用程序中,我正在收集各种缓冲区进行处理。在我的小代码 sn-p 中,我使用 Map() 和 memcpy() 将资源(在本例中为顶点缓冲区)复制到系统内存。这似乎没有问题。

我想访问缓冲区中的一些顶点(在 vert 中)。为此,有人告诉我需要将类型 void 转换为适当的顶点结构。我试图在下面的通用语句中表达...根据我的理解,我需要知道缓冲区顶点结构。我没有现成的。

为了简单起见,我想知道是否可以从返回的缓冲区中查询顶点结构。有问题的缓冲区是随机生成的,如果可能的话,我会更容易从这里获取结构。

有没有办法让我从缓冲区中查询这个结构?

pContext->IAGetVertexBuffers(0, 1, &veBuffer, &Stride, &veBufferOffset);
if (veBuffer)
    veBuffer->GetDesc(&vedesc);

D3D11_MAPPED_SUBRESOURCE mapped_rsrc;
HRESULT = hrm pContext->Map(readVB, NULL, D3D11_MAP_READ, NULL, &mapped_rsrc);
assert(hrm == S_OK);
void* vert = new BYTE[mapped_rsrc.DepthPitch];
memcpy(vert, mapped_rsrc.pData, mapped_rsrc.DepthPitch);
pContext->unmap(readVB, 0);

//I'd like to access vertices here...
VertexType* vert = static_cast<VertexType*>(mapped_rsrc.pdata);

编辑:读完这个问题后:(DirectX 11) Dynamic Vertex/Index Buffers implementation with constant scene content changes

我在想也许使用 GetDesc() 应该返回描述缓冲区结构所需的内容?

【问题讨论】:

  • 我怀疑这不是您的 DirectX 应用程序,因为您已经在 CPU 端获得了这些信息。
  • 是的,缓冲区不是我的。我正在为我正在研究的计算机视觉模型收集数据。与此处所做的类似:arxiv.org/pdf/1608.02192.pdf。这纯粹是科学的。我确实有其他组件用于生成一些缓冲区,但它们是在 Autodesk Maya 而不是 DirectX 中生成的。否则申请是我的,这就是我的意思。

标签: c++ casting directx-11


【解决方案1】:

顶点缓冲区的二进制布局由活动的输入布局决定。由于 DirectX 运行时在 Input Layout 和 VB 之间没有任何特定的联系,因此由应用程序跟踪该信息以及您的顶点步幅。

所有GetDesc 可以告诉你的是总大小(以字节为单位)。见D3D11_BUFFER_DESC

DirectXMesh 用于内容工具而非运行时使用,但包含用于根据输入布局为顶点缓冲区读取和写入单个数据元素的代码。见VBReader/VBWriter

【讨论】:

  • 嘿@Chuck Walbourn,我看到要初始化VBReader,您需要提供输入布局和顶点结构。我可以使用 DeviceContext::IAGetInputLayer() 为输入层提供该参数吗?
  • 这不会反编译 Direct3D 对象。它只是使用提供的相同描述来创建输入布局。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多