You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:30:21