【问题标题】:OpenGL 4.5 : glClear() doesn't work (using SDL2 and GLEW)OpenGL 4.5:glClear() 不起作用(使用 SDL2 和 GLEW)
【发布时间】:2016-07-04 16:36:46
【问题描述】:

为了使用 OpenGL 4.5 (GLEW API) 清除黑色的 SDL2 窗口,我编写了一个简短的代码。但是,它仅在我使用我的英特尔芯片组时才有效(在这种情况下,应该使用较旧的 OpenGL 版本)。问题是如果我使用我的 Nvidia GTX 960M,窗口仍然是空白的。也许我忘了写一些特定于 OpenGL 4.5 的东西?你对此有任何想法吗?这是代码示例:

DisplayContext::DisplayContext(PropertiesDictionary properties)
{
    const string windowTitle = properties.getString("window_title");
    const int screenX = properties.getNumber("screen_resolution_x");
    const int screenY = properties.getNumber("screen_resolution_y");
    const bool isFullscreen = properties.getBoolean("fullscreen");

    const int gl_majorVersion = properties.getNumber("gl_major_version");
    const int gl_minorVersion = properties.getNumber("gl_minor_version");
    const int doublebuffer = properties.getNumber("gl_doublebuffer");
    const int depthSize = properties.getNumber("gl_depth_size");
    const bool isGlewExperimental = properties.getBoolean("glew_experimental");

    SDL_Init(SDL_INIT_VIDEO);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, gl_majorVersion); // 4
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, gl_minorVersion); // 5
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, doublebuffer); // TRUE
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, depthSize); // 24

    window = SDL_CreateWindow(
        windowTitle.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screenX, screenY,
        SDL_WINDOW_OPENGL | (isFullscreen ? SDL_WINDOW_FULLSCREEN : NULL));

    context = SDL_GL_CreateContext(window);
    glewExperimental = isGlewExperimental ? GL_TRUE : GL_FALSE; // TRUE
    glewInit();

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    SDL_GL_SwapWindow(window);
}

【问题讨论】:

  • 检查 SDL 和 GL 返回的错误。
  • glewInit 在两个显卡上都成功了吗?
  • @SurvivalMachine glewInit() 在 GTX960M 卡上返回 FALSE。它在 Intel 芯片组上返回 TRUE。所以错误似乎就在这里。但我不明白为什么......你认为我应该使用另一个 API 吗?
  • 您的 GTX 驱动程序是最新的吗?你可以为它创建一个旧的 OpenGL 上下文,比如 3.3 吗?
  • 对于您想做的事情,您不需要 GLEW。 glewInit 很可能会失败,因为您一开始就没有获得有效的 OpenGL。我最好的猜测是,您正在尝试使用 Mesa OpenGL 实现来使用您的 NVidia GPU。使用多供应商 OpenGL 曾经是一个 PITA。最终,NVidia 开发了github.com/NVIDIA/libglvnd,它消除了并排安装多个 OpenGL 实现时的大部分痛苦。我强烈建议您安装并使用它。可能需要一些手动工作才能使您的 Linux 发行版能够配合。

标签: c++ opengl sdl-2 glew opengl-4


【解决方案1】:

我将双缓冲选项切换为 FALSE,它可以工作。我意识到如果双缓冲打开,我需要在看到黑色窗口背景之前进行几次“交换”。这是有道理的,但很奇怪。顺便说一句,我最终使用 GLFW 而不是 SDL2。

【讨论】:

  • “我终于使用 GLFW 而不是 SDL2” - 请记住,与 SDL 相比,它缺少 许多 有用的功能。你甚至不能用它来最大化一个窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多