我正在研究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"
如果有人有任何想法,谢谢!
答案 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我不知道。
祝你好运:)