如何循环打印顶点结构

How to Print Vertex Structure in a Loop

本文关键字:打印 顶点 结构 循环 何循环      更新时间:2023-10-16

我想打印我的顶点缓冲区的内容。我想在打印到控制台时循环浏览所有顶点和纹理坐标。具体来说,我想看看顶点位置和纹理(纹理坐标(。这将如何在一个循环中完成?

//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不会通过其任何值报告顶点缓冲区的大小(以字节为单位(,因此您需要通过GetDescD3D11_BUFFER_DESC获得它。

DepthPitch只有在映射体积(3D(纹理时才是有效值。

您还假设顶点缓冲区本身是可以直接Map的东西,因为您使用D3D11_USAGE_STAGINGD3D11_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工具包