{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Show post-processing using a FrameBuffer\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\nfrom vispy import app\n\nfrom vispy.geometry import create_cube\nfrom vispy.util.transforms import perspective, translate, rotate\nfrom vispy.gloo import (Program, VertexBuffer, IndexBuffer, Texture2D, clear,\n FrameBuffer, RenderBuffer, set_viewport, set_state)\n\n\ncube_vertex = \"\"\"\nuniform mat4 model;\nuniform mat4 view;\nuniform mat4 projection;\nattribute vec3 position;\nattribute vec2 texcoord;\nattribute vec3 normal; // not used in this example\nattribute vec4 color; // not used in this example\nvarying vec2 v_texcoord;\nvoid main()\n{\n gl_Position = projection * view * model * vec4(position,1.0);\n v_texcoord = texcoord;\n}\n\"\"\"\n\ncube_fragment = \"\"\"\nuniform sampler2D texture;\nvarying vec2 v_texcoord;\nvoid main()\n{\n float r = texture2D(texture, v_texcoord).r;\n gl_FragColor = vec4(r,r,r,1);\n}\n\"\"\"\n\nquad_vertex = \"\"\"\nattribute vec2 position;\nattribute vec2 texcoord;\nvarying vec2 v_texcoord;\nvoid main()\n{\n gl_Position = vec4(position, 0.0, 1.0);\n v_texcoord = texcoord;\n}\n\"\"\"\n\nquad_fragment = \"\"\"\nuniform sampler2D texture;\nvarying vec2 v_texcoord;\nvoid main()\n{\n vec2 d = 5.0 * vec2(sin(v_texcoord.y*50.0),0)/512.0;\n\n // Inverse video\n if( v_texcoord.x > 0.5 ) {\n gl_FragColor.rgb = 1.0-texture2D(texture, v_texcoord+d).rgb;\n } else {\n gl_FragColor = texture2D(texture, v_texcoord);\n }\n}\n\"\"\"\n\n\ndef checkerboard(grid_num=8, grid_size=32):\n row_even = grid_num // 2 * [0, 1]\n row_odd = grid_num // 2 * [1, 0]\n Z = np.row_stack(grid_num // 2 * (row_even, row_odd)).astype(np.uint8)\n return 255 * Z.repeat(grid_size, axis=0).repeat(grid_size, axis=1)\n\n\nclass Canvas(app.Canvas):\n\n def __init__(self):\n app.Canvas.__init__(self, title='Framebuffer post-processing',\n keys='interactive', size=(512, 512))\n\n # Build cube data\n # --------------------------------------\n vertices, indices, _ = create_cube()\n vertices = VertexBuffer(vertices)\n self.indices = IndexBuffer(indices)\n\n # Build program\n # --------------------------------------\n view = translate((0, 0, -7))\n self.phi, self.theta = 60, 20\n model = rotate(self.theta, (0, 0, 1)).dot(rotate(self.phi, (0, 1, 0)))\n\n self.cube = Program(cube_vertex, cube_fragment)\n self.cube.bind(vertices)\n self.cube[\"texture\"] = checkerboard()\n self.cube[\"texture\"].interpolation = 'linear'\n self.cube['model'] = model\n self.cube['view'] = view\n\n color = Texture2D((512, 512, 3), interpolation='linear')\n self.framebuffer = FrameBuffer(color, RenderBuffer((512, 512)))\n\n self.quad = Program(quad_vertex, quad_fragment, count=4)\n self.quad['texcoord'] = [(0, 0), (0, 1), (1, 0), (1, 1)]\n self.quad['position'] = [(-1, -1), (-1, +1), (+1, -1), (+1, +1)]\n self.quad['texture'] = color\n\n # OpenGL and Timer initalization\n # --------------------------------------\n set_state(clear_color=(.3, .3, .35, 1), depth_test=True)\n self.timer = app.Timer('auto', connect=self.on_timer, start=True)\n self._set_projection(self.physical_size)\n\n self.show()\n\n def on_draw(self, event):\n with self.framebuffer:\n set_viewport(0, 0, 512, 512)\n clear(color=True, depth=True)\n set_state(depth_test=True)\n self.cube.draw('triangles', self.indices)\n set_viewport(0, 0, *self.physical_size)\n clear(color=True)\n set_state(depth_test=False)\n self.quad.draw('triangle_strip')\n\n def on_resize(self, event):\n self._set_projection(event.physical_size)\n\n def _set_projection(self, size):\n width, height = size\n set_viewport(0, 0, width, height)\n projection = perspective(30.0, width / float(height), 2.0, 10.0)\n self.cube['projection'] = projection\n\n def on_timer(self, event):\n self.theta += .5\n self.phi += .5\n model = rotate(self.theta, (0, 0, 1)).dot(rotate(self.phi, (0, 1, 0)))\n self.cube['model'] = model\n self.update()\n\n\nif __name__ == '__main__':\n canvas = Canvas()\n app.run()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" } }, "nbformat": 4, "nbformat_minor": 0 }