【发布时间】: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,看看是否能解决您的问题。如果是这样,那么你正在做一些不符合新标准的事情,你只需要剥离你的程序片段,直到它开始工作(或使用更智能的方法,如跟踪器或调试器)。