SFML配合OpenGL 3.0上下文为什么会重复绘制?

3

我一直在使用SFML创建上下文和OpenGL 3.0编写3D应用程序。但是,当我尝试使用OpenGL 3.0创建上下文时,它似乎会将图像略微压缩并翻倍,中间有黑色条纹,并且屏幕看起来被绿色清除而不是红色。如果我将上下文改为2.1,它就可以正常绘制。最初我遇到了这个问题是使用现代OpenGL代码,但我提供了一个使用固定功能管线的示例,以使问题更明显。

#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>

int main()
{
    // create the window
    sf::ContextSettings settings;
    settings.depthBits = 24;
    settings.stencilBits = 8;
    settings.antialiasingLevel = 4;
    settings.majorVersion = 3;
    settings.minorVersion = 0;

sf::Window window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, settings);

// load resources, initialize the OpenGL states, ...
glClearColor(1.0, 0.0, 0.0, 1.0);

// run the main loop
bool running = true;
while (running)
{
    // handle events
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
        {
            // end the program
            running = false;
        }
    }

    // clear the buffers
    glClear(GL_COLOR_BUFFER_BIT);

    // draw...
    glBegin(GL_TRIANGLES);
    glVertex3f( 0.0, 1.0, 0.0);
    glVertex3f(-1.0,-1.0, 0.0);
    glVertex3f( 1.0,-1.0, 0.0);
    glEnd();

    // end the current frame (internally swaps the front and back buffers)
    window.display();
}

return 0;
}

如果我改变这两行代码:
   settings.majorVersion = 3;
   settings.minorVersion = 0;

对于这些:
   settings.majorVersion = 2;
   settings.minorVersion = 1;

窗口正常绘制。
以下是正在发生的情况的屏幕截图。 OpenGL 2.1 截图 OpenGL 3.0 截图 第二张图片有点混乱,因为我的电脑卡顿了。它不应该有那个橙色色调。
我的设置是: Ubuntu 12.10 Intel i7-3630QM Intel HD Graphics 4000
从glxinfo中获取: OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile OpenGL version string: 3.0 Mesa 9.0.2 OpenGL shading language version string: 1.30
从lspci中获取: Kernel driver in use: i915
我认为这可能是驱动程序问题,但我已经成功运行了使用GLUT和没有过时功能的OpenGL 3.0程序,所以它必须已经创建了有效的OpenGL 3.0上下文并且正常工作。
我非常困惑为什么会出现这种情况。

尝试在你的绘制函数上方添加window.setActive()。 - Syntactic Fructose
它能与英特尔的Windows驱动程序一起使用吗? - genpfault
非常有趣。glBegin/glEnd在3.0规范中肯定已经被弃用,但它并没有从中删除。我不认为这是你代码的问题。一定是驱动程序的错误。 - balajeerc
1个回答

0
SFML使用兼容性上下文,因为它内部仍然具有一些旧式OpenGL。您可以使用glBegin和glEnd等函数是因为兼容性上下文的存在。我不知道您问题的答案,但这个问题已经提出了一年了。如果您有解决方案,请发布出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接