Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试在DirectX 11中加载Obj文件时矢量下标超出范围_C++_Directx_Directx 11_Vertex - Fatal编程技术网

C++ 尝试在DirectX 11中加载Obj文件时矢量下标超出范围

C++ 尝试在DirectX 11中加载Obj文件时矢量下标超出范围,c++,directx,directx-11,vertex,C++,Directx,Directx 11,Vertex,当我尝试加载没有法线或纹理坐标的Obj文件时,得到的矢量下标超出了范围。如果我加载一个具有法线和纹理坐标的obj文件,那么一切正常。所以我只是问我如何修改我的代码来加载没有法线和纹理坐标的obj文件 这是我存储顶点数据的结构 struct VERTEX { XMFLOAT3 position; XMFLOAT3 normal; XMFLOAT2 texcoord; }; 这些顶点用来存储数据 std::vector<XMFLOAT3> m_position;

当我尝试加载没有法线或纹理坐标的Obj文件时,得到的矢量下标超出了范围。如果我加载一个具有法线和纹理坐标的obj文件,那么一切正常。所以我只是问我如何修改我的代码来加载没有法线和纹理坐标的obj文件

这是我存储顶点数据的结构

struct VERTEX
{
    XMFLOAT3 position;
    XMFLOAT3 normal;
    XMFLOAT2 texcoord;
};
这些顶点用来存储数据

std::vector<XMFLOAT3> m_position;
std::vector<XMFLOAT2> m_texCoords;
std::vector<XMFLOAT3> m_normals;
std::vector<VERTEX> m_vertices;
std::vector<DWORD> m_Indices;
VERTEX vertex;
}

正如注释所说,在带有
initData.psysem=&m_顶点[0]的行上
initData.psysem=&m_索引[0],我的程序将中断,我将得到矢量下标超出范围的错误。如果我从&m_顶点和&m_索引中删除[0],它不会中断,但不会渲染任何内容

我只是想知道我能做些什么让我的obj加载程序加载obj文件,这些文件不需要总是包含所有4个顶点、法线、纹理坐标和面

大体上 你不能仅仅凭猜测就知道为什么你的应用程序会崩溃。你不需要这么做。作为程序员,我们有体面的工具来解决这些问题。所以,一般建议是:学会使用调试器

具体问题 你的向量是空的。
当您试图访问不存在的第一个元素(
m_顶点[0]
m_索引[0]
)时,您会遇到此断言失败(因为您处于调试模式;在发布模式下,它将无声地触发未定义的行为)

如何检查 当程序在这些行上执行中断时,检查“调用堆栈”窗口,查看您在哪个函数中。找到堆栈中最高的函数之一,然后单击它。选中“局部”、“自动”或“监视”窗口(菜单“调试”->“窗口”),查看范围内向量和其他变量的内容。放置断点并在需要时重新启动应用程序

如何修复 在程序的前面设置断点,以查看向量为空的原因。一行一行地移动,一个函数一个函数地移动,使用“单步执行”和“单步执行”,观察变量,直到找到错误源

如果在那里有空向量是有效的,您可以创建分支以避免访问其内容的代码路径:

if(!m_vertices.empty())
{
    // Create buffers with data
} 
else 
{
    // Create empty buffers or report an error
}` 
希望能有帮助

D3D11_INPUT_ELEMENT_DESC vertlayout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

ID3D11Device* pDevice = m_shader->GetDevice();
ID3DBlob* pVSBlob = m_shader->GetVSBlob();

pDevice->CreateInputLayout(vertlayout, ARRAYSIZE(vertlayout), pVSBlob->GetBufferPointer(),
    pVSBlob->GetBufferSize(), &m_vertexLayout);

D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd)); 
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(VERTEX)* m_vertices.size();
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;

D3D11_SUBRESOURCE_DATA initData;
ZeroMemory(&initData, sizeof(initData));
initData.pSysMem = &m_vertices[0]; //This is where it breaks                                                                  

pDevice->CreateBuffer(&bd, &initData, &m_vertexBuffer);

bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(DWORD)* m_Indices.size();
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
initData.pSysMem = &m_Indices[0]; //and it breaks here too

pDevice->CreateBuffer(&bd, &initData, &m_indexBuffer);  
if(!m_vertices.empty())
{
    // Create buffers with data
} 
else 
{
    // Create empty buffers or report an error
}`