File size: 2,996 Bytes
29a229f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
.. _offscreen_guide:

Offscreen Rendering
===================

.. note::
   If you're using a headless server, you'll need to use either EGL (for
   GPU-accelerated rendering) or OSMesa (for CPU-only software rendering).
   If you're using OSMesa, be sure that you've installed it properly. See
   :ref:`osmesa` for details.

Choosing a Backend
------------------

Once you have a scene set up with its geometry, cameras, and lights,
you can render it using the :class:`.OffscreenRenderer`. Pyrender supports
three backends for offscreen rendering:

- Pyglet, the same engine that runs the viewer. This requires an active
  display manager, so you can't run it on a headless server. This is the
  default option.
- OSMesa, a software renderer.
- EGL, which allows for GPU-accelerated rendering without a display manager.

If you want to use OSMesa or EGL, you need to set the ``PYOPENGL_PLATFORM``
environment variable before importing pyrender or any other OpenGL library.
You can do this at the command line:

.. code-block:: bash

   PYOPENGL_PLATFORM=osmesa python render.py

or at the top of your Python script:

.. code-block:: bash

   # Top of main python script
   import os
   os.environ['PYOPENGL_PLATFORM'] = 'egl'

The handle for EGL is ``egl``, and the handle for OSMesa is ``osmesa``.

Running the Renderer
--------------------

Once you've set your environment variable appropriately, create your scene and
then configure the :class:`.OffscreenRenderer` object with a window width,
a window height, and a size for point-cloud points:

>>> r = pyrender.OffscreenRenderer(viewport_width=640,
...                                viewport_height=480,
...                                point_size=1.0)

Then, just call the :meth:`.OffscreenRenderer.render` function:

>>> color, depth = r.render(scene)

.. image:: /_static/scene.png

This will return a ``(w,h,3)`` channel floating-point color image and
a ``(w,h)`` floating-point depth image rendered from the scene's main camera.

You can customize the rendering process by using flag options from
:class:`.RenderFlags` and bitwise or-ing them together. For example,
the following code renders a color image with an alpha channel
and enables shadow mapping for all directional lights:

>>> flags = RenderFlags.RGBA | RenderFlags.SHADOWS_DIRECTIONAL
>>> color, depth = r.render(scene, flags=flags)

Once you're done with the offscreen renderer, you need to close it before you
can run a different renderer or open the viewer for the same scene:

>>> r.delete()

Google CoLab Examples
---------------------

For a minimal working example of offscreen rendering using OSMesa,
see the `OSMesa Google CoLab notebook`_.

.. _OSMesa Google CoLab notebook: https://colab.research.google.com/drive/1Z71mHIc-Sqval92nK290vAsHZRUkCjUx

For a minimal working example of offscreen rendering using EGL,
see the `EGL Google CoLab notebook`_.

.. _EGL Google CoLab notebook: https://colab.research.google.com/drive/1rTLHk0qxh4dn8KNe-mCnN8HAWdd2_BEh