Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 到Direct3D顶点缓冲区和索引缓冲区阵列的tiny_obj_加载程序_C++_Winapi_Visual Studio 2015_Directx - Fatal编程技术网

C++ 到Direct3D顶点缓冲区和索引缓冲区阵列的tiny_obj_加载程序

C++ 到Direct3D顶点缓冲区和索引缓冲区阵列的tiny_obj_加载程序,c++,winapi,visual-studio-2015,directx,C++,Winapi,Visual Studio 2015,Directx,我在pSwapChain->Present()期间遇到一个无法调试的错误 我正在使用DXUT示例并构建OBJ加载程序。为此,我从SDKmesh类复制功能,并使用tiny_obj_loader类加载obj文件 我得到的错误是 Exception thrown at 0x00007FF89DC288A8 (nvwgf2umx.dll) in test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF. 下面是

我在
pSwapChain->Present()
期间遇到一个无法调试的错误

我正在使用DXUT示例并构建OBJ加载程序。为此,我从
SDKmesh
类复制功能,并使用
tiny_obj_loader
类加载obj文件

我得到的错误是

Exception thrown at 0x00007FF89DC288A8 (nvwgf2umx.dll) in test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
下面是我导入obj的测试代码

我确实意识到我在愚蠢地将微小的对象加载器结构转换为ID3D11缓冲区。但我希望tiny_obj_loader至少能尝试复制这些缓冲区结构。还是需要更好的obj导入库?有人能推荐一个与DirectX兼容的吗

bool DXUTModel::LoadOBJ(std::string object_file)
{
    IModel::LoadOBJ(object_file);

    int num_vertices = attrib.vertices.size();
    int num_indices = shapes[0].mesh.indices.size();

    g_Mesh11.m_ppVertices = (BYTE**)&attrib.vertices;
    g_Mesh11.m_ppIndices = (BYTE**)&shapes[0].mesh.indices;

    g_Mesh11.m_pMaterialArray = new SDKMESH_MATERIAL;
    std::wstring strPath = L"Media\\Base_skin.dds";
    if (FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile(dxCtr->m_pDevice, dxCtr->m_pImmediateContext, strPath.c_str(), &g_Mesh11.m_pMaterialArray->pDiffuseRV11,true)))
        g_Mesh11.m_pMaterialArray->pDiffuseRV11 = (ID3D11ShaderResourceView*)ERROR_RESOURCE_VALUE;

    //Set Vertex Buffer Array
    g_Mesh11.m_pMeshArray = new SDKMESH_MESH;
    g_Mesh11.m_pVertexBufferArray = new SDKMESH_VERTEX_BUFFER_HEADER;
    g_Mesh11.m_pMeshArray[0].VertexBuffers[0] = 0;
    g_Mesh11.m_pVertexBufferArray[g_Mesh11.m_pMeshArray[0].VertexBuffers[0]].pVB11 = (ID3D11Buffer*)&attrib.vertices;
    g_Mesh11.m_pVertexBufferArray[g_Mesh11.m_pMeshArray[0].VertexBuffers[0]].StrideBytes = 32;

    //Set Index Buffer array
    g_Mesh11.m_pMeshArray[0].IndexBuffer = 0;
    g_Mesh11.m_pIndexBufferArray = new SDKMESH_INDEX_BUFFER_HEADER;
    g_Mesh11.m_pIndexBufferArray[g_Mesh11.m_pMeshArray[0].IndexBuffer].IndexType = IT_16BIT;
    g_Mesh11.m_pIndexBufferArray[g_Mesh11.m_pMeshArray[0].IndexBuffer].pIB11 = (ID3D11Buffer*)&shapes[0].mesh.indices;

    //Set subset
    SDKMESH_SUBSET v_subset;
    v_subset.MaterialID = 0;
    v_subset.PrimitiveType = PT_TRIANGLE_LIST;
    v_subset.IndexCount = shapes[0].mesh.indices.size();
    v_subset.VertexCount = attrib.vertices.size();
    v_subset.VertexStart = 0;
    v_subset.IndexStart = 0;
    g_Mesh11.m_pMeshArray[0].pSubsets = new UINT;
    g_Mesh11.m_pMeshArray[0].pSubsets[0] = 0;
    g_Mesh11.m_pMeshArray[0].NumSubsets = 1;
    g_Mesh11.m_pSubsetArray = new SDKMESH_SUBSET;
    g_Mesh11.m_pSubsetArray[g_Mesh11.m_pMeshArray[0].pSubsets[0]] = v_subset;
    return true;
}

我似乎已修复了初始错误替换:

//g_Mesh11.m_pVertexBufferArray[g_Mesh11.m_pMeshArray[0].VertexBuffers[0]].pVB11 = (ID3D11Buffer*)&attrib.vertices;
//g_Mesh11.m_pIndexBufferArray[g_Mesh11.m_pMeshArray[0].IndexBuffer].pIB11 = (ID3D11Buffer*)&shapes[0].mesh.indices;
与:


它在画一些东西,虽然不漂亮,但有纹理。我不知道tiny_obj_loader的功能是什么,但所有这些随机的投射都只是腿部的直射。从变量名称判断,您需要使用
ID3D11Device::CreateBuffer
为网格顶点和从该库获得的索引创建DirectX缓冲区。您还需要确保加载的顶点与您正在使用的着色器兼容。如果您询问库的建议,则此问题与主题无关。如果您正在寻求有关您的问题的帮助,则可能不是。也许最好不要再查询better/其他库,为详细说明您的问题(如调用堆栈)的信息腾出空间。谢谢,我刚刚意识到我不能将CPU内存强制转换为GPU缓冲区。
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = (UINT)(attrib.vertices.size()*4);
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = &attrib.vertices[0];
dxCtr->m_pDevice->CreateBuffer(&bufferDesc, &InitData, &g_Mesh11.m_pVertexBufferArray[g_Mesh11.m_pMeshArray[0].VertexBuffers[0]].pVB11);
g_Mesh11.m_pVertexBufferArray[g_Mesh11.m_pMeshArray[0].VertexBuffers[0]].StrideBytes = 32;
g_Mesh11.m_pVertexBufferArray[g_Mesh11.m_pMeshArray[0].VertexBuffers[0]].SizeBytes = attrib.vertices.size() * 4;

//Set Index Buffer array
g_Mesh11.m_pMeshArray[0].IndexBuffer = 0;
g_Mesh11.m_pIndexBufferArray = new SDKMESH_INDEX_BUFFER_HEADER;
g_Mesh11.m_pIndexBufferArray[g_Mesh11.m_pMeshArray[0].IndexBuffer].IndexType = IT_16BIT;
D3D11_BUFFER_DESC bufferDesc2;
bufferDesc2.ByteWidth = (UINT)(shapes[0].mesh.indices.size());
bufferDesc2.Usage = D3D11_USAGE_DEFAULT;
bufferDesc2.BindFlags = D3D11_BIND_INDEX_BUFFER;
bufferDesc2.CPUAccessFlags = 0;
bufferDesc2.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA InitData2;
InitData2.pSysMem = &shapes[0].mesh.indices[0];
dxCtr->m_pDevice->CreateBuffer(&bufferDesc, &InitData2, &g_Mesh11.m_pIndexBufferArray[g_Mesh11.m_pMeshArray[0].IndexBuffer].pIB11);
g_Mesh11.m_pIndexBufferArray[g_Mesh11.m_pMeshArray[0].IndexBuffer].SizeBytes = shapes[0].mesh.indices.size();