From 15a5cc6ca0b93a923e1bfd25850d3d645aaa43b5 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 12 Nov 2018 17:53:45 +0100 Subject: Py API Docs: another use case for offscreen rendering --- doc/python_api/examples/gpu.8.py | 1 + doc/python_api/examples/gpu.9.py | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 doc/python_api/examples/gpu.9.py (limited to 'doc') diff --git a/doc/python_api/examples/gpu.8.py b/doc/python_api/examples/gpu.8.py index 187276d61f5..7e41164fc7e 100644 --- a/doc/python_api/examples/gpu.8.py +++ b/doc/python_api/examples/gpu.8.py @@ -23,6 +23,7 @@ offscreen.bind() try: bgl.glClear(bgl.GL_COLOR_BUFFER_BIT) with gpu.matrix.push_pop(): + # reset matrices -> use normalized device coordinates [-1, 1] gpu.matrix.load_matrix(Matrix.Identity(4)) gpu.matrix.load_projection_matrix(Matrix.Identity(4)) diff --git a/doc/python_api/examples/gpu.9.py b/doc/python_api/examples/gpu.9.py new file mode 100644 index 00000000000..a281534765a --- /dev/null +++ b/doc/python_api/examples/gpu.9.py @@ -0,0 +1,52 @@ +""" +Copy Offscreen Rendering result back to RAM +------------------------------------------- + +This will create a new image with the given name. +If it already exists, it will override the existing one. + +Currently almost all of the execution time is spent in the last line. +In the future this will hopefully be solved by implementing the Python buffer protocol for `bgl.Buffer` and `Image.pixels` (aka `bpy_prop_array`). +""" +import bpy +import gpu +import bgl +import random +from mathutils import Matrix +from gpu_extras.presets import draw_circle_2d + +IMAGE_NAME = "Generated Image" +WIDTH = 512 +HEIGHT = 512 +RING_AMOUNT = 10 + + +offscreen = gpu.types.GPUOffScreen(WIDTH, HEIGHT) + +offscreen.bind() +try: + bgl.glClear(bgl.GL_COLOR_BUFFER_BIT) + with gpu.matrix.push_pop(): + # reset matrices -> use normalized device coordinates [-1, 1] + gpu.matrix.load_matrix(Matrix.Identity(4)) + gpu.matrix.load_projection_matrix(Matrix.Identity(4)) + + for i in range(RING_AMOUNT): + draw_circle_2d( + (random.uniform(-1, 1), random.uniform(-1, 1)), + (1, 1, 1, 1), random.uniform(0.1, 1), 20) + + + buffer = bgl.Buffer(bgl.GL_BYTE, WIDTH * HEIGHT * 4) + bgl.glReadBuffer(bgl.GL_BACK) + bgl.glReadPixels(0, 0, WIDTH, HEIGHT, bgl.GL_RGBA, bgl.GL_UNSIGNED_BYTE, buffer) +finally: + offscreen.unbind() + offscreen.free() + + +if not IMAGE_NAME in bpy.data.images: + bpy.data.images.new(IMAGE_NAME, WIDTH, HEIGHT) +image = bpy.data.images[IMAGE_NAME] +image.scale(WIDTH, HEIGHT) +image.pixels = [v / 255 for v in buffer] \ No newline at end of file -- cgit v1.2.3