def test_framebuffer(): # Test init with no args gloo.get_a_context().glir.clear() F = FrameBuffer() glir_cmds = F._context.glir.clear() assert len(glir_cmds) == 1 glir_cmds[0][0] == 'CREATE' # Activate / deactivate F.activate() glir_cmd = F._context.glir.clear()[-1] assert glir_cmd[0] == 'FRAMEBUFFER' assert glir_cmd[2] is True # F.deactivate() glir_cmd = F._context.glir.clear()[-1] assert glir_cmd[0] == 'FRAMEBUFFER' assert glir_cmd[2] is False # with F: pass glir_cmds = F._context.glir.clear() assert len(glir_cmds) == 2 assert glir_cmds[0][0] == 'FRAMEBUFFER' assert glir_cmds[1][0] == 'FRAMEBUFFER' assert glir_cmds[0][2] is True and glir_cmds[1][2] is False # Init with args R = RenderBuffer((3, 3)) F = FrameBuffer(R) assert F.color_buffer is R # R2 = RenderBuffer((3, 3)) F.color_buffer = R2 assert F.color_buffer is R2 # Wrong buffers F = FrameBuffer() assert_raises(TypeError, FrameBuffer.color_buffer.fset, F, 'FOO') assert_raises(TypeError, FrameBuffer.color_buffer.fset, F, []) assert_raises(TypeError, FrameBuffer.depth_buffer.fset, F, 'FOO') assert_raises(TypeError, FrameBuffer.stencil_buffer.fset, F, 'FOO') color_buffer = RenderBuffer((9, 9), 'color') assert_raises(ValueError, FrameBuffer.depth_buffer.fset, F, color_buffer) # But None is allowed! F.color_buffer = None # Shape R1 = RenderBuffer((3, 3)) R2 = RenderBuffer((3, 3)) R3 = RenderBuffer((3, 3)) F = FrameBuffer(R1, R2, R3) assert F.shape == R1.shape assert R1.format == 'color' assert R2.format == 'depth' assert R3.format == 'stencil' # Resize F.resize((10, 10)) assert F.shape == (10, 10) assert F.shape == R1.shape assert F.shape == R2.shape assert F.shape == R3.shape assert R1.format == 'color' assert R2.format == 'depth' assert R3.format == 'stencil' # Shape from any buffer F.color_buffer = None assert F.shape == (10, 10) F.depth_buffer = None assert F.shape == (10, 10) F.stencil_buffer = None assert_raises(RuntimeError, FrameBuffer.shape.fget, F) # Also with Texture luminance T = gloo.Texture2D((20, 30)) R = RenderBuffer(T.shape) assert T.format == 'luminance' F = FrameBuffer(T, R) assert F.shape == T.shape[:2] assert F.shape == R.shape assert T.format == 'luminance' assert R.format == 'depth' # Resize F.resize((10, 10)) assert F.shape == (10, 10) assert T.shape == (10, 10, 1) assert F.shape == R.shape assert T.format == 'luminance' assert R.format == 'depth' # Also with Texture RGB T = gloo.Texture2D((20, 30, 3)) R = RenderBuffer(T.shape) assert T.format == 'rgb' F = FrameBuffer(T, R) assert F.shape == T.shape[:2] assert F.shape == R.shape assert T.format == 'rgb' assert R.format == 'depth' # Resize F.resize((10, 10)) assert F.shape == (10, 10) assert T.shape == (10, 10, 3) assert F.shape == R.shape assert T.format == 'rgb' assert R.format == 'depth' # Wrong shape in resize assert_raises(ValueError, F. resize, (9, 9, 1)) assert_raises(ValueError, F. resize, (9,)) assert_raises(ValueError, F. resize, 'FOO')
def test_framebuffer(): # Test init with no args F = FrameBuffer() glir_cmds = F._glir.clear() assert len(glir_cmds) == 1 glir_cmds[0][0] == 'CREATE' # Activate / deactivate F.activate() glir_cmd = F._glir.clear()[-1] assert glir_cmd[0] == 'FRAMEBUFFER' assert glir_cmd[2] is True # F.deactivate() glir_cmd = F._glir.clear()[-1] assert glir_cmd[0] == 'FRAMEBUFFER' assert glir_cmd[2] is False # with F: pass glir_cmds = F._glir.clear() assert len(glir_cmds) == 2 assert glir_cmds[0][0] == 'FRAMEBUFFER' assert glir_cmds[1][0] == 'FRAMEBUFFER' assert glir_cmds[0][2] is True and glir_cmds[1][2] is False # Init with args R = RenderBuffer((3, 3)) F = FrameBuffer(R) assert F.color_buffer is R # R2 = RenderBuffer((3, 3)) F.color_buffer = R2 assert F.color_buffer is R2 # Wrong buffers F = FrameBuffer() assert_raises(TypeError, FrameBuffer.color_buffer.fset, F, 'FOO') assert_raises(TypeError, FrameBuffer.color_buffer.fset, F, []) assert_raises(TypeError, FrameBuffer.depth_buffer.fset, F, 'FOO') assert_raises(TypeError, FrameBuffer.stencil_buffer.fset, F, 'FOO') color_buffer = RenderBuffer((9, 9), 'color') assert_raises(ValueError, FrameBuffer.depth_buffer.fset, F, color_buffer) # But None is allowed! F.color_buffer = None # Shape R1 = RenderBuffer((3, 3)) R2 = RenderBuffer((3, 3)) R3 = RenderBuffer((3, 3)) F = FrameBuffer(R1, R2, R3) assert F.shape == R1.shape assert R1.format == 'color' assert R2.format == 'depth' assert R3.format == 'stencil' # Resize F.resize((10, 10)) assert F.shape == (10, 10) assert F.shape == R1.shape assert F.shape == R2.shape assert F.shape == R3.shape assert R1.format == 'color' assert R2.format == 'depth' assert R3.format == 'stencil' # Shape from any buffer F.color_buffer = None assert F.shape == (10, 10) F.depth_buffer = None assert F.shape == (10, 10) F.stencil_buffer = None assert_raises(RuntimeError, FrameBuffer.shape.fget, F) # Also with Texture luminance T = gloo.Texture2D((20, 30)) R = RenderBuffer(T.shape) assert T.format == 'luminance' F = FrameBuffer(T, R) assert F.shape == T.shape[:2] assert F.shape == R.shape assert T.format == 'luminance' assert R.format == 'depth' # Resize F.resize((10, 10)) assert F.shape == (10, 10) assert T.shape == (10, 10, 1) assert F.shape == R.shape assert T.format == 'luminance' assert R.format == 'depth' # Also with Texture RGB T = gloo.Texture2D((20, 30, 3)) R = RenderBuffer(T.shape) assert T.format == 'rgb' F = FrameBuffer(T, R) assert F.shape == T.shape[:2] assert F.shape == R.shape assert T.format == 'rgb' assert R.format == 'depth' # Resize F.resize((10, 10)) assert F.shape == (10, 10) assert T.shape == (10, 10, 3) assert F.shape == R.shape assert T.format == 'rgb' assert R.format == 'depth' # Wrong shape in resize assert_raises(ValueError, F.resize, (9, 9, 1)) assert_raises(ValueError, F.resize, (9, )) assert_raises(ValueError, F.resize, 'FOO')
class Canvas(app.Canvas): def __init__(self): app.Canvas.__init__(self, title='Framebuffer post-processing', keys='interactive', size=(512, 512)) def on_initialize(self, event): # Build cube data # -------------------------------------- vertices, indices, _ = create_cube() vertices = VertexBuffer(vertices) self.indices = IndexBuffer(indices) # Build program # -------------------------------------- view = translate((0,0,-7)) self.phi, self.theta = np.radians(60), np.radians(20) model = rotate(self.theta, (0, 0, 1)) * rotate(self.phi, (0, 1, 0)) self.cube = Program(cube_vertex, cube_fragment) self.cube.bind(vertices) self.cube["texture"] = checkerboard() self.cube["texture"].interpolation = 'linear' self.cube['model'] = model self.cube['view'] = view depth = DepthBuffer((512, 512)) color = Texture2D(shape=(512, 512, 3), dtype=np.dtype(np.float32)) self.framebuffer = FrameBuffer(color=color, depth=depth) self.quad = Program(quad_vertex, quad_fragment, count=4) self.quad['texcoord'] = [(0, 0), (0, 1), (1, 0), (1, 1)] self.quad['position'] = [(-1, -1), (-1, +1), (+1, -1), (+1, +1)] self.quad['texture'] = color self.quad["texture"].interpolation = 'linear' # OpenGL and Timer initalization # -------------------------------------- set_state(clear_color=(.3, .3, .35, 1), depth_test=True) self.timer = app.Timer('auto', connect=self.on_timer, start=True) self._set_projection(self.size) def on_draw(self, event): self.framebuffer.activate() set_viewport(0, 0, 512, 512) clear(color=True, depth=True) set_state(depth_test=True) self.cube.draw('triangles', self.indices) self.framebuffer.deactivate() set_viewport(0, 0, *self.size) clear(color=True) set_state(depth_test=False) self.quad.draw('triangle_strip') def on_resize(self, event): self._set_projection(event.size) def _set_projection(self, size): width, height = size set_viewport(0, 0, width, height) projection = perspective(30.0, width / float(height), 2.0, 10.0) self.cube['projection'] = projection def on_timer(self, event): self.theta += .02 self.phi += .02 model = rotate(self.theta, (0, 0, 1)) * rotate(self.phi, (0, 1, 0)) self.cube['model'] = model self.update()
class Canvas(app.Canvas): def __init__(self): app.Canvas.__init__(self, title='Framebuffer post-processing', keys='interactive', size=(512, 512)) def on_initialize(self, event): # Build cube data # -------------------------------------- vertices, indices, _ = create_cube() vertices = VertexBuffer(vertices) self.indices = IndexBuffer(indices) # Build program # -------------------------------------- view = np.eye(4, dtype=np.float32) model = np.eye(4, dtype=np.float32) translate(view, 0, 0, -7) self.phi, self.theta = 60, 20 rotate(model, self.theta, 0, 0, 1) rotate(model, self.phi, 0, 1, 0) self.cube = Program(cube_vertex, cube_fragment) self.cube.bind(vertices) self.cube["texture"] = checkerboard() self.cube["texture"].interpolation = 'linear' self.cube['model'] = model self.cube['view'] = view depth = DepthBuffer((512, 512)) color = Texture2D(shape=(512, 512, 3), interpolation='linear', dtype=np.dtype(np.float32)) self.framebuffer = FrameBuffer(color=color, depth=depth) self.quad = Program(quad_vertex, quad_fragment, count=4) self.quad['texcoord'] = [(0, 0), (0, 1), (1, 0), (1, 1)] self.quad['position'] = [(-1, -1), (-1, +1), (+1, -1), (+1, +1)] self.quad['texture'] = color # OpenGL and Timer initalization # -------------------------------------- set_state(clear_color=(.3, .3, .35, 1), depth_test=True) self.timer = app.Timer('auto', connect=self.on_timer, start=True) self._set_projection(self.size) def on_draw(self, event): self.framebuffer.activate() set_viewport(0, 0, 512, 512) clear(color=True, depth=True) set_state(depth_test=True) self.cube.draw('triangles', self.indices) self.framebuffer.deactivate() set_viewport(0, 0, *self.size) clear(color=True) set_state(depth_test=False) self.quad.draw('triangle_strip') def on_resize(self, event): self._set_projection(event.size) def _set_projection(self, size): width, height = size set_viewport(0, 0, width, height) projection = perspective(30.0, width / float(height), 2.0, 10.0) self.cube['projection'] = projection def on_timer(self, event): self.theta += .5 self.phi += .5 model = np.eye(4, dtype=np.float32) rotate(model, self.theta, 0, 0, 1) rotate(model, self.phi, 0, 1, 0) self.cube['model'] = model self.update()