4

Qtユーザーが知っているように、OpenGL拡張機能の使用は非常に面倒な場合があります。私がそれを機能させた方法は、次のようにQGLFunctionsクラスを拡張することです。

 class Object3D : protected QGLFunctions{ 
 ... 
 }

Object3DがglGenBuffer()などの関数を呼び出すことができるように正しく機能するためには、呼び出す必要があります。

initializeGLFunctions(glWidget->context());

QGLWidgetが作成された後、そうでない場合は、拡張関数を使用するとアプリケーションがクラッシュします。Object3Dの存在中に、最終的に「glGenBuffer()」などを呼び出すことができますが、「glDeleteBuffer()」呼び出しを含む〜Object3D()呼び出しでクラッシュするようです。アプリケーションがクラッシュするのはその呼び出しだと確信しています。

誰もがこの問題を解決する方法を知っていますか?これは、Object3Dの前にQGLWidgetが最初に削除されているため、QGLWidgetのコンテキストがなくなっているためと思われます。その場合、QGLWidgetがQMainWindowに追加され、追加された順序で子が削除されるため、QGLWidgetが最後に削除されたことを確認するにはどうすればよいですか?

4

1 に答える 1

2

一般的なルールは、コンテキストがまだ存在している間にOpenGL RAIIオブジェクトが破棄されることを保証できない場合は、OpenGLオブジェクトをRAIIC++クラス内にラップしないことです。他の方法でOpenGLオブジェクトの存続期間を管理します。

それはあなたのコードです(あなたが私たちに見せることを怠った)。クラスの破壊をどこで、どのように管理するかを決めることができるのはあなただけです。物事が適切な順序で破壊(および作成)されることを保証するオブジェクトを管理するためのシステムが必要です。

于 2012-11-11T23:57:28.270 に答える