Im getting an error during pSwapChain->Present()
that I cannot debug.
Im utilizing DXUT examples and building an OBJ loader. For this I'm copying functionality from SDKmesh
class and using tiny_obj_loader
class to load the obj file.
The error I'm getting is
Exception thrown at 0x00007FF89DC288A8 (nvwgf2umx.dll) in test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
My test code for importing obj is below.
I do realize I'm stupidly casting tiny_obj_loader structures into ID3D11Buffers. But I would hope that tiny_obj_loader at least attempts to replicate those buffer structures. Or do I need a better obj import library? Can anyone recommend one that is compatible with 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;
}
I seem to have fixed the initial error replacing:
//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;
with:
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();
It's drawing something, it's not pretty but it has a texture. Will post code when I get it working correctly
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.