1

1 週間前に OS を最新バージョンにアップグレードしたので、GLEW、nVidia ドライバー、g++、Qt などもすべてアップグレードされました。それは、私QGLWidgetが未加工の OpenGL 3.3 コンテンツを表示するのをやめ、2DQPainterベースのものだけを表示した日で​​した。私のマシン上の他の 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()私の 2 つのシェーダーはこれ以上単純ではありません。

//  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

だから私の質問は:私のコードは間違っていますか? それとも、私のシステムは非常に微妙に損傷していますか?

編集

私はOpenGL v1.0QGLFormatしか持っていないと報告しているようです- Qt はその値を取得するためにどのメカニズムを使用していますか?

私の「実際の」アプリケーションでは、 を使用して OpenGL のバージョン チェックを実行しましたQGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_3_3が、これは合格です。しかし、それぞれを使用myQGLWidget->format().majorVersion()してmyQGLWidget->format().minorVersion()戻ります。10

編集 2

興味深いことに、QGLFormatmain.cpp でデフォルトの v3.3を設定すると、次のようになります。

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

最初のOpenGL 呼び出し、具体的glGenVertexArrays(1, &vao_)には , butmyQGLWidget->format().majorVersion()myQGLWidget->format().minorVersion()return33それぞれで segfault します。

4

1 に答える 1

1

最近、これが職場で発生しました。原因は最新の NVIDIA ドライバーで、メジャー バージョンとマイナー バージョンのクエリが壊れていました。

編集:有効なGLコンテキストを設定する前にこれらの関数を呼び出すことに関連していた可能性があると思います. 編集を終了

そのため、少し古いドライバーで試すことができます。ただし、一部の Qt バージョンと glversion にも問題があります。このリンクをチェックしてください:

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

于 2013-03-30T11:00:57.247 に答える