问题描述
我正在尝试在屏幕上绘制一个简单的三角形。窗口已正确设置,一切似乎还可以,我正在尝试实际绘制东西。我有以下代码,但是由于某些原因它不起作用。
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,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,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),GL_STATIC_DRAW);