5

OpenGL関数glGenBuffers()で奇妙な問題に直面しています。私は、次のように宣言されたVBOを使用する非常に単純なアプリケーションを作成しています。

#include <QGLFunctions>
#include <QGLWidget>

class MyClass : public QGLWidget, protected QGLFunctions {
    GLuint vertexBufferObject;

    // ...
    GLuint makeBufferList(void);
}

GLuint MyClass::makeBufferList(void) {
    vertexBufferObject = 0;
    glGenBuffers(1, &vertexBufferObject);  // <-- Here it crashes

    // ... load data and render

    return vertexBufferList;
}

MyClass::MyClass(QWidget* parent) 
    : QGLWidget(parent),
      vertexBufferObject(0)
{
    QGLContext* context = new QGLContext(this->format());
    initializeGLFunctions(context);
    glInit();
}

MyClass::~MyClass() {
    glDeleteBuffers(1, &vertexBufferObject);
}

これはすべて、デバッグビルドで完全に正常に機能します。データは適切にレンダリングされ、プログラムは最終的に正しく終了します。ただし、リリースビルドでは、glGenBuffers()がプログラムをクラッシュさせます。0を返すか何もしないだけでなく、関数呼び出しですぐにクラッシュします。ただし、問題はリリースモードでのみ発生するため、デバッガーを使用して何が問題になっているのかを見つけることができません。

私はWindows7システムで作業しており、Qt4.8.1で開発しています。コンパイラはMSVC2010(Qt SDK)コンパイラです。

誰かが私が試みるかもしれない提案がありますか?

// 編集:

知っておくと便利かもしれません。GCC(Qt SDK)コンパイラを使用して、Macでまったく同じコードをコンパイルしようとしましたが、デバッグビルドとリリースビルドの両方が完全に正常に機能します。しかし、Windows 7では、問題は解決しません。

4

1 に答える 1

4

問題を発見しました(@MahmoudFayezのおかげで):問題はQt APIのバグが原因で、glGenBuffers()関数(および場合によっては他の関数も)がクラッシュします。この質問は、ここで説明する問題と直接同等です。

解決策は比較的単純ですが、あまり洗練されていません。QGLFunctionsの代わりにGLEWを使用してください。次の方法で問題を修正しました。

#include "glew.h"
#include <QGLWidget>

class MyClass : public QGLWidget {
    // ...same as the above
}

MyClass::MyClass(QWidget* parent) 
    : QGLWidget(parent),
      vertexBufferObject(0)
{ 
    makeCurrent();
    glewInit();
}

これですべてが解決しました。欠点は、これには追加の外部依存関係の使用が含まれるのに対し、Qtの使用は、可能な限り外部依存関係を最小限に抑えて、可能な限り互換性を保つことです。ただし、このバグが修正される前に、Qt5.0がリリースされるまで待つ必要があるようです。

最後のコメントとして:このバグのどの部分がクラッシュするリリースビルドのみを作成し、デバッグモードは作成しないのかを理解できませんでした。

于 2012-08-13T13:43:38.037 に答える