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)
Beispiel #3
0
 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]
Beispiel #4
0
 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]