문제

Windows에서 물리 시뮬레이션 엔진과 편집기를 구축 중입니다.Qt를 사용하여 편집기 부분을 구축하고 OpenGL과 함께 SDL을 사용하여 엔진을 실행하고 싶습니다.

나의 첫 번째 아이디어는 Qt만을 사용하여 편집기를 구축하고 엔진(리소스 관리자, 렌더러, 수학)과 최대한 많은 코드를 공유하는 것이었습니다.하지만 에디터 내에서 시뮬레이션을 실행할 수도 있었으면 좋겠습니다. 이는 SDL 스레드를 사용하는 시뮬레이션 코드도 공유해야 함을 의미합니다.

그래서 제 질문은 이렇습니다.SDL을 사용하여 OpenGL을 Qt 창으로 렌더링하는 방법이 있습니까?

웹에서 SDL에 렌더링할 창 핸들을 제공하는 것이 가능할 수도 있다는 글을 읽었습니다.누구든지 그런 경험이 있나요?

또한 시뮬레이터의 스레드 부분은 SDL 스레드를 사용하기 때문에 문제를 일으킬 수 있습니다.

도움이 되었습니까?

해결책

첫 번째 답변처럼 작동하도록 할 수도 있지만 스레딩으로 인해 문제가 발생할 가능성이 높습니다.스레딩에 관한 간단한 솔루션은 없으며 여기서는 SDL Qt와 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 위젯을 OpenGL과 직접 혼합하는 방법에 대한 좋은 기사가 있습니다.http://doc.trolltech.com/qq/qq26-openglcanvas.html 꼭 필요한 것 이상이지만 오히려 영리합니다!

이 라이브러리를 사용할 수 있습니다(데모 디렉토리 참조).

https://github.com/kronat/libqsdl

좋은 하루 되세요

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top