私はWindowsで物理シミュレーションエンジンとエディターを構築しています。 Qtを使用してエディター部分を構築し、OpenGLでSDLを使用してエンジンを実行したいと思います。
私の最初のアイデアは、Qtのみを使用してエディターを構築し、エンジン(リソースマネージャー、レンダラー、数学)とできるだけ多くのコードを共有することでした。ただし、エディター内でシミュレーションを実行できるようにもしたいと思います。 これは、SDLスレッドを使用するシミュレーションコードも共有する必要があることを意味します。
だから、私の質問はこれです:SDLを使用してQtウィンドウにOpenGLをレンダリングする方法はありますか?
レンダリングするウィンドウハンドルをSDLに提供できる可能性があることをWebで読みました。誰もがそれをドン経験したことがありますか?
また、シミュレータのスレッド部分はSDLスレッドを使用するため、問題が発生する可能性があります。
最初の答えのように機能するかもしれませんが、スレッドが原因で問題が発生する可能性があります。スレッド化に関しては簡単な解決策はありません。ここでは、SDLQtとOpenGLメインループが相互作用します。楽しくない。
最も簡単で正直な解決策は、両方の部分を切り離すことです。 SDLとQtが別々のプロセスで実行され、通信に何らかのメッセージングを使用するようにします(ここではd-busをお勧めします)。 SDLをボーダレスウィンドウにレンダリングし、エディタがメッセージを介してコマンドを送信することができます。
これは、私のプロジェクトで行うことを単純化したものです。通常のウィジェットと同じように使用できますが、必要に応じて、m_Screenオブジェクトを使用してSDLサーフェスに描画すると、ウィジェットに表示されます:)
#include "SDL.h"
#include <QWidget>
class SDLVideo : public QWidget {
Q_OBJECT
public:
SDLVideo(QWidget *parent = 0, Qt::WindowFlags f = 0) : QWidget(parent, f), m_Screen(0){
setAttribute(Qt::WA_PaintOnScreen);
setUpdatesEnabled(false);
// Set the new video mode with the new window size
char variable[64];
snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
putenv(variable);
SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
// initialize default Video
if((SDL_Init(SDL_INIT_VIDEO) == -1)) {
std:cerr << "Could not initialize SDL: " << SDL_GetError() << std::endl;
}
m_Screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
if (m_Screen == 0) {
std::cerr << "Couldn't set video mode: " << SDL_GetError() << std::endl;
}
}
virtual ~SDLVideo() {
if(SDL_WasInit(SDL_INIT_VIDEO) != 0) {
SDL_QuitSubSystem(SDL_INIT_VIDEO);
m_Screen = 0;
}
}
private:
SDL_Surface *m_Screen;
};
お役に立てれば
注:通常、このウィジェットの最小サイズと最大サイズの両方をSDLサーフェスサイズに設定することは理にかなっています。
QTからopenglへのレンダリングは簡単です(そして非常にうまく機能します)SDLの直接の経験はありませんが、それらの混合に関するサンプルアプリがここにあります。 http://www.devolution.com/pipermail/sdl/2003-January/051805.html
QT widgewtsをopenglと直接混合することについての良い記事がここにあります http://doc.trolltech.com/qq/qq26-openglcanvas.html 厳密に必要なものを少し超えていますが、かなり賢いです!