linux 虚拟机上的离屏渲染
Off screen rendering on a linux virtual machine
我目前正在使用没有 GPU 的 Linux 虚拟机 (Ubuntu 16-04 LTS)(因为它运行的集群没有 GPU)。
我正在使用以下简单的 C++ 代码为 .PLY 3D 模型生成缩略图,而无需打开 window 并在屏幕外渲染所有内容:
void produceThumbnail(const char* input, const char* output)
{
viz::Mesh mesh = viz::Mesh::load(input);
viz::WMesh wMesh(mesh);
viz::Viz3d window("bunny");
window.showWidget("bunny", wMesh);
window.setBackgroundColor(viz::Color::azure());
window.setOffScreenRendering();
window.spinOnce();
Mat3b img = window.getScreenshot();
imwrite(output, img);
}
使用 OpenCV 3.1.0 和 VTK 6.3.0 在 Windows 上一切正常,但在 Linux 上我得到不同的行为。
在调试它时,当达到 spinOnce()
时,无论如何都会打开 window,即使我调用了 setOffScreenRendering()
,并且在控制台中我得到了这个错误:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
尽管存在错误和奇怪的行为,但缩略图已正确生成和保存。
真正的问题是,当我在 X 服务器不可用(例如,不是远程桌面连接、SSH 控制台或类似的东西)时尝试执行此功能时,我收到以下错误:
ERROR: In /home/administrator/libs/VTK-6.3.0/Rendering/OpenGL/vtkXOpenGlRenderWindow.cxx, line 1475
vtkXOpenGLRenderWindow (0x1ae93e0): bad X server connection. DISPLAY=Aborted
并且可执行文件崩溃(显然,因为没有可用的 X 服务器...)
在线查找时,我发现了很多关于错误 GPU-hardware/GPU-drivers 配置的问题,但没有一个与我自己的情况完全相同。
运行 glxgears
我明白了:
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/swrast_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
28843 frames in 5.0 seconds = 5766.824 FPS
28840 frames in 5.0 seconds = 5766.716 FPS
...
和运行 glxinfo
我明白了:
name of display: :10.0
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
display: :10 screen: 0
direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose)
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
GLX_EXT_import_context, GLX_EXT_visual_info, GLX_EXT_visual_rating
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:
GLX_ARB_create_context, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample,
GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile,
GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float,
GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context,
GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating,
GLX_INTEL_swap_event, GLX_MESA_copy_sub_buffer,
GLX_MESA_multithread_makecurrent, GLX_MESA_query_renderer,
GLX_MESA_swap_control, GLX_OML_swap_method, GLX_OML_sync_control,
GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
GLX_SGIX_visual_select_group, GLX_SGI_make_current_read,
GLX_SGI_swap_control, GLX_SGI_video_sync
GLX version: 1.2
GLX extensions:
GLX_ARB_get_proc_address, GLX_EXT_import_context, GLX_EXT_visual_info,
GLX_EXT_visual_rating, GLX_MESA_multithread_makecurrent
OpenGL vendor string: Mesa project: www.mesa3d.org
OpenGL renderer string: Mesa GLX Indirect
OpenGL version string: 1.3 Mesa 4.0.4
OpenGL extensions:
GL_ARB_imaging, GL_ARB_multitexture, GL_ARB_texture_border_clamp,
GL_ARB_texture_cube_map, GL_ARB_texture_env_add,
GL_ARB_texture_env_combine, GL_ARB_texture_env_dot3,
GL_ARB_transpose_matrix, GL_EXT_abgr, GL_EXT_blend_color,
GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_draw_range_elements,
GL_EXT_multi_draw_arrays, GL_EXT_texture_env_add,
GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,
GL_EXT_texture_lod_bias, GL_SGIS_texture_border_clamp,
GL_SUN_multi_draw_arrays
我知道我的驱动程序配置一定有问题,但我不是很喜欢这些东西(Linux 配置 + 3D 图形 + 软件渲染 + 等)所以我不知道什么可以我要解决这个问题。
关于如何解决这个问题有什么建议吗? (或者关于用不同的方式做同样的事情)
您使用的 OpenGL 实现需要一个 X 服务器来提供可绘制对象。对于没有 X 服务器和 GPU 的纯无头操作,您应该查看 OSMesa:http://www.mesa3d.org/osmesa.html
我目前正在使用没有 GPU 的 Linux 虚拟机 (Ubuntu 16-04 LTS)(因为它运行的集群没有 GPU)。
我正在使用以下简单的 C++ 代码为 .PLY 3D 模型生成缩略图,而无需打开 window 并在屏幕外渲染所有内容:
void produceThumbnail(const char* input, const char* output)
{
viz::Mesh mesh = viz::Mesh::load(input);
viz::WMesh wMesh(mesh);
viz::Viz3d window("bunny");
window.showWidget("bunny", wMesh);
window.setBackgroundColor(viz::Color::azure());
window.setOffScreenRendering();
window.spinOnce();
Mat3b img = window.getScreenshot();
imwrite(output, img);
}
使用 OpenCV 3.1.0 和 VTK 6.3.0 在 Windows 上一切正常,但在 Linux 上我得到不同的行为。
在调试它时,当达到 spinOnce()
时,无论如何都会打开 window,即使我调用了 setOffScreenRendering()
,并且在控制台中我得到了这个错误:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
尽管存在错误和奇怪的行为,但缩略图已正确生成和保存。
真正的问题是,当我在 X 服务器不可用(例如,不是远程桌面连接、SSH 控制台或类似的东西)时尝试执行此功能时,我收到以下错误:
ERROR: In /home/administrator/libs/VTK-6.3.0/Rendering/OpenGL/vtkXOpenGlRenderWindow.cxx, line 1475
vtkXOpenGLRenderWindow (0x1ae93e0): bad X server connection. DISPLAY=Aborted
并且可执行文件崩溃(显然,因为没有可用的 X 服务器...)
在线查找时,我发现了很多关于错误 GPU-hardware/GPU-drivers 配置的问题,但没有一个与我自己的情况完全相同。
运行 glxgears
我明白了:
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/swrast_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
28843 frames in 5.0 seconds = 5766.824 FPS
28840 frames in 5.0 seconds = 5766.716 FPS
...
和运行 glxinfo
我明白了:
name of display: :10.0
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
display: :10 screen: 0
direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose)
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
GLX_EXT_import_context, GLX_EXT_visual_info, GLX_EXT_visual_rating
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:
GLX_ARB_create_context, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample,
GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile,
GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float,
GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context,
GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating,
GLX_INTEL_swap_event, GLX_MESA_copy_sub_buffer,
GLX_MESA_multithread_makecurrent, GLX_MESA_query_renderer,
GLX_MESA_swap_control, GLX_OML_swap_method, GLX_OML_sync_control,
GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
GLX_SGIX_visual_select_group, GLX_SGI_make_current_read,
GLX_SGI_swap_control, GLX_SGI_video_sync
GLX version: 1.2
GLX extensions:
GLX_ARB_get_proc_address, GLX_EXT_import_context, GLX_EXT_visual_info,
GLX_EXT_visual_rating, GLX_MESA_multithread_makecurrent
OpenGL vendor string: Mesa project: www.mesa3d.org
OpenGL renderer string: Mesa GLX Indirect
OpenGL version string: 1.3 Mesa 4.0.4
OpenGL extensions:
GL_ARB_imaging, GL_ARB_multitexture, GL_ARB_texture_border_clamp,
GL_ARB_texture_cube_map, GL_ARB_texture_env_add,
GL_ARB_texture_env_combine, GL_ARB_texture_env_dot3,
GL_ARB_transpose_matrix, GL_EXT_abgr, GL_EXT_blend_color,
GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_draw_range_elements,
GL_EXT_multi_draw_arrays, GL_EXT_texture_env_add,
GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,
GL_EXT_texture_lod_bias, GL_SGIS_texture_border_clamp,
GL_SUN_multi_draw_arrays
我知道我的驱动程序配置一定有问题,但我不是很喜欢这些东西(Linux 配置 + 3D 图形 + 软件渲染 + 等)所以我不知道什么可以我要解决这个问题。
关于如何解决这个问题有什么建议吗? (或者关于用不同的方式做同样的事情)
您使用的 OpenGL 实现需要一个 X 服务器来提供可绘制对象。对于没有 X 服务器和 GPU 的纯无头操作,您应该查看 OSMesa:http://www.mesa3d.org/osmesa.html