Spaces:
Runtime error
Runtime error
File size: 2,996 Bytes
b4c8bc3 |
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
|