Direct3D 11使用向量而不是数组

问题描述

因此,基本上我正在尝试学习Direct3D11。我的程序正在运行,并且导入OBJ文件非常成功。但是现在我决定使用向量而不是数组,因为我可能想更改加载的模型,并希望它自动分配所需的内存。无论如何,它现在似乎只显示模型的一半,我相信这与ByteWidth和/或跨度有关,但是我现在尝试了许多不同的组合和不同的设置,以至于我转圈了,并且我确定它在这里代码块中:

ID3D11Buffer *pVertexBuffer;
D3D11_BUFFER_DESC bd;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;   
bd.ByteWidth = vertices.size() * sizeof(Vertex);  
bd.cpuAccessFlags = 0u;
bd.MiscFlags = 0u;
bd.Usage = D3D11_USAGE_DEFAULT;                
bd.StructureByteStride = sizeof(Vertex);
D3D11_SUBRESOURCE_DATA sd = {};
sd.pSysMem = vertices.data();
dev->CreateBuffer(&bd,&sd,&pVertexBuffer);
const UINT stride = sizeof(Vertex);
const UINT offset = 0u;
devcon->IASetVertexBuffers(0u,1u,&pVertexBuffer,&stride,&offset);

ID3D11Buffer *pIndexBuffer;
D3D11_BUFFER_DESC ibd;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;   
ibd.ByteWidth = indices.size() * sizeof(Index);  
ibd.cpuAccessFlags = 0u;
ibd.MiscFlags = 0u;
ibd.Usage = D3D11_USAGE_DEFAULT;                
ibd.StructureByteStride = sizeof(Index);
D3D11_SUBRESOURCE_DATA isd = {};
isd.pSysMem = indices.data();
dev->CreateBuffer(&ibd,&isd,&pIndexBuffer);
devcon->IASetIndexBuffer(pIndexBuffer,dxgi_FORMAT_R16_UINT,0u);

作为参考,我已经粘贴了完整的代码here

解决方法

这是我的猜测。

devcon->IASetIndexBuffer(pIndexBuffer,DXGI_FORMAT_R16_UINT,0u);

在这里,您告诉DirectX您的索引是uint16_t,但是您将索引声明为'unsigned int'。

这很糟糕。

unsigned int通常为32位(4字节)。 uint16是16位(2个字节)。

因此不匹配。

struct Index{
    unsigned int a,b,c;
};

您不应使用unsigned int。您应该使用uint16_t。

如果这不是问题,那么您还是应该进行更改,因为您只是在找麻烦。

使用图形API时,请务必小心选择类型,以免出现这些类型的运行时问题。

以下是固定宽度类型上参考的链接: https://en.cppreference.com/w/cpp/types/integer