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。服务器上有四个 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 回答
0

我已经进行了一些搜索,对于那些最终遇到这个问题的人,我将总结我发现的内容,并更新启用服务器端屏幕外渲染的特定命令。是的,这绝对是可能的。

  1. 使用 VirtualGL 将所有命令路由回服务器。

    VirtualGL 是 X11 特定的 API,可捕获在服务器端 GPU 上执行的 OpenGL 命令。但是,这可能会改变服务器端的 OpenGL 行为,所以我不建议其他用户同时使用 OpenGL。

  2. 使用 Mesa 图形库进行屏幕外渲染。

    Mesa 是 OpenGL 规范的开源实现 - 一个用于渲染交互式 3D 图形的系统。各种设备驱动程序允许 Mesa 在许多不同的环境中使用,从软件仿真到现代 GPU 的完整硬件加速。

    Mesa 允许用户创建驻留在服务器端内存上的 GraphicsContext 并允许离屏渲染。链接。我会更新一些代码。

于 2014-08-14T08:06:26.550 回答