self.vbo1 = self.ctx.buffer(b''.join(particle() for i in range(1024))) self.vbo2 = self.ctx.buffer(reserve=self.vbo1.size) self.vao1 = self.ctx.simple_vertex_array(self.transform, self.vbo1, 'in_pos', 'in_prev') self.vao2 = self.ctx.simple_vertex_array(self.transform, self.vbo2, 'in_pos', 'in_prev') self.render_vao = self.ctx.vertex_array(self.prog, [ (self.vbo1, '2f 2x4', 'in_vert'), ]) self.idx = 0 def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) # self.ctx.point_size = 2.0 for i in range(8): self.vbo1.write(particle(), offset=self.idx * 16) self.idx = (self.idx + 1) % 1024 self.render_vao.render(mgl.POINTS, 1024) self.vao1.transform(self.vbo2, mgl.POINTS, 1024) self.ctx.copy_buffer(self.vbo1, self.vbo2) run_example(Particles)
self.crate_x += np.random.uniform(-0.2, 0.2, 32 * 32) self.crate_y += np.random.uniform(-0.2, 0.2, 32 * 32) def render(self): angle = self.wnd.time * 0.2 width, height = self.wnd.size self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.ctx.enable(moderngl.DEPTH_TEST) camera_pos = (np.cos(angle) * 5.0, np.sin(angle) * 5.0, 2.0) proj = Matrix44.perspective_projection(45.0, width / height, 0.1, 1000.0) lookat = Matrix44.look_at( camera_pos, (0.0, 0.0, 0.5), (0.0, 0.0, 1.0), ) self.mvp.write((proj * lookat).astype('f4').tobytes()) self.light.value = camera_pos crate_z = np.sin(self.crate_a * self.wnd.time + self.crate_b) * 0.2 coordinates = np.dstack([self.crate_x, self.crate_y, crate_z]) self.vbo2.write(coordinates.astype('f4').tobytes()) self.vao.render(instances=1024) run_example(InstancedCrates)
) self.scale = self.prog['scale'] self.rotation = self.prog['rotation'] width, height = self.wnd.size self.scale.value = (height / width * 0.75, 0.25) vertices = np.array([ 1.0, 0.0, -0.5, 0.86, -0.5, -0.86, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'vert') def render(self): sin_scale = np.sin(np.deg2rad(self.wnd.time * 60)) self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() self.rotation.value = self.wnd.time # Change the scale of the triangle sin-ly self.scale.value = (sin_scale * 0.75, 0.75) run_example(UniformsAndAttributes)
gl_Position = vec4(in_vert, 0.0, 1.0); } ''', fragment_shader=''' #version 330 out vec4 f_color; void main() { f_color = vec4(0.3, 0.5, 1.0, 1.0); } ''', ) vertices = np.array([ 0.0, 0.8, -0.6, -0.8, 0.6, -0.8, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() run_example(HelloWorld)
z.x = x; z.y = y; } f_color = texture(Texture, vec2((i == Iter ? 0.0 : float(i)) / 100.0, 0.0)); } ''', ) img = Image.open(data.find('pal.png')).convert('RGB') self.texture = self.ctx.texture(img.size, 3, img.tobytes()) self.sampler = self.ctx.sampler(self.texture) self.sampler.use() vertices = np.array([-1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.prog['Seed'] = (-0.8, 0.156) self.prog['Iter'] = 100 self.vao.render(mgl.TRIANGLE_STRIP) run_example(Fractal)
0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, ) for car in cars)) self.vao.render(instances=len(cars)) self.vbo2.write(b''.join( struct.pack( '15f', 0.0, 0.0, 0.0, *car['pos'], 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.3, 0.6, 0.0, ) for car in cars)) self.vao.render(instances=len(cars)) run_example(ToyCars)
] self.vao = self.ctx.vertex_array(self.prog, vao_content, self.ibo) self.img = Image.open(local('data', 'noise.jpg')).convert('L') texture = self.ctx.texture(self.img.size, 1, self.img.tobytes()) texture.use() def render(self): width, height = self.wnd.size angle = self.wnd.time * 0.2 self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.ctx.enable(moderngl.DEPTH_TEST) self.ctx.wireframe = True proj = Matrix44.perspective_projection(45.0, width / height, 0.1, 1000.0) lookat = Matrix44.look_at( (np.cos(angle), np.sin(angle), 0.8), (0.0, 0.0, 0.1), (0.0, 0.0, 1.0), ) self.mvp.write((proj * lookat).astype('f4').tobytes()) self.vao.render(moderngl.TRIANGLE_STRIP) run_example(WireframeTerrain)
self.scale = self.prog['scale'] self.rotation = self.prog['rotation'] width, height = self.wnd.size self.scale.value = (height / width * 0.75, 0.75) vertices = np.array([ 1.0, 0.0, 1.0, 0.0, 0.0, 0.5, -0.5, 0.86, 0.0, 1.0, 0.0, 0.5, -0.5, -0.86, 0.0, 0.0, 1.0, 0.5, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'vert', 'vert_color') def render(self): self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.ctx.enable(moderngl.BLEND) self.rotation.value = self.wnd.time self.vao.render(instances=10) run_example(AlphaBlending)
# There are 2 trianges to render # # A, B, C # B, C, D render_indicies = np.array([ 0, 1, 2, 1, 2, 3 ]) self.index_buffer = self.ctx.buffer(render_indicies.astype('i4').tobytes()) # The vao_content is a list of 3-tuples (buffer, format, attribs) # the format can have an empty or '/v', '/i', '/r' ending. # '/v' attributes are the default # '/i` attributes are per instance attributes # '/r' attributes are default values for the attributes (per render attributes) vao_content = [ (self.position_vertex_buffer, '2f', 'in_vert'), (self.color_buffer, '3f', 'in_color'), (self.pos_scale_buffer, '2f 1f/i', 'in_pos', 'in_scale'), ] self.vao = self.ctx.vertex_array(self.prog, vao_content, self.index_buffer) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render(instances=8) run_example(InstancedRendering)
self.use_texture.value = False self.light.value = (67.69, -8.14, 52.49) self.mvp.write((proj * lookat * rotate).astype('f4').tobytes()) self.color.value = (0.67, 0.49, 0.29) self.objects['ground'].render() self.color.value = (0.46, 0.67, 0.29) self.objects['grass'].render() self.color.value = (1.0, 1.0, 1.0) self.objects['billboard'].render() self.color.value = (0.2, 0.2, 0.2) self.objects['billboard-holder'].render() self.use_texture.value = True if mode == 'render_to_texture': self.texture1.use() else: self.texture2.use() self.objects['billboard-image'].render() run_example(RenderToTexture)
varyings=['out_vert'] ) self.transform['Width'] = width self.transform['Height'] = height self.texture = self.ctx.texture((width, height), 1, pixels.tobytes(), dtype='f4') self.texture.swizzle = 'RRR1' self.sampler = self.ctx.sampler(self.texture) # self.sampler.filter = (mgl.NEAREST, mgl.NEAREST) self.sampler.use() self.vbo = self.ctx.buffer(canvas.tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') self.text = self.ctx.buffer(grid.tobytes()) self.tao = self.ctx.simple_vertex_array(self.transform, self.text, 'in_text') self.pbo = self.ctx.buffer(reserve=pixels.nbytes) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.tao.transform(self.pbo) self.texture.write(self.pbo) self.vao.render(mgl.TRIANGLE_STRIP) run_example(Conway)
self.ctx.enable(moderngl.BLEND) if self.wnd.key_pressed(32): self.shoot() for i in range(10): self.space.step(1 / 60 / 10) self.prog['Camera'].value = (200, 300, width / 2, height / 2) bodies = np.array( [(b.position.x, b.position.y, b.angle, 10, 10, 1, 1, 1, 0) for b in self.bodies], dtype='f4') self.vbo2.write(bodies.tobytes()) self.prog['Texture'].value = 0 self.vao.render(moderngl.TRIANGLE_STRIP, instances=len(self.bodies)) self.vbo2.orphan() balls = np.array( [(b.position.x, b.position.y, b.angle, 15, 15, 1, 1, 1, 0) for b in self.balls], dtype='f4') self.vbo2.write(balls.tobytes()) self.prog['Texture'].value = 1 self.vao.render(moderngl.TRIANGLE_STRIP, instances=len(self.balls)) run_example(PymunkExample)
sampler1.use(1) sampler2.use(2) sampler3.use(3) sampler4.use(4) self.prog['Heightmap'] = 0 self.prog['Color1'] = 1 self.prog['Color2'] = 2 self.prog['Cracks'] = 3 self.prog['Darken'] = 4 def render(self): angle = self.wnd.time * 0.2 self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) with self.ctx.scope(mgl.DEPTH_TEST): proj = Matrix44.perspective_projection(45.0, self.wnd.ratio, 0.1, 1000.0) lookat = Matrix44.look_at( (np.cos(angle), np.sin(angle), 0.8), (0.0, 0.0, 0.1), (0.0, 0.0, 1.0), ) self.prog['Mvp'] = (proj * lookat).astype('f4').tobytes() self.vao.render(mgl.TRIANGLE_STRIP) run_example(MultiTextireTerrain)
self.vao3.scope = self.ctx.scope(mgl.DEPTH_TEST, samplers=[(self.sampler2, 0)]) with self.ctx.recorder: self.ctx.clear(1.0, 1.0, 1.0) self.vao1.render() self.vao2.render() self.vao3.render() self.bytecode = self.ctx.recorder.dump() print(self.bytecode) def render(self): angle = self.wnd.time self.ctx.screen.viewport = self.wnd.viewport camera_pos = (np.cos(angle) * 5.0, np.sin(angle) * 5.0, 2.0) proj = Matrix44.perspective_projection(45.0, self.wnd.ratio, 0.1, 1000.0) lookat = Matrix44.look_at( camera_pos, (0.0, 0.0, 0.5), (0.0, 0.0, 1.0), ) self.prog['Mvp'] = (proj * lookat).astype('f4').tobytes() self.prog['Light'] = camera_pos self.ctx.replay(self.bytecode) run_example(CrateExample)
void main() { color = vec4(0.3, 0.5, 1.0, 1.0); } ''', ) width, height = self.wnd.size vertices = np.array([ 1.0, 0.0, -0.5, 0.86, -0.5, -0.86, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'vert') def render(self): sin_scale = np.sin(np.deg2rad(self.wnd.time * 60)) self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() self.prog['rotation'] = self.wnd.time # Change the scale of the triangle sin-ly self.prog['scale'] = (sin_scale * 0.75, 0.75) run_example(UniformsAndAttributes)
varyings=['out_vert'] ) self.transform['Width'] = width self.transform['Height'] = height self.texture = self.ctx.texture((width, height), 1, pixels.tobytes(), dtype='f4') self.sampler = self.ctx.sampler(self.texture) # self.sampler.filter = (mgl.NEAREST, mgl.NEAREST) # self.sampler.swizzle = 'RRR1' self.sampler.use() self.vbo = self.ctx.buffer(canvas.tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') self.text = self.ctx.buffer(grid.tobytes()) self.tao = self.ctx.simple_vertex_array(self.transform, self.text, 'in_text') self.pbo = self.ctx.buffer(reserve=pixels.nbytes) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.tao.transform(self.pbo) self.texture.write(self.pbo) self.vao.render(mgl.TRIANGLE_STRIP) run_example(Conway)
(0.0, 0.0, 8.0), (0.0, 0.0, 1.0), ) rotate = Matrix44.from_z_rotation(np.sin(self.wnd.time) * 0.5 + 0.2) self.use_texture.value = False self.light.value = (67.69, -8.14, 52.49) self.mvp.write((proj * lookat * rotate).astype('f4').tobytes()) self.color.value = (0.67, 0.49, 0.29) self.objects['ground'].render() self.color.value = (0.46, 0.67, 0.29) self.objects['grass'].render() self.color.value = (1.0, 1.0, 1.0) self.objects['billboard'].render() self.color.value = (0.2, 0.2, 0.2) self.objects['billboard-holder'].render() self.use_texture.value = True self.texture.use() self.objects['billboard-image'].render() run_example(MatplotlibTexture)
) width, height = self.wnd.size self.prog['z_near'] = 0.1 self.prog['z_far'] = 1000.0 self.prog['ratio'] = width / height self.prog['fovy'] = 60 self.prog['eye'] = (3, 3, 3) self.prog['center'] = (0, 0, 0) self.prog['up'] = (0, 0, 1) grid = [] for i in range(65): grid.append([i - 32, -32.0, 0.0, i - 32, 32.0, 0.0]) grid.append([-32.0, i - 32, 0.0, 32.0, i - 32, 0.0]) grid = np.array(grid) self.vbo = self.ctx.buffer(grid.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render(mgl.LINES, 65 * 4) run_example(PerspectiveProjection)
(0.0, 0.0, 1.0), ) rotate = Matrix44.from_z_rotation(np.sin(self.wnd.time) * 0.5 + 0.2) self.prog['UseTexture'] = False self.prog['Light'] = (67.69, -8.14, 52.49) self.prog['Mvp'] = (proj * lookat * rotate).astype('f4').tobytes() self.prog['Color'] = (0.67, 0.49, 0.29) self.objects['ground'].render() self.prog['Color'] = (0.46, 0.67, 0.29) self.objects['grass'].render() self.prog['Color'] = (1.0, 1.0, 1.0) self.objects['billboard'].render() self.prog['Color'] = (0.2, 0.2, 0.2) self.objects['billboard-holder'].render() self.prog['UseTexture'] = True # self.texture.use() self.sampler.use() self.objects['billboard-image'].render() run_example(ColorsAndTexture)
vertices = np.array([ 0.0, 0.0, -0.6, -0.8, 0.6, -0.8, 0.6, 0.8, -0.6, 0.8, ]) # Indecies are given to specify the order of drawing indecies = np.array([0, 1, 2, 0, 3, 4]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.ibo = self.ctx.buffer(indecies.astype('i4').tobytes()) vao_content = [ # 2 floats are assigned to the 'in' variable named 'in_vert' in the shader code (self.vbo, '2f', 'in_vert') ] self.vao = self.ctx.vertex_array(self.prog, vao_content, self.ibo) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() run_example(IndexBuffer)
) width, height = self.wnd.size self.prog['z_near'].value = 0.1 self.prog['z_far'].value = 1000.0 self.prog['ratio'].value = width / height self.prog['fovy'].value = 60 self.prog['eye'].value = (3, 3, 3) self.prog['center'].value = (0, 0, 0) self.prog['up'].value = (0, 0, 1) grid = [] for i in range(65): grid.append([i - 32, -32.0, 0.0, i - 32, 32.0, 0.0]) grid.append([-32.0, i - 32, 0.0, 32.0, i - 32, 0.0]) grid = np.array(grid) self.vbo = self.ctx.buffer(grid.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'vert') def render(self): self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render(moderngl.LINES, 65 * 4) run_example(PerspectiveProjection)
sticker_vertices.T.astype('f4').tobytes()) self.sticker_vao = self.ctx.simple_vertex_array( self.prog, self.sticker_vbo, 'in_vert', 'in_norm', 'in_text') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.bg_sampler.use() with self.ctx.scope(mgl.BLEND): self.canvas_vao.render(mgl.TRIANGLE_STRIP) with self.ctx.scope(mgl.DEPTH_TEST): proj = Matrix44.perspective_projection(30.0, self.wnd.ratio, 1.0, 1000.0) lookat = Matrix44.look_at( (46.748, -280.619, 154.391), (-23.844, 2.698, 44.493), (0.0, 0.0, 1.0), ) self.prog['Mvp'] = (proj * lookat).astype('f4').tobytes() self.prog['Light'] = (-143.438, -159.072, 213.268) self.mug_sampler.use() self.mug_vao.render() with self.ctx.scope(mgl.DEPTH_TEST | mgl.BLEND): self.sticker_sampler.use() self.sticker_vao.render(mgl.TRIANGLE_STRIP) run_example(MugExample)
self.texture = self.ctx.texture(self.wood.size, 3, self.wood.tobytes()) self.texture.build_mipmaps() self.vbo = self.ctx.buffer(self.obj.pack('vx vy vz nx ny nz tx ty')) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert', 'in_norm', 'in_text') def render(self): width, height = self.wnd.size self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.ctx.enable(moderngl.DEPTH_TEST) proj = Matrix44.perspective_projection(45.0, width / height, 0.1, 1000.0) lookat = Matrix44.look_at( (-85, -180, 140), (0.0, 0.0, 65.0), (0.0, 0.0, 1.0), ) self.light.value = (-140.0, -300.0, 350.0) self.color.value = (1.0, 1.0, 1.0, 0.25) self.mvp.write((proj * lookat).astype('f4').tobytes()) self.texture.use() self.vao.render() run_example(LoadingOBJ)
self.transform['Acc'] = (0.0, -0.0001) self.vbo1 = self.ctx.buffer(b''.join(particle() for i in range(1024))) self.vbo2 = self.ctx.buffer(reserve=self.vbo1.size) self.vao1 = self.ctx.simple_vertex_array(self.transform, self.vbo1, 'in_pos', 'in_prev') self.vao2 = self.ctx.simple_vertex_array(self.transform, self.vbo2, 'in_pos', 'in_prev') self.render_vao = self.ctx.vertex_array(self.prog, [ (self.vbo1, '2f 2x4', 'in_vert'), ]) self.idx = 0 def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) # self.ctx.point_size = 2.0 for i in range(8): self.vbo1.write(particle(), offset=self.idx * 16) self.idx = (self.idx + 1) % 1024 self.render_vao.render(mgl.POINTS, 1024) self.vao1.transform(self.vbo2, mgl.POINTS, 1024) self.ctx.copy_buffer(self.vbo1, self.vbo2) run_example(Particles)
in vec3 v_color; out vec4 f_color; void main() { // We're not interested in changing the alpha value f_color = vec4(v_color, 1.0); } ''', ) # Point coordinates are put followed by the vec3 color values vertices = np.array([ # x, y, red, green, blue 0.0, 0.8, 1.0, 0.0, 0.0, -0.6, -0.8, 0.0, 1.0, 0.0, 0.6, -0.8, 0.0, 0.0, 1.0, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) # We control the 'in_vert' and `in_color' variables self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert', 'in_color') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() run_example(SimpleColorTriangle)
) rotate = Matrix44.from_z_rotation( np.sin(self.wnd.time) * 0.5 + 0.2) self.prog['UseTexture'] = False self.prog['Light'] = (67.69, -8.14, 52.49) self.prog['Mvp'] = (proj * lookat * rotate).astype('f4').tobytes() self.prog['Color'] = (0.67, 0.49, 0.29) self.objects['ground'].render() self.prog['Color'] = (0.46, 0.67, 0.29) self.objects['grass'].render() self.prog['Color'] = (1.0, 1.0, 1.0) self.objects['billboard'].render() self.prog['Color'] = (0.2, 0.2, 0.2) self.objects['billboard-holder'].render() self.prog['UseTexture'] = True # self.texture.use() self.sampler.use() self.objects['billboard-image'].render() run_example(ColorsAndTexture)
#version 330 out vec4 f_color; void main() { f_color = vec4(0.1, 0.1, 0.1, 1.0); } ''', ) self.vbo = self.ctx.buffer(grid(15, 10).astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) with self.ctx.scope(mgl.DEPTH_TEST): proj = Matrix44.perspective_projection(45.0, self.wnd.ratio, 0.1, 1000.0) lookat = Matrix44.look_at( (40.0, 30.0, 30.0), (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), ) self.prog['Mvp'] = (proj * lookat).astype('f4').tobytes() self.vao.render(mgl.LINES) run_example(SimpleGrid)
''', ) width, height = self.wnd.size self.prog['scale'] = (height / width * 0.75, 0.75) vertices = np.array([ 1.0, 0.0, 1.0, 0.0, 0.0, 0.5, -0.5, 0.86, 0.0, 1.0, 0.0, 0.5, -0.5, -0.86, 0.0, 0.0, 1.0, 0.5, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'vert', 'vert_color') self.blend = self.ctx.scope(enable_only=mgl.BLEND) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.prog['rotation'] = self.wnd.time with self.blend: self.vao.render(instances=10) run_example(AlphaBlending)
camera_pos, (0.0, 0.0, 0.5), (0.0, 0.0, 1.0), ) self.prog['Mvp'] = (proj * lookat).astype('f4').tobytes() self.prog['Light'] = camera_pos # self.vbo2.write(Matrix33.from_z_rotation(self.wnd.time).astype('f4').tobytes(), offset=24) self.vbo2.write(b''.join(struct.pack( '15f', *car['color'], *car['pos'], 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, ) for car in cars)) self.vao.render(instances=len(cars)) self.vbo2.write(b''.join(struct.pack( '15f', 0.0, 0.0, 0.0, *car['pos'], 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.3, 0.6, 0.0, ) for car in cars)) self.vao.render(instances=len(cars)) run_example(ToyCars)
z.y = y; } f_color = texture(Texture, vec2((i == Iter ? 0.0 : float(i)) / 100.0, 0.0)); } ''') img = Image.open(data.find('pal.png')).convert('RGB') self.texture = self.ctx.texture(img.size, 3, img.tobytes()) self.sampler = self.ctx.sampler(self.texture) self.sampler.use() vertices = np.array([-1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.prog['Center'] = (0.5, 0.0) self.prog['Iter'] = 100 self.prog['Scale'] = 1.5 self.prog['Ratio'] = self.wnd.ratio self.vao.render(mgl.TRIANGLE_STRIP) run_example(Fractal)
0.0, 0.8, 1.0, 0.0, 0.0, -0.6, -0.8, 0.0, 1.0, 0.0, 0.6, -0.8, 0.0, 0.0, 1.0, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) # We control the 'in_vert' and `in_color' variables self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert', 'in_color') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() run_example(SimpleColorTriangle)
# Index buffer (also called element buffer) # There are 2 trianges to render # # A, B, C # B, C, D render_indicies = np.array([0, 1, 2, 1, 2, 3]) self.index_buffer = self.ctx.buffer( render_indicies.astype('i4').tobytes()) # The vao_content is a list of 3-tuples (buffer, format, attribs) # the format can have an empty or '/v', '/i', '/r' ending. # '/v' attributes are the default # '/i` attributes are per instance attributes # '/r' attributes are default values for the attributes (per render attributes) vao_content = [ (self.position_vertex_buffer, '2f', 'in_vert'), (self.color_buffer, '3f', 'in_color'), (self.pos_scale_buffer, '2f 1f/i', 'in_pos', 'in_scale'), ] self.vao = self.ctx.vertex_array(self.prog, vao_content, self.index_buffer) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render(instances=8) run_example(InstancedRendering)
fragment_shader=''' #version 330 out vec4 f_color; void main() { f_color = vec4(0.1, 0.1, 0.1, 1.0); } ''', ) self.vbo = self.ctx.buffer(grid(15, 10).astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) with self.ctx.scope(mgl.DEPTH_TEST): proj = Matrix44.perspective_projection(45.0, self.wnd.ratio, 0.1, 1000.0) lookat = Matrix44.look_at( (40.0, 30.0, 30.0), (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), ) self.prog['Mvp'] = (proj * lookat).astype('f4').tobytes() self.vao.render(mgl.LINES) run_example(SimpleGrid)
-0.6, -0.8, 0.6, -0.8, 0.6, 0.8, -0.6, 0.8, ]) # Indecies are given to specify the order of drawing indecies = np.array([0, 1, 2, 0, 3, 4]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.ibo = self.ctx.buffer(indecies.astype('i4').tobytes()) vao_content = [ # 2 floats are assigned to the 'in' variable named 'in_vert' in the shader code (self.vbo, '2f', 'in_vert') ] self.vao = self.ctx.vertex_array(self.prog, vao_content, self.ibo) def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() run_example(IndexBuffer)
fragment_shader=''' #version 330 out vec4 f_color; void main() { f_color = vec4(0.3, 0.5, 1.0, 1.0); } ''', ) vertices = np.array([ 0.0, 0.8, -0.6, -0.8, 0.6, -0.8, ]) self.vbo = self.ctx.buffer(vertices.astype('f4').tobytes()) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert') def render(self): self.ctx.screen.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.vao.render() run_example(HelloWorld)
obj = Obj.open(local('data', 'crate.obj')) img = Image.open(local('data', 'crate.png')).transpose(Image.FLIP_TOP_BOTTOM).convert('RGB') self.texture = self.ctx.texture(img.size, 3, img.tobytes()) self.texture.use() self.vbo = self.ctx.buffer(obj.pack('vx vy vz nx ny nz tx ty')) self.vao = self.ctx.simple_vertex_array(self.prog, self.vbo, 'in_vert', 'in_norm', 'in_text') def render(self): angle = self.wnd.time self.ctx.viewport = self.wnd.viewport self.ctx.clear(1.0, 1.0, 1.0) self.ctx.enable(moderngl.DEPTH_TEST) camera_pos = (np.cos(angle) * 5.0, np.sin(angle) * 5.0, 2.0) proj = Matrix44.perspective_projection(45.0, self.wnd.ratio, 0.1, 1000.0) lookat = Matrix44.look_at( camera_pos, (0.0, 0.0, 0.5), (0.0, 0.0, 1.0), ) self.mvp.write((proj * lookat).astype('f4').tobytes()) self.light.value = camera_pos self.vao.render() run_example(CrateExample)
import moderngl from example_window import Example, run_example class EmptyWindow(Example): def __init__(self): self.ctx = moderngl.create_context() def render(self): self.ctx.viewport = self.wnd.viewport self.ctx.clear(0.2, 0.4, 0.7) run_example(EmptyWindow)