OpenGL 程序不渲染
OpenGL Program Does Not Render
我有一个 Mac 运行 OS X Yosemite 使用 GLFW 3 和 OpenGL 4.1。我有这个程序:
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/string_cast.hpp>
#include <stdio.h>
#include "myglutils.hpp"
int main() {
if (!setupGLFW()) return 1;
setupApple();
GLFWwindow* window = glfwCreateWindow(640, 480, "Perspective", 0, NULL);
if (!window) {
fprintf(stderr, "Failed to create window.\n");
glfwTerminate();
return 0;
}
glfwMakeContextCurrent(window);
if (!setupGLEW()) return 1;
glClearColor(0.2, 0.0, 0.8, 1.0);
const GLfloat vertices[] = {
-1.0, -1.0,
1.0, -1.0,
0.0, 1.0
};
const GLchar* vert_shader =
"#version 410 core\n"
"in vec2 pos;"
"uniform mat4 MVP;"
"void main() {"
" gl_Position = MVP * vec4(pos, 0.0, 1.0);"
"}";
const GLchar* frag_shader =
"#version 410 core\n"
"out vec4 color;"
"void main() {"
" color = vec4(1.0, 0.0, 0.0, 1.0);"
"}";
GLuint shader = getShader(vert_shader, frag_shader);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLuint MVPID = glGetUniformLocation(shader, "MVP");
glm::mat4 perspective = glm::perspective(45.0, 4.0 / 3.0, 0.1, 100.0);
glm::mat4 view = glm::lookAt(glm::vec3(4.0, 3.0, 3.0), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));
glm::mat4 MVP = perspective * view;
while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader);
glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1, &vao);
glDeleteProgram(shader);
glfwTerminate();
return 0;
}
函数 setupGLFW()
、setupApple()
和 setupGLEW()
不是问题所在。 getShader()
也不是。我觉得我的错误很愚蠢,比如忘记了一个简单的 OpenGL 函数调用。我想要做的是以 3D 角度绘制一个三角形。
注意:该程序编译完美,但只显示空蓝屏。
此代码中存在许多问题。最主要的是你从不启用顶点属性数组。您需要在设置代码中添加 glEnableVertexAttribArray()
调用:
glBindVertexArray(vao);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
此外,glDrawArrays()
的参数不正确:
glDrawArrays(GL_TRIANGLES, 0, 6);
第三个参数是顶点数。因为你只有 3 个顶点,所以它应该是:
glDrawArrays(GL_TRIANGLES, 0, 3);
此外,除非在代码中解决了这一点,而您没有 post,否则您需要确保您使用的属性位置与程序匹配。您在代码中使用 0
,但您不能指望位置为零而不采取任何进一步操作。解决此问题的最简单方法是在着色器代码中使用 location
布局限定符:
"layout(location=0) in vec2 pos;"
这会将位置设置为 0,与您的代码匹配。
我有一个 Mac 运行 OS X Yosemite 使用 GLFW 3 和 OpenGL 4.1。我有这个程序:
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/string_cast.hpp>
#include <stdio.h>
#include "myglutils.hpp"
int main() {
if (!setupGLFW()) return 1;
setupApple();
GLFWwindow* window = glfwCreateWindow(640, 480, "Perspective", 0, NULL);
if (!window) {
fprintf(stderr, "Failed to create window.\n");
glfwTerminate();
return 0;
}
glfwMakeContextCurrent(window);
if (!setupGLEW()) return 1;
glClearColor(0.2, 0.0, 0.8, 1.0);
const GLfloat vertices[] = {
-1.0, -1.0,
1.0, -1.0,
0.0, 1.0
};
const GLchar* vert_shader =
"#version 410 core\n"
"in vec2 pos;"
"uniform mat4 MVP;"
"void main() {"
" gl_Position = MVP * vec4(pos, 0.0, 1.0);"
"}";
const GLchar* frag_shader =
"#version 410 core\n"
"out vec4 color;"
"void main() {"
" color = vec4(1.0, 0.0, 0.0, 1.0);"
"}";
GLuint shader = getShader(vert_shader, frag_shader);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLuint MVPID = glGetUniformLocation(shader, "MVP");
glm::mat4 perspective = glm::perspective(45.0, 4.0 / 3.0, 0.1, 100.0);
glm::mat4 view = glm::lookAt(glm::vec3(4.0, 3.0, 3.0), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));
glm::mat4 MVP = perspective * view;
while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader);
glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1, &vao);
glDeleteProgram(shader);
glfwTerminate();
return 0;
}
函数 setupGLFW()
、setupApple()
和 setupGLEW()
不是问题所在。 getShader()
也不是。我觉得我的错误很愚蠢,比如忘记了一个简单的 OpenGL 函数调用。我想要做的是以 3D 角度绘制一个三角形。
注意:该程序编译完美,但只显示空蓝屏。
此代码中存在许多问题。最主要的是你从不启用顶点属性数组。您需要在设置代码中添加 glEnableVertexAttribArray()
调用:
glBindVertexArray(vao);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
此外,glDrawArrays()
的参数不正确:
glDrawArrays(GL_TRIANGLES, 0, 6);
第三个参数是顶点数。因为你只有 3 个顶点,所以它应该是:
glDrawArrays(GL_TRIANGLES, 0, 3);
此外,除非在代码中解决了这一点,而您没有 post,否则您需要确保您使用的属性位置与程序匹配。您在代码中使用 0
,但您不能指望位置为零而不采取任何进一步操作。解决此问题的最简单方法是在着色器代码中使用 location
布局限定符:
"layout(location=0) in vec2 pos;"
这会将位置设置为 0,与您的代码匹配。