diff options
author | Jacques Lucke <mail@jlucke.com> | 2018-11-12 19:53:45 +0300 |
---|---|---|
committer | Jacques Lucke <mail@jlucke.com> | 2018-11-12 19:54:51 +0300 |
commit | 15a5cc6ca0b93a923e1bfd25850d3d645aaa43b5 (patch) | |
tree | 588817835fe92f69d1445d2dfddb6cc66b26e4e4 /doc/python_api | |
parent | c34c688b47521226503052616e8c1961b4d81acf (diff) |
Py API Docs: another use case for offscreen rendering
Diffstat (limited to 'doc/python_api')
-rw-r--r-- | doc/python_api/examples/gpu.8.py | 1 | ||||
-rw-r--r-- | doc/python_api/examples/gpu.9.py | 52 |
2 files changed, 53 insertions, 0 deletions
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 |