渲染正方形时OpenGL黑屏
OpenGL black screen when rendering a square
我正在尝试在 linux 上使用 openGL 和 GLFW 渲染一个红色方块。但是,下面的代码只是生成了一个黑色背景的 window,我不明白为什么。 GLCall 宏仅用于错误检查目的,并不是问题的原因。
int main(){
Window window(1280, 720);
float vertices[] = {-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
0.5f, 0.5f,
-0.5f, 0.5f,
-0.5f, -0.5f
};
const char* vertexShader = "#version 330 core\n"
"layout (location = 0) in vec2 position;\n"
"void main(){\n"
"gl_Position = vec4(position, 0.0, 1.0);\n"
"}";
const char* fragmentShader = "#version 330 core\n"
"out vec4 color;\n"
"void main(){\n"
"color = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
"}";
GLuint vao;
GLCall(glGenVertexArrays(1, &vao));
GLCall(glBindVertexArray(vao));
GLuint vbo;
GLCall(glGenBuffers(1, &vbo));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, vbo));
GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0));
GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
GLCall(glShaderSource(vshader, 1, &vertexShader, NULL));
GLCall(glCompileShader(vshader));
GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
GLCall(glShaderSource(fshader, 1, &fragmentShader, NULL));
GLCall(glCompileShader(fshader));
GLuint shader = glCreateProgram();
GLCall(glAttachShader(shader, vshader));
GLCall(glAttachShader(shader, fshader));
GLCall(glLinkProgram(shader));
GLCall(glUseProgram(shader));
while(window.isOpen()){
glClear(GL_COLOR_BUFFER_BIT);
GLCall(glDrawArrays(GL_TRIANGLES, 0, 6));
glfwSwapBuffers(window.getPointer());
glfwPollEvents();
}
return 0;
}
我确定你必须包括 glEnableVertexAttribArray(0);
尝试添加:
glEnableVertexAttribArray(0);
之后:
GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0));
我正在尝试在 linux 上使用 openGL 和 GLFW 渲染一个红色方块。但是,下面的代码只是生成了一个黑色背景的 window,我不明白为什么。 GLCall 宏仅用于错误检查目的,并不是问题的原因。
int main(){
Window window(1280, 720);
float vertices[] = {-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
0.5f, 0.5f,
-0.5f, 0.5f,
-0.5f, -0.5f
};
const char* vertexShader = "#version 330 core\n"
"layout (location = 0) in vec2 position;\n"
"void main(){\n"
"gl_Position = vec4(position, 0.0, 1.0);\n"
"}";
const char* fragmentShader = "#version 330 core\n"
"out vec4 color;\n"
"void main(){\n"
"color = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
"}";
GLuint vao;
GLCall(glGenVertexArrays(1, &vao));
GLCall(glBindVertexArray(vao));
GLuint vbo;
GLCall(glGenBuffers(1, &vbo));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, vbo));
GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0));
GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
GLCall(glShaderSource(vshader, 1, &vertexShader, NULL));
GLCall(glCompileShader(vshader));
GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
GLCall(glShaderSource(fshader, 1, &fragmentShader, NULL));
GLCall(glCompileShader(fshader));
GLuint shader = glCreateProgram();
GLCall(glAttachShader(shader, vshader));
GLCall(glAttachShader(shader, fshader));
GLCall(glLinkProgram(shader));
GLCall(glUseProgram(shader));
while(window.isOpen()){
glClear(GL_COLOR_BUFFER_BIT);
GLCall(glDrawArrays(GL_TRIANGLES, 0, 6));
glfwSwapBuffers(window.getPointer());
glfwPollEvents();
}
return 0;
}
我确定你必须包括 glEnableVertexAttribArray(0);
尝试添加:
glEnableVertexAttribArray(0);
之后:
GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0));