未绘制 Opengl 三角形
Opengl triangle not drawn
我正在尝试在屏幕上绘制一个简单的三角形。 window 得到正确设置,一切似乎都很好,我正在尝试实际绘制东西。我有以下代码,但由于某些原因它不起作用。
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);
}
着色器:
顶点着色器:
#version 330 core
layout(location=0) in vec3 vertexPosition;
void main() {
gl_Position = vec4(vertexPosition, 1);
}
片段着色器:
#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);
我正在尝试在屏幕上绘制一个简单的三角形。 window 得到正确设置,一切似乎都很好,我正在尝试实际绘制东西。我有以下代码,但由于某些原因它不起作用。
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);
}
着色器: 顶点着色器:
#version 330 core
layout(location=0) in vec3 vertexPosition;
void main() {
gl_Position = vec4(vertexPosition, 1);
}
片段着色器:
#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);