未绘制Opengl三角形



我正试图在屏幕上画一个简单的三角形。窗户设置得很好,一切似乎都很好,我正在努力画东西。我有以下代码,但由于某些原因它不起作用。

default_shader_program是函数代码之后显示的程序链接着色器

void window::run(void(*update)(), void(*draw)()) {
while (glfwWindowShouldClose(wnd) == 0)
{
update();
glClear(GL_COLOR_BUFFER_BIT);
draw();
GLuint vb;
GLfloat data[12]{
1.f, 1.f, 0.f,
1.f, -1.f, 0.f,
-1.f, 0.f, 0.f
};

glGenBuffers(1, &vb);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
GLuint va;
glGenVertexArrays(1, &va);
glBindVertexArray(va);
glUseProgram(default_shader_program);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glVertexAttribPointer(
0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
3,                  // size
GL_FLOAT,           // type
GL_FALSE,           // normalized?
0,                  // stride
(void*)0            // array buffer offset
);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glfwSwapBuffers(wnd);
glfwPollEvents();
}
glfwDestroyWindow(wnd);
}

着色器:vertexshader:

#version 330 core
layout(location=0) in vec3 vertexPosition;
void main() {
gl_Position = vec4(vertexPosition, 1);
}

fragmentshader:

#version 330 core
out vec3 color;
void main() {
color = vec3(1.0, 0.0, 0.0);
}

是的,我知道,我在while循环中缓冲数据和做其他事情。我知道,不应该这样做,但实际问题发生在其他地方,我想看看代码是否能直接在循环中正常工作。

您的数组包含9个元素,而不是12个,但这不会导致问题。

glBufferData的第二个参数是以字节为单位的缓冲区大小。因此,缓冲区的大小是9*sizeof(GLfloat),而不是12:

glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), data, GL_STATIC_DRAW);

最新更新