请求兼容性时的核心OpenGL上下文?

时间:2017-07-13 18:20:00

标签: c++ opengl sfml

这是我的代码:

// Display.cpp

#include <memory>
#include <SFML/Graphics.hpp>
#include <GL/glew.h>

namespace Display
{
    constexpr static int WIDTH  = 1280; constexpr static int HEIGHT = 720;

    std::unique_ptr<sf::RenderWindow> window;
    void init() {
        sf::ContextSettings settings;
        settings.depthBits = 24;
        settings.majorVersion = 3;
        settings.minorVersion = 3; // OpenGL 3.3
        settings.attributeFlags = sf::ContextSettings::Default;

        window = std::make_unique<sf::RenderWindow>(sf::VideoMode(WIDTH, HEIGHT),
                                                    "Fcku",
                                                    sf::Style::Close,
                                                    settings);
        glewInit();
        glViewport(0, 0, WIDTH, HEIGHT);
    }

    void close() {
        window->close();     
    }

    void clear() {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    }

    void update() {
        window->display();
    }

    void checkForClose() {
        sf::Event e;
        while (window->pollEvent(e))
            if (e.type == sf::Event::Closed) close();
    }

    bool isOpen() {
        return window->isOpen();
    }

} // namespace Display

int main()
{
    Display::init();

    while (Display::isOpen()) {
        Display::clear();
        Display::update();

        Display::checkForClose();
    }
    return 0;
}

我像这样编译上面的文件:

g++ Display.cpp -Wall -O2 --std=c++14 -fexceptions -o test.o -lsfml-graphics -lsfml-audio -lsfml-network -lsfml-window -lsfml-system -lGL -lGLU -lGLEW -DGLEW_STATIC

(还没有编写一个makefile)

这会生成一个名为test的二进制文件,但是当我运行它时,我收到以下警告:

Warning: The created OpenGL context does not fully meet the settings that were requested
Requested: version = 4.1 ; depth bits = 24 ; stencil bits = 0 ; AA level = 0 ; core = false ; debug = false ; sRGB = false
Created: version = 3.3 ; depth bits = 24 ; stencil bits = 0 ; AA level = 0 ; core = true ; debug = false ; sRGB = false

这确实会创建一个黑色窗口(正如预期的那样),但我怀疑,一旦我开始在SFML/Graphics.hpp中使用绘图功能,它会发生段错误,因为当我尝试编译一个示例文件(它发生时)也打印了相同的错误。)

当我创建sf::ContextSettings时,我将attributeFlags设置为sf::ContextSettings::Default,因此根据我的理解,它应该创建兼容性上下文(因为SFML使用了一些遗留代码,这是一个必须)。

P.S。如果它很重要,我在Void Linux上安装了最新版本的所有我在这里使用的repos

1 个答案:

答案 0 :(得分:1)

好吧,似乎解决方案是使用OpenGL 3.0而不是3.3,它支持兼容性配置文件。但是现在我不能使用GLSL 3.30而且它很乱,所以我会尝试SDL2,GLFW和Raylib。