OpenGL 3.3 无法绘制任何东西
Posted
技术标签:
【中文标题】OpenGL 3.3 无法绘制任何东西【英文标题】:OpenGL 3.3 can not draw anything 【发布时间】:2017-01-31 13:55:58 【问题描述】:我无法在我的 gl 屏幕上绘制任何东西。它只是清除屏幕。这是我的 Main、Display 和 Cube 类。
main.cpp
Display d(800, 600, "Hi");
while (!d.IsClosed())
d.Clear();
d.Update();
return 0;
显示.cpp
构造函数初始化glfw和glew。
void Display::Update()
glfwPollEvents();
m_shader->UseProgram();
m_renderer->Render(*m_cube);
glfwSwapBuffers(m_window);
UseProgram 函数来自 Shader 类,只是 glUseProgram(m_programID);
。
另外m_renderer->Render()
只是从参数中的对象调用Render函数。
cube.cpp
void Cube::Init()
//cube vertices - colors
GLfloat data[] =
-0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
-0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
-0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a,
-0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a,
0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a,
0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a
;
//cube indices
GLuint indices[] =
//front
0, 1, 2,
0, 2, 3,
//top
4, 0, 3,
4, 3, 7,
//bottom
1, 3, 6,
1, 6, 2,
//left
4, 3, 1,
4, 1, 0,
//right
3, 2, 6,
3, 6, 7,
//back
4, 5, 6,
4, 6, 7,
;
m_vertexCount = sizeof(indices) / sizeof(GLuint);
//Generate buffers
glGenVertexArrays(1, &m_vaoID);
glGenBuffers(1, &m_vboID);
glGenBuffers(1, &m_eboID);
//Bind vertex array object
glBindVertexArray(m_vaoID);
//Bind vertex buffer object
glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT)));
//Unbind vertex buffer object
glBindBuffer(GL_ARRAY_BUFFER, 0);
//Bind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
//Unbind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//Unbind vertex array object
glBindVertexArray(0);
Init()
函数从构造函数中调用。这是所有立方体初始化代码。只是绑定和解除绑定数组。
void Cube::Render()
glBindVertexArray(m_vaoID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID);
glDrawElements(GL_TRIANGLES, m_vertexCount, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
我不知道是什么问题。它只是没有在屏幕上显示任何内容。如果你愿意,我也可以发布我的 Shader 课程。
【问题讨论】:
你能显示着色器类和源吗?您还可以删除Init()
中的 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
和 Render()
中的其他调用,因为 VAO 保存了绑定的索引缓冲区。
【参考方案1】:
步幅参数错误。每个连续的位置 start 7 都会从最后一个位置的开始处浮动。颜色也是如此。正确的代码是
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT)));
另一件事是您在解除绑定 VAO 之前解除绑定索引缓冲区,因此您有效地移除了绑定。 VAO 设置的最后几行必须是:
//Bind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
//Unbind vertex array object
glBindVertexArray(0);
//Unbind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
此外,GL_ELEMENT_ARRAY_BUFFER
在Render()
函数中的绑定/解除绑定应该被移除。
【讨论】:
谢谢。当我更改步幅值时,它会正常运行。以上是关于OpenGL 3.3 无法绘制任何东西的主要内容,如果未能解决你的问题,请参考以下文章