如何循环打印顶点结构
How to Print Vertex Structure in a Loop
我想打印我的顶点缓冲区的内容。我想在打印到控制台时循环浏览所有顶点和纹理坐标。具体来说,我想看看顶点位置和纹理(纹理坐标(。这将如何在一个循环中完成?
//vertex structure
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT2 Tex;
};
D3D11_MAPPED_SUBRESOURCE ms;
pContext->Map(buff, NULL, D3D11_MAP_READ, NULL, &ms);
Vertex* vertices = new Vertex[ms.DepthPitch];
memcpy(vertices, ms.pData, ms.DepthPitch);
pContext->Unmap(buff, 0);
//I know how to write a basic for loop,
//But I don't know how to query only pos or tex?
for (int i = 0; i < 2678; i++) {
cout << vertices[i] << "n";
}
上面的代码可能会以多种方式失败,因此包含错误处理非常重要。
此外,D3D11_MAPPED_SUBRESOURCE
不会通过其任何值报告顶点缓冲区的大小(以字节为单位(,因此您需要通过GetDesc
从D3D11_BUFFER_DESC
获得它。
DepthPitch
只有在映射体积(3D(纹理时才是有效值。
您还假设顶点缓冲区本身是可以直接Map
的东西,因为您使用D3D11_USAGE_STAGING
或D3D11_USAGE_DYNAMIC
创建了它,并且使用了D3D11_CPU_ACCESS_FLAG
。
//vertex structure
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT2 Tex;
};
D3D11_MAPPED_SUBRESOURCE ms = {};
if (FAILED(pContext->Map(buff, 0, D3D11_MAP_READ, 0, &ms)))
{
cout << "Failed Map" << endl;
}
else
{
D3D11_BUFFER_DESC desc = {};
buff->GetDesc(&desc);
size_t nVerts = desc.ByteWidth / sizeof(Vertex);
if (!nVerts)
{
cout << "Failed computing nVerts" << endl;
}
else
{
auto vertices = new Vertex[nVerts];
memcpy(vertices, ms.pData, nVerts * sizeof(Vertex));
for (size_t i = 0; i < nVerts; i++)
{
cout << vertices[i].Pos.x << ", "
<< vertices[i].Pos.y << ", "
<< vertices[i].Pos.z << endl;
}
delete [] vertices;
}
pContext->Unmap(buff, 0);
}
注意,处理临时
vertices
内存的更好方法是使用auto vertices = std::make_unique<Vertex[]>(nVerts);
并将#include <memory>
添加到顶部。这避免了在任何情况下都需要记住手动删除内存。
您还应该使用Microsoft::WRL::ComPtr而不是原始COM接口指针,以避免DirectX COM对象的内存泄漏。
另请参阅DX11 的DirectX工具包
相关文章:
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 提升图:遍历所有顶点并打印相邻顶点
- 使用Vertex_descriptor boost图在顶点上打印或迭代
- 似乎无法使用<VERTEX>迭代器在 for 循环中打印列表顶点?C++
- 打印带有自定义顶点标签的助推图
- 如何打印图中两个顶点之间的最短路径?
- 按CGAL顶点打印排列_2