我正在Windows中构建物理模拟引擎和编辑器。我想使用Qt构建编辑器部分,我想使用SDL和OpenGL来运行引擎。
我的第一个想法是仅使用Qt构建编辑器,并与引擎(资源管理器,渲染器,数学)共享尽可能多的代码。但是,我还希望能够在编辑器中运行模拟。 这意味着我还必须共享使用SDL线程的模拟代码。
所以,我的问题是:有没有办法使用SDL将OpenGL渲染到Qt窗口?
我在网上看到,可以为SDL提供一个窗口句柄来渲染。有人有经验吗?
此外,模拟器的线程部分可能会出现问题,因为它使用SDL线程。
答案 0 :(得分:21)
这是我在项目中所做工作的简化。您可以像普通的小部件一样使用它,但是根据需要,您可以使用它的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曲面尺寸通常是有意义的。
答案 1 :(得分:14)
虽然您可能会像第一个答案那样开始工作,但您可能会因线程问题而遇到问题。在线程方面没有简单的解决方案,在这里你可以使用SDL Qt和OpenGL mainloop进行交互。不好玩。
最简单,最安全的解决方案是将两个部件分离。因此,SDL和Qt在不同的进程中运行,并让它们使用某种消息进行通信(我在这里推荐d-bus)。您可以将SDL渲染到无边框窗口,编辑器通过消息发送命令。
答案 2 :(得分:3)
从QT渲染到opengl是微不足道的(并且运行良好) 没有SDL的直接经验,但这里有一个关于混合它们的示例应用程序。 http://www.devolution.com/pipermail/sdl/2003-January/051805.html
有一篇很好的文章关于将QT widgewts直接与opengl混合在这里 http://doc.trolltech.com/qq/qq26-openglcanvas.html超出了你的严格要求,但相当聪明!
答案 3 :(得分:1)