|
.. _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 |
|
|