{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Use FrameBuffers\n\nMinimal example demonstrating the use of frame buffer objects (FBO).\nThis example blurs the output image.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from vispy import gloo\nfrom vispy import app\nimport numpy as np\n\n# Create vertices\nvPosition = np.array([[-0.8, -0.8, 0.0], [+0.7, -0.7, 0.0],\n [-0.7, +0.7, 0.0], [+0.8, +0.8, 0.0, ]], np.float32)\nvPosition_full = np.array([[-1.0, -1.0, 0.0], [+1.0, -1.0, 0.0],\n [-1.0, +1.0, 0.0], [+1.0, +1.0, 0.0, ]], np.float32)\nvTexcoord = np.array([[0.0, 0.0], [0.0, 1.0],\n [1.0, 0.0], [1.0, 1.0]], np.float32)\n\n# For initial quad\nVERT_SHADER1 = \"\"\"\nattribute vec3 a_position;\nvoid main (void) {\n gl_Position = vec4(a_position, 1.0);\n}\n\"\"\"\n\nFRAG_SHADER1 = \"\"\"\nuniform vec4 u_color;\nvoid main()\n{\n gl_FragColor = u_color;\n}\n\"\"\"\n\n# To render the result of the FBO\nVERT_SHADER2 = \"\"\"\nattribute vec3 a_position;\nattribute vec2 a_texcoord;\nvarying vec2 v_texcoord;\nvoid main (void) {\n // Pass tex coords\n v_texcoord = a_texcoord;\n // Calculate position\n gl_Position = vec4(a_position.x, a_position.y, a_position.z, 1.0);\n}\n\"\"\"\n\nFRAG_SHADER2 = \"\"\"\nuniform sampler2D u_texture1;\nvarying vec2 v_texcoord;\nconst float c_zero = 0.0;\nconst int c_sze = 5;\nvoid main()\n{\n float scalefactor = 1.0 / float(c_sze * c_sze * 4 + 1);\n gl_FragColor = vec4(c_zero, c_zero, c_zero, 1.0);\n for (int y=-c_sze; y<=c_sze; y++) {\n for (int x=-c_sze; x<=c_sze; x++) {\n vec2 step = vec2(x,y) * 0.01;\n vec3 color = texture2D(u_texture1, v_texcoord.st+step).rgb;\n gl_FragColor.rgb += color * scalefactor;\n }\n }\n}\n\"\"\"\n\n\nSIZE = 50\n\n\nclass Canvas(app.Canvas):\n\n def __init__(self):\n app.Canvas.__init__(self, keys='interactive', size=(560, 420))\n\n # Create texture to render to\n shape = self.physical_size[1], self.physical_size[0]\n self._rendertex = gloo.Texture2D((shape + (3,)))\n\n # Create FBO, attach the color buffer and depth buffer\n self._fbo = gloo.FrameBuffer(self._rendertex, gloo.RenderBuffer(shape))\n\n # Create program to render a shape\n self._program1 = gloo.Program(VERT_SHADER1, FRAG_SHADER1)\n self._program1['u_color'] = 0.9, 1.0, 0.4, 1\n self._program1['a_position'] = gloo.VertexBuffer(vPosition)\n\n # Create program to render FBO result\n self._program2 = gloo.Program(VERT_SHADER2, FRAG_SHADER2)\n self._program2['a_position'] = gloo.VertexBuffer(vPosition)\n self._program2['a_texcoord'] = gloo.VertexBuffer(vTexcoord)\n self._program2['u_texture1'] = self._rendertex\n\n self.show()\n\n def on_resize(self, event):\n width, height = event.physical_size\n gloo.set_viewport(0, 0, width, height)\n\n def on_draw(self, event):\n # Draw the same scene as as in hello_quad.py, but draw it to the FBO\n with self._fbo:\n gloo.set_clear_color((0.0, 0.0, 0.5, 1))\n gloo.clear(color=True, depth=True)\n gloo.set_viewport(0, 0, *self.physical_size)\n self._program1.draw('triangle_strip')\n\n # Now draw result to a full-screen quad\n # Init\n gloo.set_clear_color('white')\n gloo.clear(color=True, depth=True)\n self._program2.draw('triangle_strip')\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 }