【问题标题】:OpenGL glClearColor always make a black screenOpenGL glClearColor 总是黑屏
【发布时间】:2016-11-21 09:11:00
【问题描述】:

我正在尝试在 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;
}

【问题讨论】:

    标签: c++ macos opengl


    【解决方案1】:

    glClearColor 与所有 OpenGL 函数一样,适用于当前 OpenGL 上下文。

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

    glfwMakeContextCurrent(window);
    

    在你的循环之前。

    来自glfwMakeContextCurrent docs:

    此函数使指定窗口的 OpenGL 或 OpenGL ES 上下文在调用线程上处于当前状态。一次只能在单个线程上使上下文成为当前上下文,并且每个线程一次只能有一个当前上下文。

    【讨论】:

      【解决方案2】:

      对于那些疯狂到使用纯 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,我使用 LoadLibraryGetProcAddress 和 将函数指针放在我的 Win32 函数库中。

      同样不值得:

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

      还有一件事。我使用了多个线程。所以这可能会有所帮助:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多