{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Drawing a simple quad\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n\nfrom vispy import app\nfrom vispy.gloo import gl\n\nvertex_code = \"\"\"\n uniform float scale;\n attribute vec4 color;\n attribute vec2 position;\n varying vec4 v_color;\n void main()\n {\n gl_Position = vec4(scale*position, 0.0, 1.0);\n v_color = color;\n } \"\"\"\n\nfragment_code = \"\"\"\n varying vec4 v_color;\n void main()\n {\n gl_FragColor = v_color;\n } \"\"\"\n\n\nclass Canvas(app.Canvas):\n def __init__(self):\n app.Canvas.__init__(self, size=(512, 512), title='Quad (GL)',\n keys='interactive')\n\n def on_initialize(self, event):\n # Build data\n self.data = np.zeros(4, [(\"position\", np.float32, 2),\n (\"color\", np.float32, 4)])\n self.data['color'] = [(1, 0, 0, 1), (0, 1, 0, 1),\n (0, 0, 1, 1), (1, 1, 0, 1)]\n self.data['position'] = [(-1, -1), (-1, +1),\n (+1, -1), (+1, +1)]\n\n # Build & activate program\n\n # Request a program and shader slots from GPU\n program = gl.glCreateProgram()\n vertex = gl.glCreateShader(gl.GL_VERTEX_SHADER)\n fragment = gl.glCreateShader(gl.GL_FRAGMENT_SHADER)\n\n # Set shaders source\n gl.glShaderSource(vertex, vertex_code)\n gl.glShaderSource(fragment, fragment_code)\n\n # Compile shaders\n gl.glCompileShader(vertex)\n gl.glCompileShader(fragment)\n\n # Attach shader objects to the program\n gl.glAttachShader(program, vertex)\n gl.glAttachShader(program, fragment)\n\n # Build program\n gl.glLinkProgram(program)\n\n # Get rid of shaders (no more needed)\n gl.glDetachShader(program, vertex)\n gl.glDetachShader(program, fragment)\n\n # Make program the default program\n gl.glUseProgram(program)\n\n # Build buffer\n\n # Request a buffer slot from GPU\n buf = gl.glCreateBuffer()\n\n # Make this buffer the default one\n gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buf)\n\n # Upload data\n gl.glBufferData(gl.GL_ARRAY_BUFFER, self.data, gl.GL_DYNAMIC_DRAW)\n\n # Bind attributes\n stride = self.data.strides[0]\n offset = 0\n loc = gl.glGetAttribLocation(program, \"position\")\n gl.glEnableVertexAttribArray(loc)\n gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buf)\n gl.glVertexAttribPointer(loc, 3, gl.GL_FLOAT, False, stride, offset)\n\n offset = self.data.dtype[\"position\"].itemsize\n loc = gl.glGetAttribLocation(program, \"color\")\n gl.glEnableVertexAttribArray(loc)\n gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buf)\n gl.glVertexAttribPointer(loc, 4, gl.GL_FLOAT, False, stride, offset)\n\n # Bind uniforms\n # --------------------------------------\n loc = gl.glGetUniformLocation(program, \"scale\")\n gl.glUniform1f(loc, 1.0)\n\n def on_draw(self, event):\n gl.glClear(gl.GL_COLOR_BUFFER_BIT)\n gl.glDrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4)\n\n def on_resize(self, event):\n gl.glViewport(0, 0, *event.physical_size)\n\nif __name__ == '__main__':\n c = Canvas()\n c.show()\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 }