为什么我的OpenGL程序使用3.1上下文,但不适用于3.2及更高版本?

时间:2017-06-14 07:01:56

标签: opengl glfw

我一直在按照这个入门指南画一个三角形 -

http://www.glfw.org/docs/latest/quick.html

只要opengl版本为3.1或更低(使用glfwWindowHint),这个东西就能正常工作。对于3.2及更高版本,我得到的是黑屏,没有三角形。

我在3.3 - >

的着色器中进行了以下修改
orderBy

也没有错误。你能告诉我这里做错了什么吗?

注意:我正在使用glew。

注2:我的GPU通过了GLview for 3.2和3.3的渲染测试。

1 个答案:

答案 0 :(得分:0)

如果使用Core Profile 3.2+,则GLFW文档中引用的示例使用默认的顶点阵列对象(VAO)。在some driver implementations中,这意味着对glVertexAttribPointer的调用将失败:

OpenGL Core Profile

  

默认顶点数组对象   (名称为零)也已弃用。否时调用VertexAttribPointer   缓冲区对象或未绑定任何顶点数组对象将生成INVALID_-   操作错误,因为没有顶点时将调用任何数组绘制命令   数组对象已绑定。

在3.2+ Core Profiles中使用VAO的一种方法是创建并使用单个VAO实例来替换“名称为零”的默认VAO:

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// proceed as normal

最好在清理时使用glDeleteVertexArrays(1, &vao);删除VAO。可以在here中找到有关顶点数组对象的更多信息。