30

Windows で物理シミュレーション エンジンとエディターを構築しています。Qt を使用してエディター部分をビルドし、OpenGL で SDL を使用してエンジンを実行したいと考えています。

私の最初のアイデアは、Qt のみを使用してエディターを構築し、できるだけ多くのコードをエンジン (リソース マネージャー、レンダラー、数学) と共有することでした。ただし、エディター内でシミュレーションを実行できるようにしたいと考えています。つまり、SDL スレッドを使用するシミュレーション コードも共有する必要があります。

だから、私の質問はこれです: SDL を使用して Qt ウィンドウに OpenGL をレンダリングする方法はありますか?

レンダリングするウィンドウ ハンドルを SDL に提供できる可能性があることを Web で読みました。誰もがそれを経験したことがありますか?

また、シミュレーターのスレッド部分は SDL スレッドを使用するため、問題を引き起こす可能性があります。

4

3 に答える 3

24

これは、私のプロジェクトで行うことを単純化したものです。通常のウィジェットと同じように使用できますが、必要に応じて 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 サーフェス サイズに設定することは理にかなっています。

于 2008-09-28T01:35:28.987 に答える
15

最初の答えのように機能するかもしれませんが、スレッド化が原因で問題が発生する可能性があります。スレッド化に関しては簡単な解決策はありません。ここでは、SDLQtとOpenGLメインループが相互作用します。楽しくない。

最も簡単で正直な解決策は、両方の部分を切り離すことです。SDLとQtが別々のプロセスで実行され、通信に何らかのメッセージングを使用するようにします(ここではd-busをお勧めします)。SDLをボーダレスウィンドウにレンダリングすると、エディタがメッセージを介してコマンドを送信します。

于 2008-10-06T16:37:13.837 に答える
3

QT から opengl へのレンダリングは些細なことです (そして非常にうまく機能します)。 http://www.devolution.com/pipermail/sdl/2003-January/051805.html

QT ウィジェットを opengl と直接混合することについての良い記事があり ます

于 2008-09-23T02:00:29.553 に答える