【发布时间】:2020-06-24 20:42:17
【问题描述】:
我正在尝试使用以下方法访问我的应用程序顶点缓冲区(以及那里的顶点):
//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]) 方面没有任何成功。 我已经阅读了相当多的内容,但我仍然不完全确定从这里去哪里。
我也知道使用 Stream Output 阶段可以做什么:https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-stream-stage?redirectedfrom=MSDN
它声明您可以从几何着色器中获取顶点缓冲区。不过据我了解,几何着色器一次只能输入一个图元(三角形或直线)。我希望在哪里获得每个模型的缓冲区。
我发现这篇关于从 GPU 读回数据的文章:https://docs.microsoft.com/en-us/windows/win32/direct3d12/readback-data-using-heaps
不幸的是,它适用于 DirectX 12。有等效的 DirectX 11 方法吗?
【问题讨论】:
-
buff[e]不指向顶点。它指向 1 数组中的第 'e'ID3D11Buffer,因此是未定义的行为。即使你做对了,你也不能假设缓冲区只是内存。它可能位于 GPU 上,因此您甚至无法访问它。你需要先Map它。见*.com/questions/17414491/… -
可以在map函数中使用上面IAGetVertexBuffers方法返回的指针吗?这样我就知道我想要哪些缓冲区?
标签: c++ directx-11