繁体   English   中英

从 DirectX 11 中的 GPU 读回顶点缓冲区(并获取顶点)

[英]Read Back Vertex Buffers from GPU in DirectX 11 (and get vertices)

我试图使用以下方法访问我的应用程序顶点缓冲区(以及那里的顶点):

//access vertex buffers
UINT* Stride = new UINT[32];
UINT* veBufferOffset = new UINT[32];
ID3D11Buffer** veBuffer = new ID3D11Buffer * [32];
pContext->IAGetVertexBuffers(0, 32, veBuffer, Stride, veBufferOffset);

std::ostream& operator<<(std::ostream & out, const ID3D11Buffer& buff); // my attempt at overloading...
for (int i = 0; i < 32; i++)
{
    ID3D11Buffer* buff = veBuffer[i];
    for (int e = 0; e < 50; e++) {
        out << buff[e] << std::endl;
        return out;
    }   
}

我可以循环遍历 veBuffer 没有问题,但是我在访问顶点(buff [e])方面没有任何成功。 我已经对此进行了大量阅读,但我仍然不完全确定 go 从这里到哪里。

I'm also aware of what can be done using the Stream Output stage: https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-stream-stage?重定向自=MSDN

它声明您可以从几何着色器中获取顶点缓冲区。 不过据我了解,几何着色器一次只能输入一个图元(三角形或直线)。 我希望获得每个 model 的缓冲区。

我发现这篇关于从 GPU 读回数据的文章: https://docs.microsoft.com/en-us/windows/win32/direct3d12/readback-data-using-heaps

对我来说不幸的是,它适用于 DirectX 12。是否有等效的 DirectX 11 方法?

这是一种方法。

  1. 像你正在做的那样获取ID3D11Buffer指针。 理想情况下使用std::vector<CComPtr<ID3D11Buffer>>之类的东西而不是 new/delete 但这并不是很重要,至少对于小型项目来说不是。

  2. 调用ID3D11Buffer::GetDesc以获取您要读取的缓冲区的大小和其他参数。

  3. 调整缓冲区的描述,将使用情况设置为D3D11_USAGE_STAGING ,将标志绑定为零,将 CPU 访问标志设置为D3D11_CPU_ACCESS_READ

  4. 通过调用ID3D11Device::CreateBuffer使用修改后的描述创建另一个临时缓冲区。 不要指定初始数据,在那里传递nullptr

  5. 通过调用ID3D11DeviceContext::CopyResource将源缓冲区复制到新创建的临时缓冲区中

  6. 现在您可以使用 ID3D11DeviceContext::Map/Unmap 从您在步骤 4 中创建的临时缓冲区中读取顶点数据。

PS 如果您真的想读回索引缓冲区或任何其他资源类型,工作流程是相同的:创建临时暂存资源,复制并从暂存资源中读取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM