[vtkusers] Offscreen rendering with Python: Segmentation fault

Андрей Траченко goodrone at gmail.com
Sun Aug 29 07:29:44 EDT 2010


Hello,

I've spent some time trying to run offscreen rendering in Python
(Linux) and I'm ready to provide some relatively clean results leading
to segfault. See also a related thread [2].

For my experiments I've installed a new cloud server with Ubuntu
Server 10.04 x64. I assume it's a relatively clean installation
(however it has a patched kernel).

Then I aptitude install:
* g++
* cmake-curses-gui
* python-dev
* tk-dev
* libosmesa6-dev
* libgl1-mesa-dev

I use the latest VTK archive (5.6.0):
* BUILD_SHARED_LIBS=ON
* BUILD_TESTING=OFF
* VTK_OPENGL_HAS_OSMESA=ON
* VTK_WRAP_PYTHON

Then I export the required paths:
* export LD_LIBRARY_PATH=~/VTK/build/bin
* export PYTHONPATH=~/VTK/Wrapping/Python:~/VTK/build/bin
(where ~ is substituted with my home directory)

I verify that VTK Offscreen rendering actually works (in C++), by
compiling and running the OffScreenRendering example [1]. It produces
a correct screenshot.png image. But I'm interested in offscreen
rendering in Python.

I've converted the C++ example to a Python script:

from vtk import *

gf = vtkGraphicsFactory
gf.SetOffScreenOnlyMode(1)
gf.SetUseMesaClasses(1)
if_ = vtkImagingFactory
if_.SetUseMesaClasses(1)

sphereSource = vtkSphereSource()
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(sphereSource.GetOutputPort())
actor = vtkActor()
actor.SetMapper(mapper)
renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderer.AddActor(actor)
renderer.SetBackground(1, 1, 1)
renderWindow.Render() # <--- Segmentation fault
wif = vtkWindowToImageFilter()
wif.SetInput(renderWindow)
wif.Update()
writer = vtkPNGWriter()
writer.SetFileName("python-screenshot.png")
writer.SetInput(wif.GetOutput())
writer.Write()

It is a correct translation, because I've run it on my Windows box and
got the same PNG image. However, it crashes with segfault on rendering
in Linux.

gdb's backtrace says (I skip a lot):
#0  0x00007ffff6a43216 in ?? () from /lib/libc.so.6
#1  0x00007ffff6a31e60 in ?? () from /lib/libc.so.6
#2  0x00007ffff6a25c25 in vsscanf () from /lib/libc.so.6
#3  0x00007ffff6a130e8 in sscanf () from /lib/libc.so.6
#4  0x00007fffeedb3dfd in
vtkOpenGLExtensionManager::ReadOpenGLExtensions() () from
/root/VTK/build/bin/libvtkRendering.so.5.6
#14 0x00007fffeed01257 in vtkRenderWindow::Render() () from
/root/VTK/build/bin/libvtkRendering.so.5.6
#29 0x00000000004a7c5e in PyEval_EvalFrameEx ()

Does anybody have a working Python VTK wrapping with correct offscreen
wrapping? Have I missed something in installing packages or
configuring VTK? Should I try an older version of VTK? Does it worth
trying the same on a non-patched linux box? Should I compile in Debug
mode and run it with gdb again? Should I give up and just shoot in my
foot with C++?

I'm sorry for too many words. Please help! Thank you.

  [1] http://www.vtk.org/Wiki/VTK/Examples/Utilities/OffScreenRendering
  [2] http://www.vtk.org/pipermail/vtkusers/2009-June/101492.html

--
Andrew



More information about the vtkusers mailing list