【问题标题】:Why does my OpenGL program work with a 3.1 context, but not with 3.2 and above?为什么我的 OpenGL 程序可以在 3.1 上下文中工作,但不能在 3.2 及更高版本上工作?
【发布时间】:2017-06-14 07:01:55
【问题描述】:

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

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

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

我在 3.3 的着色器中做了以下修改 ->

static const char* vertex_shader_text =
"#version 330\n"
"uniform mat4 MVP;\n"
"layout(location = 1) in vec3 vCol;\n"
"layout(location = 0) in vec2 vPos;\n"
"out vec3 color;\n"
"void main()\n"
"{\n"
"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
"    color = vCol;\n"
"}\n";

static const char* fragment_shader_text =
"#version 330\n"
"in vec3 color;\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"    FragColor = vec4(color, 1.0);\n"
"}\n";

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

注意:我正在使用 glew。

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

【问题讨论】:

  • 您是如何设置上下文的 OpenGL 版本的?你检查它是正确的吗?你检查着色器是否编译成功(使用glGetShaderiv)?您的 GPU 是否支持 OpenGL 3.2+?
  • Opengl 版本已使用glfwWindowHint 设置。我不确定这是否是正确的方法。但是,我检查了当前上下文的 opengl 版本(使用glGetIntegerv),它是 3.3。 “glCompileShader 的返回码”是什么意思?没有代码,编译着色器或链接对象也没有错误。我的 GPU 确实支持 OpenGL 3.2+。
  • 来自documentation for glCompileShader: "编译状态将作为着色器对象状态的一部分存储。[...] 可以通过调用glGetShaderiv 并带参数着色器GL_COMPILE_STATUS。”
  • 我已经检查过使用glGetShaderiv ,没有错误。也没有链接错误。与glGetProgramiv 核对。
  • @RasheduzzamanSourov 您在使用 VAO 吗? IIRC 他们在 3.3 中成为强制性的。那是 Core 还是 Compat 上下文?我建议您先尝试要求一个 Compat,看看是否能解决您的问题。如果是这样,那么你正在做一些不符合新标准的事情,你只需要剥离你的程序片段,直到它开始工作(或使用更智能的方法,如跟踪器或调试器)。

标签: opengl glfw


【解决方案1】:

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

OpenGL Core Profile

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

在 3.2+ 核心配置文件中使用 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找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多