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