0

ウィンドウをポップアップせずにレンダリングする単純な OSG オフスクリーン レンダラーを作成しました。

osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = screenWidth;
traits->height = screenHeight;
if (offScreen) {
    traits->windowDecoration = false;
    traits->doubleBuffer = true;
    traits->pbuffer = true;
} else {
    traits->windowDecoration = true;
    traits->doubleBuffer = true;
    traits->pbuffer = false;
}
traits->sharedContext = 0;
std::cout << "DisplayName : " << traints->displayName() << std::endl;
traits->readDISPLAY();

osg::GraphicsContext* _gc = osg::GraphicsContext::createGraphicsContext(traits.get());

if (!_gc) {
    osg::notify(osg::NOTICE)<< "Failed to create pbuffer, failing back to normal graphics window." << std::endl;
    traits->pbuffer = false;
    _gc = osg::GraphicsContext::createGraphicsContext(traits.get());
}

ただし、sshサーバーに接続してアプリケーションを実行すると、実際にはサーバー GPU ではなくクライアント GPU が使用されます。サーバーには 4 つの GeForce GPU があります。に変更しようとしましDISPLAYhostname:0.0が、うまくいきませんでした。

Linux でアプリケーションがクライアント GPU ではなくサーバー GPU を使用するようにするにはどうすればよいですか?

4

2 に答える 2

1

最初に少し用語を説明します。ディスプレイが接続されているシステムは、X11 のサーバーです。つまり、用語が逆になっています。次に、リモート システムの GPU を OpenGL レンダリングに利用するには、現在存在する Linux ドライバー モデルで X11 サーバーを実行する必要があります (これは Wayland で変更されようとしていますが、できるようになるまでには、まだ多くの作業が必要です。利用される)。基本的に、ドライバーは X サーバーにロードされるため、それが必要です。

もちろん、X サーバーにはどのユーザーもアクセスできません。XAuthority トークンが必要です (xauth マンページを参照)。また、モニターが接続されていない場合は、GPU ドライバーが起動を拒否しないようにするために、追加の構成を行う必要がある場合があります。また、おそらく入力デバイスの使用を無効にしたいでしょう。

次に、X サーバーが実行され、OSG プログラムを実行するユーザーが XAuthority トークンを取得すると、OSG プログラムを実行できます。はい、面倒ですが、ATM はそれで行き詰まっています。

于 2014-08-13T22:41:25.857 に答える