{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Spatial Filtering\n\nExample demonstrating spatial filtering using spatial-filters fragment shader.\n\nLeft and Right Arrow Keys toggle through available filters.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n\nfrom vispy.io import load_spatial_filters\nfrom vispy import gloo\nfrom vispy import app\nfrom vispy.util.logs import set_log_level\n# turn off INFO messages, see PR #1363\n# Some shader compilers will optimize out the 'u_shape' and 'u_kernel'\n# uniforms for the Nearest filter since they are unused, resulting in\n# an INFO message about them not being active\nset_log_level('warning')\n\n# create 5x5 matrix with border pixels 0, center pixels 1\n# and other pixels 0.5\nimg_array = np.zeros(25).reshape((5, 5)).astype(np.float32)\nimg_array[1:4, 1::2] = 0.5\nimg_array[1::2, 2] = 0.5\nimg_array[2, 2] = 1.0\n\n# loading interpolation kernel\nkernel, names = load_spatial_filters()\nnames = [name + '2D' for name in names]\n\n# A simple texture quad\ndata = np.zeros(4, dtype=[('a_position', np.float32, 2),\n ('a_texcoord', np.float32, 2)])\ndata['a_position'] = np.array([[-1, -1], [+1, -1], [-1, +1], [+1, +1]])\ndata['a_texcoord'] = np.array([[1, 0], [1, 1], [0, 0], [0, 1]])\n\n\nVERT_SHADER = \"\"\"\n// Attributes\nattribute vec2 a_position;\nattribute vec2 a_texcoord;\n\n// Varyings\nvarying vec2 v_texcoord;\n\n// Main\nvoid main (void)\n{\n v_texcoord = a_texcoord;\n gl_Position = vec4(a_position,0.0,1.0);\n}\n\"\"\"\n\nFRAG_SHADER = \"\"\"\n#include \"misc/spatial-filters.frag\"\nuniform sampler2D u_texture;\nuniform vec2 u_shape;\nvarying vec2 v_texcoord;\nvoid main()\n{\n gl_FragColor = %s(u_texture, u_shape, v_texcoord);\n}\n\n\"\"\"\n\n\nclass Canvas(app.Canvas):\n\n def __init__(self):\n app.Canvas.__init__(self, keys='interactive', size=((512), (512)))\n\n self.program = gloo.Program(VERT_SHADER, FRAG_SHADER % 'Nearest2D')\n self.texture = gloo.Texture2D(img_array, interpolation='nearest')\n\n # using packed data as discussed in pr #1069\n self.kernel = gloo.Texture2D(kernel, interpolation='nearest')\n self.program['u_texture'] = self.texture\n self.program['u_shape'] = img_array.shape[1], img_array.shape[0]\n self.program['u_kernel'] = self.kernel\n\n self.names = names\n self.filter = 16\n self.title = 'Spatial Filtering using %s Filter' % \\\n self.names[self.filter]\n\n self.program.bind(gloo.VertexBuffer(data))\n\n self.context.set_clear_color('white')\n self.context.set_viewport(0, 0, 512, 512)\n self.show()\n\n def on_key_press(self, event):\n if event.key in ['Left', 'Right']:\n if event.key == 'Right':\n step = 1\n else:\n step = -1\n self.filter = (self.filter + step) % 17\n self.program.set_shaders(VERT_SHADER,\n FRAG_SHADER % self.names[self.filter])\n\n self.title = 'Spatial Filtering using %s Filter' % \\\n self.names[self.filter]\n self.update()\n\n def on_resize(self, event):\n self.context.set_viewport(0, 0, *event.physical_size)\n\n def on_draw(self, event):\n self.context.clear(color=True, depth=True)\n self.program.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 }