在Ubuntu Server上使用vtk处理体数据,直接得到渲染结果图片避免显示窗口
概述
需要调用vtk对体数据进行渲染处理,处理结果直接存为图片而不通过窗口显示。
直接使用vtkRenderWindow加上vtkWindowToImageFilter类写入,在调用渲染的过程中会出现窗口闪烁。
最简单的方式为在调用vtkRenderwindow->Render()时,首先设置渲染窗口为off-screen渲染,调用函数OffScreenRenderingOn(),调用后窗口不会出现。
如果使用桌面系统(windows或Ubuntu desktop等),创建的窗口可以在内存中不显示,此问题可以解决(效率不确定)。但使用Ubuntu server调用时会出现以下错误:
bad x server connection
基于版本:
- Ubuntu Server 16.04.2 LTS
- vtk 7.1.1
- mesa 17.2.2
- zlib 1.2.11
思路
vtk off-screen渲染需要调用x-server的渲染或mesa的渲染接口,UbuntuServer默认没有安装x-server,因此需要使用mesa中的osmesa(offscreen mesa)渲染。
需要安装mesa的off-screen渲染支持,然后重新编译vtk为直接支持off-screen的版本。(两处编译均有坑)
具体步骤
安装osmesa
- 安装gcc编译器(Ubuntu Server默认没有安装,Ubuntu desktop默认已经安装)
sudo apt-get install build-essential
- 安装zlib,安装时存在的依赖。官网下载安装
./configure
make
make install
- 安装osmesa
官方给出的安装选项为
configure --enable-osmesa --disable-driglx-direct --disable-dri --with-gallium-drivers=swrast
但是--disable-dri选项会出错,实际运行如下
configure --enable-osmesa --disable-driglx-direct --with-gallium-drivers=swrast
此处会出现成吨未知包(Ubuntu Server中,Ubuntu desktop貌似没有少这么多)
懒得一个个找,照着网上的搜了一堆之后还是需要一个个找漏的。
sudo apt-get install x11proto-gl-dev
sudo apt-get install libdrm-dev libxxf86vm-dev libxt-dev xutils-dev flex bison xcb libx11-xcb-dev libxcb-glx0 libxcb-glx0-dev xorg-dev libxcb-dri3-dev libxcb-dri2-0-dev
sudo apt-get install libxcb-xfixes0 libxcb-xfixes0-dev
sudo apt-get install libxcb-present-dev libxcb-sync-dev
sudo apt-get install libxshmfence-dev
出现找不到的包时,可以使用 apt search pkg_name
以上为吐槽,可以一步步执行,偷懒的话可以直接使用完整安装命令:
sudo apt-get install x11proto-gl-dev libdrm-dev libxxf86vm-dev libxt-dev xutils-dev flex bison xcb libx11-xcb-dev libxcb-glx0 libxcb-glx0-dev xorg-dev libxcb-dri3-dev libxcb-dri2-0-dev libxcb-xfixes0 libxcb-xfixes0-dev libxcb-present-dev libxcb-sync-dev libxshmfence-dev
./configure没有问题后,运行 make && make install,编译安装
vtk 代码编译
使用的cmake-gui,需要勾选advanced选项才能看到需要的设置项。
与Google到的选项不怎么一样,不知道是不是版本问题,可以在search框中搜索选项修改。本文主要修改:
VTK_USE_OFFSCREEN on
VTK_OPENGL_HAS_OSMESA on
VTK_USE_X off
之后使用正常方式编译执行代码
同上,vtkRenderWindow在执行render之前调用函数OffScreenRenderingOn()
得到的程序即可在Ubuntu Server下运行
未知问题
需要重启电脑???!! 原因未知,本来在ctrl+alt+f1中运行出错,使用ctrl+alt+f2打开另一个命令行之后程序运行没问题....