私は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でしかレンダリングしません。
"GLXウィンドウを別のGLXウィンドウの子として作成する(GLXウィンドウは通常のX11ウィンドウの特殊化です)" 何が問題になりますか? – Xeverous
「SFMLパッチ適用」について - どれくらい難しいでしょうか?簡単な回避策はありますか?私は両方のライブラリを使用することができますC + +コードwithing簡単なソリューションですか? – Xeverous
待って、笑、私は、 'sf :: RenderWindow'だけでなく' sf :: Window'もあることに気づいた。 – Xeverous