尝试在openGL中创建空白窗口时出现异常输出

Posted

技术标签:

【中文标题】尝试在openGL中创建空白窗口时出现异常输出【英文标题】:Unusual output when trying to Create a blank window in open GL 【发布时间】:2016-08-06 11:47:12 【问题描述】:

我正在尝试借助 GLFW 在 OpenGL 中创建一个空白窗口。下面是我的代码

#include <stdio.h>
#include <stdlib.h>

#include <GL/glew.h>

#include <glfw3.h>
GLFWwindow* window;

#include <glm/glm.hpp>
using namespace glm;

int main( void )


    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    window = glfwCreateWindow(800,600,"learnopengl",NULL,NULL);
    if (window == NULL)
    
        fprintf(stderr,"there is a problem with window creation\n");
        glfwTerminate();
        return -1;
    
    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK)
    
        fprintf(stderr,"Failed to initialize GLEW\n");
        return -1;
    
    int width, height;
    glfwGetFramebufferSize(window,&width,&height);

    glViewport(0,0,width,height);

while(!glfwWindowShouldClose(window))

    glfwPollEvents();
    glfwSwapBuffers(window);



    glfwTerminate();

但是当我尝试运行上面的代码而不是黑色空白时,它会在新创建的窗口中显示我当前屏幕的一个实例。

【问题讨论】:

我第一次启动 OpenGL 时遇到了同样的问题。它归结为缺少依赖项或版本太旧。我不记得确切是哪一个,但这应该会为您指明正确的方向。 【参考方案1】:

为什么您希望这段代码会导致空白窗口?

根据规范,在您交换缓冲区后,后台缓冲区的内容会变为 undefined(最初,它们当然也是未定义的)。结果,您应该得到的输出也是未定义的,基本上任何东西都可能出现。

如果您想要一些已定义的输出,请将 glClear(GL_COLOR_BUFFER_BIT) 添加到您的渲染循环中。

【讨论】:

【参考方案2】:

我知道答案迟了,但可能会关心其他人并帮助他们,我运行了这段代码,它运行得很好,但问题不在于你的代码,它是你的显卡驱动程序,所以发生了什么? OpenGL 有所谓的“默认帧缓冲区”,它是用于创建 OpenGL 的帧缓冲区(缓冲区包含您将看到的内容)。它与 OpenGL 上下文一起创建。与 Framebuffer Objects 一样,默认的帧缓冲区是一系列图像。与 FBO 不同,这些图像之一通常代表您在屏幕的某些部分实际看到的内容。换句话说,默认帧缓冲区是操作系统用于渲染桌面和其他应用程序窗口的缓冲区,因此您的应用程序正在使用默认帧缓冲区,因为您的应用程序不会编辑帧缓冲区,因此您可能需要清除帧缓冲区其他一些值,比如颜色。这是使用颜色清除缓冲区编辑的代码。

#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <glfw3.h>

GLFWwindow* window;

#include <glm/glm.hpp>
using namespace glm;

int main( void )


 glfwInit();
 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
 glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
 window = glfwCreateWindow(800,600,"learnopengl",NULL,NULL);
 if (window == NULL)
 
     fprintf(stderr,"there is a problem with window creation\n");
     glfwTerminate();
     return -1;
 
 glfwMakeContextCurrent(window);

 glewExperimental = GL_TRUE;
 if (glewInit() != GLEW_OK)
 
     fprintf(stderr,"Failed to initialize GLEW\n");
     return -1;
 
 int width, height;
 glfwGetFramebufferSize(window,&width,&height);

 glViewport(0,0,width,height);
 
 //this is an added line
 glClearColor(1, 1, 1, 1); //the RGBA color we will clear with
 
 while(!glfwWindowShouldClose(window))
 
   glfwPollEvents();
   //this is an added line
   glClear(GL_COLOR_BUFFER_BIT); //the buffer used to clear with

   glfwSwapBuffers(window);
 


  glfwTerminate();
  

希望此答案和此代码可以帮助其他可能遇到这种情况的人。 有关帧缓冲区的更多信息,请查看此链接:https://learnopengl.com/Advanced-OpenGL/Framebuffers

【讨论】:

以上是关于尝试在openGL中创建空白窗口时出现异常输出的主要内容,如果未能解决你的问题,请参考以下文章

在 Win 7 上使用带 ANGLE 的 Qt 时出现空白窗口

在 Appdata 文件夹中创建文本文件时出现异常,它说文件正在被另一个进程使用

在 Java 中创建列表列表时出现意外输出

编译c ++项目/ Open GL时出现纹理错误

尝试在 Kafka 中创建分区时出现 NoClassDefFoundError

当我尝试在 Android Studio 中添加新活动时出现问题,弹出新活动选项窗口为空白/白色