【发布时间】:2018-11-17 20:45:36
【问题描述】:
我在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的测试代码如下。
我确实意识到我正在愚蠢地将 tiny_obj_loader 结构转换为 ID3D11Buffers。但我希望 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;
}
【问题讨论】:
-
我不知道
tiny_obj_loader做了什么,但所有这些随机投射只是腿部的直射。从变量名称来看,您需要为网格顶点和使用ID3D11Device::CreateBuffer从该库获得的索引创建 DirectX 缓冲区。您还需要确保加载的顶点与您使用的着色器兼容。 -
如果您要求图书馆的推荐,这个问题是题外话。如果您正在为您的问题寻求帮助,则可能不是。最好放弃对更好/其他库的查询,以便为详细说明您的问题的信息腾出空间(例如调用堆栈)。
-
谢谢,我刚刚意识到我无法将 CPU 内存转换为 GPU 缓冲区。
标签: c++ winapi visual-studio-2015 directx