2017-01-28 5 views
1

私はtypedefであるSFMLSFMLが提供するX11ハンドルからIrrlichtデバイスを作成する。ランタイムX11/OpenGLはエラー

もちろん sf::WindowHandle

sf::WindowHandle sf::Window::getSystemHandle() const戻り、によって作成されたウィンドウにイルリヒトを使用してレンダリングします。 WindowsではHWND__*、Linuxではunsigned long(これはprobbaly X11 windows IDです)、他のプラットフォームではです。 Irrlichtのドキュメントでは、Windows上でHWNDを渡すべきだと言いますが、他のシステムについては何もありません。

Irrlichtは、外部ウィンドウからの特殊なメソッドを持つメインオブジェクトirr::IrrlichtDeviceを作成することができます。それにはstruct irr::SIrrlichtCreationParametersが必要です。構造体変数の1つはvoid* WindowId

です。私がしようとしているのは、SFMLを使用してウィンドウを作成し、後でこのウィンドウ内にIrrlichtをレンダリングするSFML関数を使用することです。

コアコード:私の機能の

sf::VideoMode desktop = sf::VideoMode::getDesktopMode(); 
sf::ContextSettings settings; 
settings.antialiasingLevel = 8; 
settings.depthBits = 16; 
settings.stencilBits = 0; 

//my own Logger class 
logger.AddLog("Requesting following settings:\n"); 
logger.AddLog(settings); 

window = std::make_shared<sf::RenderWindow>(
    sf::VideoMode(WINDOW_SIZE_X, WINDOW_SIZE_Y, desktop.bitsPerPixel), 
    sf::String("Irrlicht + SFML test"), 
    sf::Style::Default, 
    settings); 

logger.AddLog("Created SFML Window with following settings:\n"); 
logger.AddLog(window->getSettings()); 

irr::SIrrlichtCreationParameters params; 
params.AntiAlias = 8; 
params.Bits = 16; 
params.DeviceType = irr::EIDT_BEST; 
params.DriverType = irr::video::EDT_OPENGL; 
params.Doublebuffer = true; 
params.EventReceiver = nullptr; 
params.Fullscreen = false; 
params.HandleSRGB = false; 
params.IgnoreInput = true; 
params.Stencilbuffer = false; 
params.UsePerformanceTimer = false; 
params.Vsync = false; 
params.WithAlphaChannel = false; 
params.ZBufferBits = 24; 
params.LoggingLevel = irr::ELL_DEBUG; 
params.WindowId = GetWindowHandle(window->getSystemHandle()); // Described below 

device.reset(irr::createDeviceEx(params)); // device is std::unique_ptr 
if(device == nullptr) 
    std::cout << "Can't create device!\n"; 

説明 SFMLのgetSystemHandleは私が正しく理解している場合、X11 widnow IDでwhic、Linux上で長い符号なし返します。 My機能GetWindowHandleはそれがないLinuxの * ::平方フィートを取りWindowHandleし、voidを返す:return reinterpret_cast< void* >(handle);これは正しい方法のようです、私は利回りX11エラーが

プログラムの実行をBadWindowIdしようとした他の方法は、デバイスの作成後に停止し、到達していませんif(device == nullptr)ブロック。このようなエラーが発生する可能性がありますどのような

[2017.01.28 13:15:51] 
Starting Application 
Requesting following settings: 
OpenGL context  : 1.1 
flags     : 0 
antialiasing level : 8 
bits of depth buffer: 16 
bits of stencil buffer: 0 
Created SFML Window with following settings: 
OpenGL context  : 4.5 
flags     : 0 
antialiasing level : 8 
bits of depth buffer: 24 
bits of stencil buffer: 0 
Irrlicht Engine version 1.8.4 
Linux 4.4.0-59-generiC#80-Ubuntu SMP Fri Jan 6 17:47:47 UTC 2017 x86_64 
X Error of failed request: BadAlloc (insufficient resources for operation) 
    Major opcode of failed request: 154 (GLX) 
    Minor opcode of failed request: 31 (X_GLXCreateWindow) 
    Serial number of failed request: 26 
    Current serial number in output stream: 27 

(「イルリヒトエンジン」の前に、すべての出力は私のロガーオブジェクトによって行われます):私のプログラムが終了し、私はコンソールに入る1.

エラーが返されますか?

編集sf::Windowてみました。どちらもうまくいきません。私は同じエラーが発生します。 SFMLドキュメントによれば、このクラスは独自のコンテキストも作成します。 おそらく私はこれらの2つのライブラリを結合することをあきらめなければならず、SFMLはオーディオ用にしか使用せず、Irrlichtでしかレンダリングしません。

答えて

1

簡単:SFMLはすでにウィンドウを構成し、その上にOpenGLコンテキストを作成しました。その後、そのウィンドウをIrrlichtに渡します。Irrlichtは、その目的のためにウィンドウを構成しようと試みますが、既に構成されているので失敗します。追加のOpenGLコンテキストを技術的に作成することは可能ですが、別のGLXウィンドウ(GLXウィンドウは通常のX11ウィンドウの特殊化)の子としてGLXウィンドウを作成すると問題が発生します。

あなたの場合の解決策は、「派手な」OpenGLウィンドウの設定とコンテキストの作成を行わないようにSFMLを修正することです。これは、OpenGLのために通常作成されるGLXウィンドウを使わないでプレーンなX11ウィンドウを返しますなぜそれが行われたのか、長年のストーリー、主に直接レンダリングの問題に関連しています)。

これは、ホストプログラムが提供するウィンドウにIrrlichtを埋め込むことは、マップエディタや同様のプレビューアプリケーションのようなものをサポートすることだと言われています。

+0

"GLXウィンドウを別のGLXウィンドウの子として作成する(GLXウィンドウは通常のX11ウィンドウの特殊化です)" 何が問題になりますか? – Xeverous

+0

「SFMLパッチ適用」について - どれくらい難しいでしょうか?簡単な回避策はありますか?私は両方のライブラリを使用することができますC + +コードwithing簡単なソリューションですか? – Xeverous

+0

待って、笑、私は、 'sf :: RenderWindow'だけでなく' sf :: Window'もあることに気づいた。 – Xeverous

関連する問題