在Linux虚拟机上进行屏幕外渲染

时间:2016-06-23 10:37:25

标签: c++ linux opencv opengl virtual-machine

我目前正在使用没有GPU的Linux虚拟机(Ubuntu 16-04 LTS)(因为它运行的集群没有GPU)。

我使用以下简单的C ++代码为.PLY 3D模型生成缩略图,而无需打开窗口并将所有内容渲染到屏幕外:

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一切正常,但在Linux上,我得到了不同的行为。

在调试时,当到达spinOnce()时,无论如何都会打开一个窗口,即使我调用了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硬件/ GPU驱动程序配置的问题,但没有什么比我自己的情况更像。

运行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图形+软件渲染+等)所以我不知道我能做什么解决这个问题。

有关如何解决此问题的任何建议? (或者以不同的方式做同样的事情)

1 个答案:

答案 0 :(得分:2)

您正在使用的OpenGL实现需要一个X服务器来为它提供可绘制的绘图。对于没有X服务器且没有GPU的纯无头操作,您应该查看OSMesa:http://www.mesa3d.org/osmesa.html

相关问题