OpenGL:3D模型未正确渲染,仅渲染为2D?

OpenGL:3D模型未正确渲染,仅渲染为2D?,opengl,3d,d,assimp,Opengl,3d,D,Assimp,我正在尝试使用Assimp加载一个简单的八面体。这就是模型应该看起来的样子: 但是,这就是我的代码呈现的内容: auto scene = scoped!AssimpScene(assimp,"octahedron.obj",aiProcessPreset_TargetRealtime_Fast); auto mesh = scene.scene().mMeshes[0]; auto vertex = new float[mesh.mNumFaces*3*3]; auto norma

我正在尝试使用Assimp加载一个简单的八面体。这就是模型应该看起来的样子:

但是,这就是我的代码呈现的内容:

    auto scene = scoped!AssimpScene(assimp,"octahedron.obj",aiProcessPreset_TargetRealtime_Fast);
auto mesh = scene.scene().mMeshes[0]; 

auto vertex = new float[mesh.mNumFaces*3*3];
auto normal = new float[mesh.mNumFaces*3*3];
int b = 0;
for(int i = 0; i < mesh.mNumFaces;i++)
{
    auto face = mesh.mFaces[i];
    for(int j = 0; j < 3; j++)
    {

         auto va  = cast(float[3])mesh.mVertices[face.mIndices[j]];
         vertex[b..b+3] = va;


         auto n  = cast(float[3])mesh.mNormals[face.mIndices[j]];
         normal[b..b+3] = n;
         b+=3;
    }
}
while(!sdl2.keyboard().isPressed(SDLK_ESCAPE))
{
    sdl2.processEvents(); 
    //clear screen
    glViewport(0, 0, width,height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glVertexPointer(3,GL_FLOAT,0,cast(const(void*))vertex);
    glNormalPointer(GL_FLOAT,0,cast(const(void*))normal);


    glDrawArrays(GL_TRIANGLES,0,mesh.mNumFaces*3);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    window.swapBuffers();

}
scene.close();
assimp.close();
}

显然,这是不对的。我不确定我的代码哪里有错,尽管我怀疑是OpenGL的错,而不是ASIMP代码的错

这是我的密码:

    auto scene = scoped!AssimpScene(assimp,"octahedron.obj",aiProcessPreset_TargetRealtime_Fast);
auto mesh = scene.scene().mMeshes[0]; 

auto vertex = new float[mesh.mNumFaces*3*3];
auto normal = new float[mesh.mNumFaces*3*3];
int b = 0;
for(int i = 0; i < mesh.mNumFaces;i++)
{
    auto face = mesh.mFaces[i];
    for(int j = 0; j < 3; j++)
    {

         auto va  = cast(float[3])mesh.mVertices[face.mIndices[j]];
         vertex[b..b+3] = va;


         auto n  = cast(float[3])mesh.mNormals[face.mIndices[j]];
         normal[b..b+3] = n;
         b+=3;
    }
}
while(!sdl2.keyboard().isPressed(SDLK_ESCAPE))
{
    sdl2.processEvents(); 
    //clear screen
    glViewport(0, 0, width,height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glVertexPointer(3,GL_FLOAT,0,cast(const(void*))vertex);
    glNormalPointer(GL_FLOAT,0,cast(const(void*))normal);


    glDrawArrays(GL_TRIANGLES,0,mesh.mNumFaces*3);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    window.swapBuffers();

}
scene.close();
assimp.close();
}

有很多事情你没有做,openGL比你想象的低很多,你必须指定矩阵和照明等,即使使用传统的GL


建议在

处学习本教程,因为您不需要进行任何摄影机变换。如果您想要快速修复,可以使用gluLookAt,但我建议不要使用不推荐使用的OpenGL。这是一个很好的教程:

你的代码看起来很像D,为什么你把它标记为C++?它是D,我的错!我去掉了塔加,有趣的谢谢!我遵循本教程,他没有指定矩阵或照明。我将阅读该链接,谢谢!您肯定不想使用旧式GL,尽管现代版稍难入门,但一旦您了解了基本原理,它在各个方面都会更好。@Rishub:嗯,该教程是关于使用ASIMP加载网格的,而不是关于使用opengl渲染的。谢谢!非常合适的域名