我有一台运行OS X Yosemite的Mac,带有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()
也不是。RewriteBase /
RewriteRule ^subfolder/(.*) http://library.provider.com/$1 [NC,P]
。我觉得我的错误就像忘记一个简单的OpenGL函数调用一样愚蠢。我想要做的是以3D角度画一个三角形。
注意:此程序编译完美,但只显示空蓝屏。
答案 0 :(得分:3)
此代码中存在许多问题。主要的一点是你从不启用顶点属性数组。您需要在设置代码中添加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);
此外,除非您在未发布的代码中处理此问题,否则您需要确保您使用的属性位置与程序匹配。您在代码中使用了0
,但是如果没有任何进一步的操作,您就不能指望该位置为零。解决此问题的最简单方法是在着色器代码中使用location
布局限定符:
"layout(location=0) in vec2 pos;"
这会将位置设置为0,与您的代码匹配。