当我将OGRE与SDL一起使用时(如this article中所述),我似乎遇到了出现在主渲染窗口后面的第二个窗口的问题。基本上,我正在使用的代码是:
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。
答案 0 :(得分:7)
我最终自己搞清楚了。问题最终是OGRE的Mac GL后端不遵守currentGLContext
选项,所以最好的解决方案是更改为SDL 1.3(直接来自Subversion,截至编写时)并使用SDL_CreateWindowFrom
调用从OGRE创建的窗口开始获取事件。还应注意,OGRE窗口需要将macAPI
设置为cocoa
,否则SDL将无法识别窗口句柄。
答案 1 :(得分:2)
我发现您已经解决了问题,但并非所有用户都满意将SDL降级为1.3。您可以使用SDL2和通过SDL_CreateWindow与OGRE创建的SDL2窗口。代码看起来像这样:
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, ¶ms);
// see OGRE documentation on how to populate width, height, and isFullscreen to suit your needs
// create OGRE scene manager, camera, viewports, etc