OpenGL程序仅显示黑窗 无法绘制预期红色三角形问题求助
OpenGL黑窗无法渲染红色三角形故障排查
问题表现
程序编译无报错,自定义着色器校验函数未返回错误,运行后仅弹出黑色窗口,无法渲染预期的红色三角形。运行环境为搭载NVIDIA GeForce 320M 256MB显卡(支持OpenGL 3.3及以上版本)的macOS 10.13.6 High Sierra设备,开发工具为XCode 9.4.1。
代码中存在的根因
- 着色器编译校验逻辑完全失效:
CompilaShader函数中声明的int* risultato是未初始化的野指针,直接传给glGetShaderiv属于未定义行为,根本无法获取真实的着色器编译状态,因此会出现着色器实际编译失败但没有错误提示的情况。同时打印错误日志时*message的写法也是错的,message本身就是字符串首地址,不需要解引用。 - 片元着色器存在语法错误:片元着色器中
color = vec4 (1.0, 0.0, 0.0, 1.0)行末尾缺少分号,会直接导致片元着色器编译失败。 - OpenGL调用时机错误:所有OpenGL相关操作(着色器创建、VAO/VBO分配、顶点属性配置)都在
glfwMakeContextCurrent(window)之前执行,此时线程没有绑定有效的OpenGL上下文,所有GL函数调用都不会生效。 - macOS平台未指定OpenGL上下文版本:GLFW在macOS下默认创建旧版兼容模式OpenGL上下文,不支持代码中使用的3.3核心模式GLSL语法,必须提前通过窗口提示指定上下文版本。
修复方案
- 修复着色器校验逻辑的野指针问题:
将CompilaShader中的
int* risultato; int lenght;
修改为
int risultato = 0; int lenght;
对应glGetShaderiv传参改为传地址:
glGetShaderiv(id, GL_COMPILE_STATUS, &risultato);
错误判断逻辑改为:
if (risultato == GL_FALSE)
日志打印处去掉message的解引用:
std::cout << message << std::endl;
- 补全片元着色器的分号:
color = vec4 (1.0, 0.0, 0.0, 1.0);
- 调整代码执行顺序:将
glfwMakeContextCurrent(window)调用移动到glfwCreateWindow成功之后,所有OpenGL相关操作(着色器创建、VAO/VBO配置等)之前。 - 在
glfwInit成功之后、glfwCreateWindow之前添加macOS平台必需的OpenGL上下文配置:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
完成以上修改后重新编译运行即可正常显示红色三角形。
内容的提问来源于stack exchange,提问作者LSD_Sumus
相关产品推荐
相关产品推荐

