Skip to content
Back to top
View this page

# Rendering to a window

By default, ModernGL does not have a window, but the moderngl-window module allows you to use one. The installation is as follows:

    pip install moderngl-window

moderngl-window uses pyglet as its default backend. It is installed automatically along with moderngl-window. However, its use is limited to the supported functionality in `moderngl_window.WindowConfig`.

Entire source

     1import moderngl_window as glw
     2import numpy as np
     3
     4window_cls = glw.get_local_window_cls('pyglet')
     5window = window_cls(
     6    size=(512, 512), fullscreen=False, title='ModernGL Window',
     7    resizable=False, vsync=True, gl_version=(3, 3)
     8)
     9ctx = window.ctx
    10glw.activate_context(window, ctx=ctx)
    11window.clear()
    12window.swap_buffers()
    13
    14prog = ctx.program(
    15    vertex_shader="""
    16        #version 330
    17
    18        in vec2 in_vert;
    19        in vec3 in_color;
    20
    21        out vec3 v_color;
    22
    23        void main() {
    24            v_color = in_color;
    25            gl_Position = vec4(in_vert, 0.0, 1.0);
    26        }
    27    """,
    28    fragment_shader="""
    29        #version 330
    30
    31        in vec3 v_color;
    32
    33        out vec3 f_color;
    34
    35        void main() {
    36            f_color = v_color;
    37        }
    38    """,
    39)
    40
    41x = np.linspace(-1.0, 1.0, 50)
    42y = np.random.rand(50) - 0.5
    43r = np.zeros(50)
    44g = np.ones(50)
    45b = np.zeros(50)
    46
    47vertices = np.dstack([x, y, r, g, b])
    48
    49vbo = ctx.buffer(vertices.astype("f4").tobytes())
    50vao = ctx.vertex_array(prog, vbo, "in_vert", "in_color")
    51
    52fbo = ctx.framebuffer(
    53    color_attachments=[ctx.texture((512, 512), 3)]
    54)
    55
    56
    57while not window.is_closing:
    58    fbo.use()
    59    fbo.clear(0.0, 0.0, 0.0, 1.0)
    60    vao.render(gl.LINE_STRIP)
    61
    62    ctx.copy_framebuffer(window.fbo, fbo)
    63
    64    window.swap_buffers()

You can read the full usage of moderngl-window in its documentation.