在Linux虚拟机上进行离屏渲染

我目前正在研究没有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一切工作正常在Windows上,但在Linux上我得到不同的行为。

在debugging它的时候, spinOnce()到达时,即使我调用了setOffScreenRendering() ,也会打开一个窗口,并且在控制台中出现这个错误:

 libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast 

尽pipe错误和奇怪的行为,缩略图正确生成和保存。

真正的问题是,当我尝试执行此function时,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驱动程序configuration的问题,但没有什么比我自己的情况。

运行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 

我得到,我的驱动程序configuration一定有问题,但我没有真正到这些东西(Linuxconfiguration+ 3Dgraphics+软件渲染+等),所以我不知道我能做些什么来解决这个问题。

任何关于如何解决这个问题的build议? (或者以不同的方式做同样的事情)

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