DirectX11项目中用Assimp加载Mesh超顶点阈值后显示不全求助
DirectX 11 + Assimp 网格加载器顶点数超限后失效问题
我在C++开发的DirectX 11项目中使用Assimp实现Mesh加载器,因之前有OpenGL下的Assimp使用经验所以选用该库。加载小型Mesh完全正常,但当顶点数量超过某个阈值后,加载器会完全失效,仅显示少量顶点(比如Cerberus模型上的星星无法显示,高细节模型问题更严重),与原始Mesh差异明显。
初始Mesh加载代码
struct Vertex { struct { float x, y, z; } position; struct { float x, y, z; } normal; struct { float u, v; } TexCoord; Vertex(float px, float py, float pz, float nx, float ny, float nz, float u, float v) : position{ px, py, pz },normal{nx, ny, nz}, TexCoord{u, v} { } Vertex(){} }; class Mesh { public: Mesh(){} int Create(const char* filepath); inline VertexBuffer* GetVertexBuffer() { return &m_VertexBuffer; } inline IndexBuffer* GetIndexBuffer() { return &m_IndexBuffer; } inline void DestroyMesh() { m_VertexBuffer.ShutDown(); m_IndexBuffer.ShutDown(); }; private: static BufferLayout layout[]; std::vector<Vertex> m_vertices; std::vector<unsigned int> m_indices; VertexBuffer m_VertexBuffer; IndexBuffer m_IndexBuffer; }; } int Mesh::Create(const char* filepath) { Assimp::Importer imp; const aiScene* pScene = imp.ReadFile(filepath, aiProcess_Triangulate |aiProcess_JoinIdenticalVertices); const aiMesh* pmesh = pScene->mMeshes[0]; m_vertices.reserve(pmeshes->mNumVertices); m_indices.reserve(pmeshes->mNumFaces * 3); for (unsigned int j = 0; j < pmeshes->mNumVertices; j++) { m_vertices.push_back(Vertex( pmeshes->mVertices[j].x, pmeshes->mVertices[j].y, pmeshes->mVertices[j].z, pmeshes->mNormals[j].x, pmeshes->mNormals[j].y, pmeshes->mNormals[j].z, pmeshes->mTextureCoords[0][j].x, pmeshes->mTextureCoords[0][j].y )); } for (unsigned int i = 0; i < pmeshes->mNumFaces; i++) { const auto& face = pmeshes->mFaces[i]; for (unsigned int j = 0; j < face.mNumIndices; j++) m_indices.push_back(face.mIndices[j]); } m_VertexBuffer.Create(m_vertices.data(), sizeof(Vertex) * pmeshes->mNumVertices, sizeof(Vertex)); m_IndexBuffer.Create(m_indices.data(), sizeof(unsigned int) * pmeshes->mNumFaces * 3, sizeof(unsigned int)); imp.FreeScene(); return 0; }
顶点缓冲区与索引缓冲区创建代码
void VertexBuffer::Create(const void* vertices, unsigned int size, unsigned int stride) { D3D11_BUFFER_DESC bd = {}; bd.Usage = D3D11_USAGE_DEFAULT; bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; bd.ByteWidth = size; D3D11_SUBRESOURCE_DATA sd = {}; sd.pSysMem = vertices; RendererBase::Getd3dDevice()->CreateBuffer(&bd, &sd, &pVertexBuffer); } IndexBuffer::Create(const void* indices, unsigned int size, unsigned int stride) { count = size/stride; D3D11_BUFFER_DESC bd = {}; bd.Usage = D3D11_USAGE_DEFAULT; bd.BindFlags = D3D11_BIND_INDEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; bd.ByteWidth = size; D3D11_SUBRESOURCE_DATA sd = {}; sd.pSysMem = indices; RendererBase::Getd3dDevice()->CreateBuffer(&bd, &sd, &pIndexBuffer); }
已尝试的解决方法:
- 加载文件中的所有模型并创建单独的Mesh对象分别绘制,结果仍相同。
恳请各位提供帮助,如需更多信息或代码片段,我随时可以提供。
内容的提问来源于stack exchange,提问作者MindOfTony
相关产品推荐
相关产品推荐

