Fix #104061: RenderEngine Python example does not work in background mode

And add example of how to use bl_use_gpu_context.
This commit is contained in:
Brecht Van Lommel 2024-06-14 15:20:13 +02:00
parent 7e9b580546
commit 1fec22e350
2 changed files with 43 additions and 2 deletions

@ -5,8 +5,6 @@ Simple Render Engine
import bpy
import array
import gpu
from gpu_extras.presets import draw_texture_2d
class CustomRenderEngine(bpy.types.RenderEngine):
@ -95,6 +93,10 @@ class CustomRenderEngine(bpy.types.RenderEngine):
# Blender will draw overlays for selection and editing on top of the
# rendered image automatically.
def view_draw(self, context, depsgraph):
# Lazily import GPU module, so that the render engine works in
# background mode where the GPU module can't be imported by default.
import gpu
region = context.region
scene = depsgraph.scene
@ -116,6 +118,8 @@ class CustomRenderEngine(bpy.types.RenderEngine):
class CustomDrawData:
def __init__(self, dimensions):
import gpu
# Generate dummy float image buffer
self.dimensions = dimensions
width, height = dimensions
@ -134,6 +138,7 @@ class CustomDrawData:
del self.texture
def draw(self):
from gpu_extras.presets import draw_texture_2d
draw_texture_2d(self.texture, (0, 0), self.texture.width, self.texture.height)

@ -0,0 +1,36 @@
"""
GPU Render Engine
+++++++++++++++++
"""
import bpy
class CustomGPURenderEngine(bpy.types.RenderEngine):
bl_idname = "CUSTOM_GPU"
bl_label = "Custom GPU"
# Request a GPU context to be created and activated for the render method.
# This may be used either to perform the rendering itself, or to allocate
# and fill a texture for more efficient drawing.
bl_use_gpu_context = True
def render(self, depsgraph):
# Lazily import GPU module, since GPU context is only created on demand
# for rendering and does not exist on register.
import gpu
# Perform rendering task.
pass
def register():
bpy.utils.register_class(CustomGPURenderEngine)
def unregister():
bpy.utils.unregister_class(CustomGPURenderEngine)
if __name__ == "__main__":
register()