def test_arrays(self): vert_src = ''' #version %(version)s in %(type)s v_in[2]; out %(type)s v_out[2]; void main() { v_out[0] = v_in[0] + v_in[0]; v_out[1] = v_in[1] + v_in[1]; } ''' for vtype in vtypes: with self.subTest(vert_src=vert_src, vtype=vtype): if self.ctx.version_code < vtype['version']: warnings.warn('skipping version %s' % vtype['version']) continue prog = self.ctx.program(vertex_shader=vert_src % vtype, varyings=['v_out']) if 'v_in' not in prog.attributes: warnings.warn('skipping %s' % vtype['type']) continue fmt = moderngl.detect_format(prog, ['v_in']) vbo1 = self.ctx.buffer(struct.pack(fmt, *(vtype['input'] * 2))) vbo2 = self.ctx.buffer(b'\xAA' * struct.calcsize(fmt)) vao = self.ctx.simple_vertex_array(prog, vbo1, 'v_in') vao.transform(vbo2, moderngl.POINTS, 1) for a, b in zip(struct.unpack(fmt, vbo2.read()), vtype['output'] * 2): self.assertAlmostEqual(a, b)
def test_arrays(self): vert_src = ''' #version %(version)s in %(type)s v_in[]; out %(type)s v_out[]; void main() { v_out[0] = v_in[0] + v_in[0]; v_out[1] = v_in[1] + v_in[1]; } ''' for vtype in vtypes: with self.subTest(vert_src=vert_src, vtype=vtype): if self.ctx.version_code < vtype['version']: warnings.warn('skipping version %s' % vtype['version']) continue prog = self.ctx.program(vertex_shader=vert_src % vtype, varyings=['v_out']) if 'v_in' not in prog.attributes: warnings.warn('skipping %s' % vtype['type']) continue fmt = moderngl.detect_format(prog, ['v_in']) vbo1 = self.ctx.buffer(struct.pack(fmt, *(vtype['input'] * 2))) vbo2 = self.ctx.buffer(b'\xAA' * struct.calcsize(fmt)) vao = self.ctx.simple_vertex_array(prog, vbo1, 'v_in') vao.transform(vbo2, moderngl.POINTS, 1) for a, b in zip(struct.unpack(fmt, vbo2.read()), vtype['output'] * 2): self.assertAlmostEqual(a, b)
def get_shader_program(self, shader_wrapper): sid = shader_wrapper.get_program_id() if sid not in self.id_to_shader_program: # Create shader program for the first time, then cache # in the id_to_shader_program dictionary program = self.ctx.program(**shader_wrapper.get_program_code()) vert_format = moderngl.detect_format(program, shader_wrapper.vert_attributes) self.id_to_shader_program[sid] = (program, vert_format) return self.id_to_shader_program[sid]
def get_shader_program(self, context, shader_wrapper): sid = shader_wrapper.get_program_id() if sid not in self.id_to_shader_program: # Create shader program for the first time, then cache # in self.id_to_shader_program. program_code = shader_wrapper.get_program_code() program = self.context.program(**program_code) vert_format = moderngl.detect_format( program, shader_wrapper.vert_attributes) self.id_to_shader_program[sid] = (program, vert_format) return self.id_to_shader_program[sid]