丢失OpenGL输出

时间:2013-03-29 21:36:44

标签: c++ qt opengl

一周前我将操作系统升级到最新版本,因此GLEW,nVidia驱动程序,g ++,Qt等都升级了。那天我的QGLWidget停止显示原始OpenGL 3.3内容,只有基于2D QPainter的内容。由于我的机器上没有其他OpenGL应用程序(包括我的DE)受到影响,我必须在我的应用程序中编写一些狡猾的代码,这些代码可能已被这些库的旧版本所允许 - 现在已经修改过了。

我有很多抽象的OpenGL代码,很多潜在的失败地方;并且在尝试从它获得任何类型的输出几天之后(glGetError()在我开始搞乱它之前没有返回错误),我决定最好的办法是尽可能地编写最简单的OpenGL应用程序然后慢慢地建立它直到它破裂。

但我甚至不能出现三角形!

void Viewer::initializeGL()
{
    //  Initialise GLEW, compile/link fragment and vertex shaders, error check, etc.
    ...

    //  Create default VAO.
    glGenVertexArrays( 1, &vao_ );
    glBindVertexArray( vao_ );

    glUseProgram( shader_ );
    vVertex_ = glGetAttribLocation( shader_, "vVertex" );

    //  Create the test triangle VBO.
    glGenBuffers( 1, &vbo_ );
    glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
    glEnableVertexAttribArray( vVertex_ );
    glVertexAttribPointer( vVertex_, 3, GL_FLOAT, false, 0,
                           reinterpret_cast< GLvoid* >( 0 ) );

    //  Upload the data to the GPU.
    static const float verts[9] = { 0.0f, 0.0f, -0.5f,
                                    1.0f, 0.0f, -0.5f,
                                    0.5f, 1.0f, -0.5f };
    glBufferData( GL_ARRAY_BUFFER, sizeof( verts ),
                  static_cast< const void* >( verts ), GL_STATIC_DRAW );

    glBindBuffer( GL_ARRAY_BUFFER, GL_NONE );
    glDisableVertexAttribArray( vVertex_ );
    Sy_GL::checkError();
}

void Viewer::paintGL()
{
    //  Clear the buffers.
    qglClearColor( QColor( Qt::black ) );
    glClear( GL_COLOR_BUFFER_BIT );

    glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

    glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
    glEnableVertexAttribArray( vVertex_ );
    glVertexAttribPointer( vVertex_, 3, GL_FLOAT, false, 0,
                           reinterpret_cast< GLvoid* >( 0 ) );


    glDrawArrays( GL_TRIANGLES, 0, 3 );

    glBindBuffer( GL_ARRAY_BUFFER, GL_NONE );
    glDisableVertexAttribArray( vVertex_ );

    Sy_GL::checkError();
}

我没有将我的VAO用于它的用途,因为VAO不能在上下文中共享,这是我的“真实”应用程序中的场景,所以我在这里复制这种情况。 Sy_GL::checkError()只调用glGetError()并在出现问题时抛出异常。我的两个着色器不可能更简单:

//  Vertex shader.
#version 330
in vec3 vVertex;
void main( void )
{
    gl_Position = vec4( vVertex, 1.0 );
}

//  Fragment shader (in different file).
#version 330
out vec4 fragColour;
void main( void )
{
    fragColour = vec4( 1.0, 0.0, 0.0, 1.0 );
}

这应该在黑色背景上显示红线呈现的三角形,但我只是得到黑色背景 - 没有控制台输出或例外。我的系统确实支持OpenGL 3.3及更高版本,这是我的glxinfo输出的顶部:

name of display: :0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4

我的glewinfo输出:

GLEW version 1.9.0
Reporting capabilities of display :0, visual 0x2b
Running on a GeForce GTX 560 Ti/PCIe/SSE2 from NVIDIA Corporation
OpenGL version 4.3.0 NVIDIA 310.32 is supported

所以我的问题是:我的代码错了吗?或者我的系统是否非常巧妙地损坏了?

修改

QGLFormat似乎报告我只有 OpenGL v1.0 - Qt使用什么机制来获取该值?

在我的“真实”应用程序中,我使用QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_3_3执行OpenGL版本检查,然后通过;但使用myQGLWidget->format().majorVersion()myQGLWidget->format().minorVersion()分别返回10

编辑2

有趣的是,如果我在main.cpp中设置v3.3的默认QGLFormat

QGLFormat format( QGL::DoubleBuffer |
                  QGL::DepthBuffer |
                  QGL::AlphaChannel );
format.setVersion( 3, 3 );
QGLFormat::setDefaultFormat( format );

它首先突破我的 OpenGL调用,特别是glGenVertexArrays(1, &vao_),但myQGLWidget->format().majorVersion()myQGLWidget->format().minorVersion()返回3和{{1}分别。

1 个答案:

答案 0 :(得分:1)

我们最近有这个工作。原因是最新的NVIDIA驱动程序,它打破了主要和次要版本查询。

编辑:我认为可能与在设置有效的GL上下文之前调用这些函数有关。 结束修改

所以,你可以尝试使用稍微老一点的驱动程序。但是,某些Qt版本和glversion也存在问题。检查此链接:

http://qt-project.org/forums/viewthread/20424