首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OGRE中使用SDL?

如何在OGRE中使用SDL?
EN

Stack Overflow用户
提问于 2009-12-30 15:22:02
回答 2查看 3.8K关注 0票数 5

当我将OGRESDL一起使用时(如this article中所述),出现在我的主渲染窗口后面的第二个窗口似乎有问题。基本上,我使用的代码是这样的:

代码语言:javascript
复制
SDL_init(SDL_INIT_VIDEO);
SDL_Surface *screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);

Ogre::Root *root = new Ogre::Root();
root->restoreConfig();
root->initialise(false);

Ogre::NameValuePairList windowSettings;
windowSettings["currentGLContext"] = Ogre::String("True");
Ogre::RenderWindow *window = root->createRenderWindow("MainRenderWindow", 640, 480, false, &windowSettings);
window->setVisible(true);

问题是,我如何摆脱额外的窗口?

仅供后人参考,我使用的是OGRE 1.6.4、Mac OS X 10.6.2和SDL 1.2.14。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-01 16:58:45

我最终自己解决了这个问题。问题最终是OGRE的Mac后端不支持currentGLContext选项,所以最好的解决方案是更改到SDL1.3(在撰写本文时直接从Subversion ),并使用SDL_CreateWindowFrom调用开始从OGRE创建的窗口获取事件。还需要注意的是,OGRE窗口需要将macAPI设置为cocoa,否则SDL将无法识别窗口句柄。

票数 7
EN

Stack Overflow用户

发布于 2016-10-04 18:47:38

我看到您已经解决了您的问题,但并不是所有用户都会对将SDL降级到1.3感到满意。您可以在OGRE中使用SDL2和通过SDL_CreateWindow创建的SDL2窗口。代码将如下所示:

代码语言:javascript
复制
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
    OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Cannot initialize SDL2!",
        "BaseApplication::setup");
}

Ogre::Root *root = new Ogre::Root();
root->restoreConfig();
root->initialise(false);

Ogre::NameValuePairList params; // ogre window / render system params
SDL_Window *sdlWindow = SDL_CreateWindow("myWindow", posX, posY, width, height, vflags);
// see SDL_CreateWindow docs / examples for how to populate posX, posY, width, height, and vflags according to your needs

SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
if (SDL_GetWindowWMInfo(sdlWindow, &wmInfo) == SDL_FALSE) {
    OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR,
        "Couldn't get WM Info! (SDL2)",
        "BaseApplication::setup");
}

params.insert(std::make_pair("macAPI", "cocoa"));
params.insert(std::make_pair("macAPICocoaUseNSView", "true"));

// grab a string representing the NSWindow pointer
Ogre::String winHandle = Ogre::StringConverter::toString((unsigned long)wmInfo.info.cocoa.window);

// assign the NSWindow pointer to the parentWindowHandle parameter
params.insert(std::make_pair("parentWindowHandle", winHandle));

Ogre::RenderWindow *ogreWindow = root->createRenderWindow("myWindowTitle", width, height, isFullscreen, &params);
// see OGRE documentation on how to populate width, height, and isFullscreen to suit your needs

// create OGRE scene manager, camera, viewports, etc
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1978883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档