OSG использует графический процессор на стороне клиента, а не главный графический процессор

Я сделал простой 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 для сервера и запуска приложения, оно фактически использует клиентский графический процессор, а не серверный графический процессор. На сервере установлено четыре графических процессора GeForce. Я пытался изменить DISPLAY в hostname:0.0 но это не сработало.

Что я должен сделать, чтобы приложение использовало серверный графический процессор, а не клиентский графический процессор в Linux?

2 ответа

Сначала немного о номенклатуре: система, к которой подключен дисплей, является сервером в X11. Итак, вы изменили свою терминологию. Затем, чтобы использовать графические процессоры в удаленной системе для рендеринга OpenGL, для существующей модели драйвера Linux требуется сервер X11 (это может измениться с Wayland, но предстоит еще много работы, прежде чем он сможет это сделать). использоваться). По сути, драйвер загружен в X-сервер, поэтому вам это нужно.

Конечно, X-сервер не может быть доступен любому пользователю. Требуется токен XAuthority (см. Справочную страницу xauth). Также, если мониторы не подключены, вам, возможно, придется выполнить дополнительную настройку, чтобы убедить драйвер графического процессора не отказываться от запуска. Также вы, вероятно, хотите отключить использование устройств ввода.

Затем с запущенным X-сервером и пользователем, который запустит программу OSG, получив токен XAuthority, вы можете запустить программу OSG. Да, это утомительно, но банкомат мы застряли с этим.

Я провел некоторый поиск, и для тех, кто задает этот вопрос, я обобщу то, что я нахожу, и я обновлю конкретные команды, которые позволяют выводить экран за пределы сервера. и да, это определенно возможно.

  1. Используйте VirtualGL для маршрутизации всех команд обратно на сервер.

    VirtualGL - это специальный API X11, который фиксирует команды OpenGL, выполняемые на серверном графическом процессоре. Однако это может изменить поведение OpenGL на стороне сервера, поэтому я не рекомендовал бы, чтобы другие пользователи одновременно использовали OpenGL.

  2. Внеэкранный рендеринг с использованием графической библиотеки Mesa.

    Mesa - это реализация OpenGL-спецификации с открытым исходным кодом - система рендеринга интерактивной 3D-графики. Разнообразные драйверы устройств позволяют использовать Mesa во многих различных средах - от программной эмуляции до полного аппаратного ускорения для современных графических процессоров.

    Mesa позволяет пользователю создавать GraphicsContext, который находится в памяти на стороне сервера и позволяет выводить за пределы экрана. ссылка Я обновлю некоторые коды.

Другие вопросы по тегам