Last active
August 10, 2021 12:39
-
-
Save naveen521kk/d7920a00c47afbd463f702d63681fd83 to your computer and use it in GitHub Desktop.
Moderngl.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Moderngl.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"authorship_tag": "ABX9TyOzpHExAJG9ttdi5KO2Ozh3", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
}, | |
"accelerator": "GPU" | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/naveen521kk/d7920a00c47afbd463f702d63681fd83/moderngl.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "mn2uvwLOD06I" | |
}, | |
"source": [ | |
"## ModernGL Notebook\n", | |
"\n", | |
"First change the runtime to `GPU` (`Runtime > Change runtime type > Hardware accelerator`).\n", | |
"\n", | |
"After that click `Run all`(`Runtime > Run all`) to execute all the cell." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "dKpSZMmN1nBT", | |
"outputId": "e71e675d-e787-4cbe-d886-08f65eddacfd" | |
}, | |
"source": [ | |
"#@markdown Install **Moderngl** using *pip* and **libegl-mesa** from *apt*\n", | |
"!pip install moderngl\n", | |
"!sudo apt install mesa-utils libegl1-mesa" | |
], | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Collecting moderngl\n", | |
" Downloading moderngl-5.6.4-cp37-cp37m-manylinux1_x86_64.whl (670 kB)\n", | |
"\u001b[K |████████████████████████████████| 670 kB 7.4 MB/s \n", | |
"\u001b[?25hCollecting glcontext<3,>=2\n", | |
" Downloading glcontext-2.3.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (64 kB)\n", | |
"\u001b[K |████████████████████████████████| 64 kB 3.8 MB/s \n", | |
"\u001b[?25hInstalling collected packages: glcontext, moderngl\n", | |
"Successfully installed glcontext-2.3.4 moderngl-5.6.4\n", | |
"Reading package lists... Done\n", | |
"Building dependency tree \n", | |
"Reading state information... Done\n", | |
"The following NEW packages will be installed:\n", | |
" libegl1-mesa mesa-utils\n", | |
"0 upgraded, 2 newly installed, 0 to remove and 40 not upgraded.\n", | |
"Need to get 40.7 kB of archives.\n", | |
"After this operation, 217 kB of additional disk space will be used.\n", | |
"Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libegl1-mesa amd64 20.0.8-0ubuntu1~18.04.1 [6,416 B]\n", | |
"Get:2 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mesa-utils amd64 8.4.0-1 [34.3 kB]\n", | |
"Fetched 40.7 kB in 1s (60.3 kB/s)\n", | |
"debconf: unable to initialize frontend: Dialog\n", | |
"debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 2.)\n", | |
"debconf: falling back to frontend: Readline\n", | |
"debconf: unable to initialize frontend: Readline\n", | |
"debconf: (This frontend requires a controlling tty.)\n", | |
"debconf: falling back to frontend: Teletype\n", | |
"dpkg-preconfigure: unable to re-open stdin: \n", | |
"Selecting previously unselected package libegl1-mesa:amd64.\n", | |
"(Reading database ... 160837 files and directories currently installed.)\n", | |
"Preparing to unpack .../libegl1-mesa_20.0.8-0ubuntu1~18.04.1_amd64.deb ...\n", | |
"Unpacking libegl1-mesa:amd64 (20.0.8-0ubuntu1~18.04.1) ...\n", | |
"Selecting previously unselected package mesa-utils.\n", | |
"Preparing to unpack .../mesa-utils_8.4.0-1_amd64.deb ...\n", | |
"Unpacking mesa-utils (8.4.0-1) ...\n", | |
"Setting up libegl1-mesa:amd64 (20.0.8-0ubuntu1~18.04.1) ...\n", | |
"Setting up mesa-utils (8.4.0-1) ...\n", | |
"Processing triggers for man-db (2.8.3-2ubuntu0.1) ...\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "VdQQvavX3P1V" | |
}, | |
"source": [ | |
"#@markdown Imports.\n", | |
"\n", | |
"import moderngl\n", | |
"import numpy as np\n", | |
"from PIL import Image" | |
], | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "y26DVHRX1u_W" | |
}, | |
"source": [ | |
"#@markdown Create a context using egl backend\n", | |
"ctx = moderngl.create_context(\n", | |
" standalone=True,\n", | |
" backend='egl',\n", | |
")" | |
], | |
"execution_count": 3, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Bq7v66Z93TSm" | |
}, | |
"source": [ | |
"#@markdown First, Vertex shaders ill set `gl_Position` \n", | |
"#@markdown to `in_vert` and `color` to `in_color`.\n", | |
"#@markdown After that, the frament shaders are \n", | |
"#@markdown executed and the `color` variable which \n", | |
"#@markdown `vertex_shader` returns is set to `fragColor`.\n", | |
"#@markdown This would give the color of the point\n", | |
"#@markdown at a particular point.\n", | |
"\n", | |
"prog = ctx.program(vertex_shader=\"\"\"\n", | |
" #version 330\n", | |
" in vec2 in_vert;\n", | |
" in vec3 in_color;\n", | |
" out vec3 color;\n", | |
" void main() {\n", | |
" gl_Position = vec4(in_vert, 0.0, 1.0);\n", | |
" color = in_color;\n", | |
" }\n", | |
" \"\"\",\n", | |
" fragment_shader=\"\"\"\n", | |
" #version 330\n", | |
" in vec3 color;\n", | |
" out vec4 fragColor;\n", | |
" void main() {\n", | |
" fragColor = vec4(color, 1.0);\n", | |
" }\n", | |
"\"\"\")\n" | |
], | |
"execution_count": 4, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "dMMHonZk7My7" | |
}, | |
"source": [ | |
"#@markdown See [this guide](https://moderngl.readthedocs.io/en/latest/the_guide/program.html#module-moderngl)\n", | |
"#@markdown about coordinates.\n", | |
"#@markdown Here, we create vertices which draw a\n", | |
"#@markdown triangle with vertices \n", | |
"#@markdown `[-1, -1], [1, -1], [1, 1]` and also defined color \n", | |
"#@markdown for them in a single NumPy Array.\n", | |
"\n", | |
"vertices = np.array([\n", | |
" -1, -1,\n", | |
" 1.0, 0.0, 0.0, # red color\n", | |
" 1, -1,\n", | |
" 0.0, 1.0, 0.0, # blue color\n", | |
" 1, 1,\n", | |
" 0.0, 0.0, 1.0, # green color\n", | |
"], dtype='f4') # use float32 array\n", | |
"\n", | |
"vbo = ctx.buffer(vertices) # create a buffer in gpu from the vertices we created\n" | |
], | |
"execution_count": 5, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "UnwuCuF_7YjN" | |
}, | |
"source": [ | |
"#@markdown Create a vertex array from our `vbo`.\n", | |
"#@markdown Now, the parameters `in_vert` and `in_color`\n", | |
"#@markdown in `ctx.vertex_array()` says to parse the\n", | |
"#@markdown buffer of vertices and assign it to\n", | |
"#@markdown corresponding variables in our shaders.\n", | |
"#@markdown For example, the first value for `in_vert`\n", | |
"#@markdown would be `(-1 ,-1)` and for `in_color` \n", | |
"#@markdown `1.0, 0.0, 0.0`.\n", | |
"\n", | |
"vao = ctx.vertex_array(prog, vbo, 'in_vert', 'in_color') " | |
], | |
"execution_count": 6, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "eDmpsLjC_kDl" | |
}, | |
"source": [ | |
"#@markdown Now create a framebuffer for rendering.\n", | |
"#@markdown Here, we create a `Context.texture` to hold\n", | |
"#@markdown our finally rendered Image. Change the size\n", | |
"#@markdown the `texture` will change size of the image\n", | |
"#@markdown rendered.\n", | |
"fbo = ctx.framebuffer(\n", | |
" color_attachments=[ctx.texture((512, 512), 4)],\n", | |
")\n", | |
"\n", | |
"fbo.use() # use the frame buffer we created.\n" | |
], | |
"execution_count": 7, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "W7PE0U5pBlTo" | |
}, | |
"source": [ | |
"#@markdown Now clear the screen with white and\n", | |
"#@markdown then render the `vao` using \n", | |
"#@markdown as triangles `moderngl.TRIANGLES`\n", | |
"ctx.clear(1, 1, 1)\n", | |
"vao.render(moderngl.TRIANGLES)\n" | |
], | |
"execution_count": 8, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "dsya-wH4B53e" | |
}, | |
"source": [ | |
"#@markdown Now everything is rendered and \n", | |
"#@markdown time to read it from `fbo`. Finally,\n", | |
"#@markdown after reading them we pass them to a\n", | |
"#@markdown Pillow Image so that we can save as\n", | |
"#@markdown file (`test.png`).\n", | |
"\n", | |
"data = fbo.read(components=3)\n", | |
"image = Image.frombytes('RGB', fbo.size, data)\n", | |
"image.save('test.png')" | |
], | |
"execution_count": 9, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "2N4gN3Oj38dp", | |
"outputId": "fbe9e527-c626-4d05-e1ea-3c6ce2eee78f" | |
}, | |
"source": [ | |
"#@markdown Finally, just to be fancy, use\n", | |
"#@markdown `IPython.display.Image` to display the\n", | |
"#@markdown Image `test.png` which we previously saved.\n", | |
"from IPython.display import Image as IPYImage\n", | |
"IPYImage('test.png')" | |
], | |
"execution_count": 10, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 10 | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Use https://colab.research.google.com/gist/naveen521kk/d7920a00c47afbd463f702d63681fd83/moderngl.ipynb for opening this in Google Collab.