当我试图用EOB显示.obj时,OpenGL崩溃了

OpenGL crash when i try to display a .obj with EOB

本文关键字:OpenGL 崩溃 obj 显示 EOB      更新时间:2023-10-16

我正在制作一个3D对象查看器,我认为这是一个非常基本的opengl程序。但是我是opengl的新手,我发现了一个我无法解决的问题。

我使用的最后一个教程在这里:LearnOpenGL因此,我将显示的代码是从那里(模型加载部分),我使用Assimp加载对象。

有一些代码:

网格设置:

struct Vertex {
    glm::vec3  position;
    glm::vec3  normal;
    glm::vec2  texCoords;
  };
    glGenVertexArrays(1, &this->m_VAO);
    glGenBuffers(1, &this->m_VBO);
    glGenBuffers(1, &this->m_EBO);
    glBindVertexArray(this->m_VAO);
    glBindBuffer(GL_ARRAY_BUFFER, this->m_VBO);
    glBufferData(GL_ARRAY_BUFFER, this->m_vertices.size() * sizeof(Vertex),
                 &this->m_vertices[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->m_indices.size() * sizeof(GLuint),
                 &this->m_indices[0], GL_STATIC_DRAW);
    // Vertex Positions
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
                         (GLvoid*)0);
    // Vertex Normals
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
                         (GLvoid*)offsetof(Vertex, normal));
    // Vertex Texture Coords
    glEnableVertexAttribArray(2); 
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
                         (GLvoid*)offsetof(Vertex, texCoords));
    glBindVertexArray(0);

您可以在网站上查看完整的代码

画:

// Draw mesh
glBindVertexArray(model.get_VAO());
glDrawElements(GL_TRIANGLES, model.get_Indices_Size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

着色器:

顶点——>

#version 130
in vec4 gxl3d_Position;
in vec4 gxl3d_Color;
smooth out vec4 VertexColor;
void main() {
  gl_Position = gxl3d_Position;
  VertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f);
}

片段->

#version 130
smooth in vec4 VertexColor;
void main() {
  gl_FragColor = VertexColor;
}

当我运行这个,我可以检查从Assimp的最后一个顶点是不一样的,当我直接读取。obj,也许它是正常的?

所以最后我到达了一个"nouveau failed idel channel 0xcccc0000 Xorg 677"

如果有人有任何想法,谢谢!

在网格设置中有一件事是错误的。

 // Vertex Positions
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
                     (GLvoid*)0);
// Vertex Normals
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
                     (GLvoid*)offsetof(Vertex, normal));
// Vertex Texture Coords
glEnableVertexAttribArray(2); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
                     (GLvoid*)offsetof(Vertex, texCoords));

应该在

之后
glBindBuffer(GL_ARRAY_BUFFER, this->m_VBO);
glBufferData(GL_ARRAY_BUFFER, this->m_vertices.size() * sizeof(Vertex),
             &this->m_vertices[0], GL_STATIC_DRAW);

当VBO被绑定时,否则将属性指针设置为EBO而不是VBO。

如果你没有理由使用旧的GLSL版本,你应该把它调到330左右,并在vec3位置使用layout(location = 0)。

访问normal的实例:

#version 330
layout(location = 1) in vec3 normals;
etc

关于assimp我不知道。

祝你好运