当我尝试使用EOB显示.obj时,OpenGL崩溃

时间:2015-09-15 14:57:08

标签: c++ opengl shader assimp

我正在研究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;
}

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

所以最后我到了一个" nouveau失败的idel频道0xcccc0000 Xorg 677"

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

1 个答案:

答案 0 :(得分:0)

网格设置有一点是错误的。

这个

 // 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被绑定时,否则你将把attrib指针设置为EBO而不是VBO。

如果您没有理由使用旧的GLSL版本,您应该将其提升至330左右,并在vec3位置使用布局(位置= 0)。

例如,访问法线:

#version 330

layout(location = 1) in vec3 normals;
etc

关于assimp我不知道。

祝你好运:)