5

SDLでOGREを使用する場合(この記事で説明)、メインのレンダリング ウィンドウの背後に表示される 2 つ目のウィンドウに問題があるようです。基本的に、私が使用しているコードは次のとおりです。

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 を使用しています。

4

2 に答える 2

7

私は自分でこれを理解することになった。問題は、OGREのMac GLバックエンドがcurrentGLContextオプションを尊重しないことです。したがって、最善の解決策は、SDL 1.3に変更し(執筆時点ではSubversionから直接)、SDL_CreateWindowFrom呼び出しを使用して、によって作成されたウィンドウからイベントの取得を開始することです。鬼。macAPIOGREウィンドウをに設定する必要があることにも注意してくださいcocoa。そうしないと、SDLはウィンドウハンドルを認識しません。

于 2010-01-01T08:58:45.427 に答える
2

あなたはすでに問題を解決しているようですが、すべてのユーザーが SDL を 1.3 にダウングレードすることに満足しているわけではありません。SDL2 と、SDL_CreateWindow で作成した SDL2 ウィンドウを OGRE で使用できます。コードは次のようになります。

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
于 2016-10-04T10:47:38.000 に答える