OpenGL glClearColor总是会出现黑屏

时间:2016-11-21 09:11:00

标签: c++ macos opengl

我正在尝试用C ++运行我的第一个opengl程序,它打开一个窗口,设置背景颜色,并从Mac OS X上的终端给出一个标题。

代码编译和链接很好。当我运行程序时,窗口和标题打开很好,但背景颜色总是黑色。

我的理解是函数glClearColor设置背景颜色。但是,无论我传递给函数的参数是什么,窗口的背景颜色总是黑色。

如果有人能向我解释我正在犯的错误,我会非常感激。谢谢,下面是代码:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>

#include <GLFW/glfw3.h>

const GLint WIDTH = 800, HEIGHT = 600;

int main()
{
    glfwInit();

    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);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Learn OpenGL", nullptr, nullptr);

    int screenWidth, screenHeight;
    glfwGetFramebufferSize(window, &screenWidth, &screenHeight);

    if(nullptr == window)
    {
        std::cout << "Failed to create GLFW window" << '\n';
        glfwTerminate();

        return -1;
    }

    glewExperimental = GL_TRUE;
    GLenum err=glewInit();

    if(err != glewInit())
    {
        std::cout << "Failed to initialize GLEW" << '\n';

        return -1;
    }

    glViewport(0, 0, screenWidth, screenHeight);

    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();

        glClearColor(0.2f, 0.2f, 0.9f, 0.5f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
    }

    glfwTerminate();

    return 0;
}

2 个答案:

答案 0 :(得分:5)

与所有OpenGL函数一样,

false适用于当前的OpenGL上下文。

您没有将窗口的上下文设置为调用线程的当前上下文,因此您对glClearColor的调用在此处不执行任何操作。添加:

glClearColor
在你的循环之前

来自glfwMakeContextCurrent docs:

  

此函数使指定窗口的OpenGL或OpenGL ES上下文在调用线程上是当前的。上下文一次只能在一个线程上进行,并且每个线程一次只能有一个当前上下文。

答案 1 :(得分:0)

对于那些疯狂到使用纯 WIN32 编程的人:

如果您的PIXELFORMATDESCRIPTOR具有标志:

PFD_DOUBLEBUFFER

然后所有绘制调用均以后台缓冲区为目标。

您需要使用Windows GDI32调用“ SwapBuffers(HDC)” 来显示OpenGL调用的结果。

wlgMakeCurrent()
glClearColor( R, G, B, 1.0 ); //: <--Make sure alpha isn't transparent.
glClear( GL_COLOR_BUFFER_BIT )
SwapBuffers( your_window_HDC ); //: from GDI32.dll

要访问SwapBuffers,请使用 LoadLibrary GetProcAddress ,然后 将函数指针放在我的Win32函数库中。

也不值得:

与线程调用相同的线程上调用SwapBuffers。

还有一件事。我使用了多个线程。因此,了解以下信息可能会有所帮助:

    1. 我的窗口是在线程“ B”中创建的
    1. 我的上下文是使用线程“ B”中的HDC在线程“ A”中创建的
    1. 我的openGL绘制调用位于线程“ A”中。

之所以提到这一点,是因为在我发现 SwapBuffers 之前,我认为问题是由于我的多线程。 OpenGL并没有给我任何错误,所以我不得不四处猜测并进行实验和阅读。