【问题标题】:Direct3D 11 Using Vectors instead of ArraysDirect3D 11 使用向量而不是数组
【发布时间】:2020-10-25 07:24:35
【问题描述】:

所以基本上我正在尝试学习 Direct3D 11。我已经让我的程序运行并成功导入了 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

【问题讨论】:

  • 您需要检查所有 HRESULT 是否成功。

标签: c++ direct3d11


【解决方案1】:

这是我的猜测。

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

在这里,您告诉 directx 您的索引是 uint16_t 但是您将索引声明为“无符号整数”。

这很糟糕。

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

因此存在不匹配。

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

您不应该使用无符号整数。你应该使用 uint16_t。

如果这不是问题,那么您无论如何都应该进行此更改,因为在我看来您只是自找麻烦。

使用图形 API 时,您要非常小心选择类型以避免这些类型的运行时问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多