Skip to content

Instantly share code, notes, and snippets.

@naveen521kk
Last active August 10, 2021 12:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save naveen521kk/d7920a00c47afbd463f702d63681fd83 to your computer and use it in GitHub Desktop.
Save naveen521kk/d7920a00c47afbd463f702d63681fd83 to your computer and use it in GitHub Desktop.
Moderngl.ipynb
Display the source blob
Display the rendered blob
Raw
{
"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
}
]
}
]
}
@naveen521kk
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment