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()
戻ります。1
0
編集 2
興味深いことに、QGLFormat
main.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()
return3
と3
それぞれで segfault します。