Пример #1
0
    def render_color_many(self, obj_ids, W, H, K, Rs, ts, near, far, rows,
                          cols):
        assert W <= Renderer.MAX_FBO_WIDTH and H <= Renderer.MAX_FBO_HEIGHT

        if self._samples > 1:
            self._render_fbo.bind()

        self._fbo.bind()
        self.scene_shader.use()
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glViewport(0, 0, W, H)

        for obj_id, R, t, row, col in zip(obj_ids, Rs, ts, rows, cols):
            camera = gu.Camera()
            camera.realCamera(W, H, K.copy(), R, t, near, far)
            #camera.real_camera(W, H, K.copy(), R, t, near, far, r=row, c=col)
            self._scene_buffer.update(camera.data)

            #glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, ctypes.c_void_p(obj_id*4*5))
            glDrawArraysIndirect(GL_TRIANGLES, ctypes.c_void_p(obj_id * 16))

        self._gradient_fbo.bind()
        glClear(GL_COLOR_BUFFER_BIT)
        glViewport(0, 0, W, H)
        self.outline_shader.use()

        if self._samples > 1:
            for i in xrange(2):
                glNamedFramebufferReadBuffer(self._render_fbo.id,
                                             GL_COLOR_ATTACHMENT0 + i)
                glNamedFramebufferDrawBuffer(self._fbo.id,
                                             GL_COLOR_ATTACHMENT0 + i)
                glBlitNamedFramebuffer(self._render_fbo.id, self._fbo.id, 0, 0,
                                       W, H, 0, 0, W, H, GL_COLOR_BUFFER_BIT,
                                       GL_NEAREST)
            self._fbo.bind()

        glUniform1f(0, 1.0)
        glDrawArrays(GL_TRIANGLE_FAN, 0, 4)

        self.line_shader.use()
        for obj_id, R, t, row, col in zip(obj_ids, Rs, ts, rows, cols):
            camera = gu.Camera()
            camera.realCamera(W, H, K.copy(), R, t, near, far)
            #camera.real_camera(W, H, K.copy(), R, t, near, far, r=row, c=col)
            self._scene_buffer.update(camera.data)

            glDrawArraysInstanced(GL_LINES, 0, 2, 3)

        rg_scene_flipped = glReadPixels(0, 0, W, H, GL_RGB,
                                        GL_FLOAT).reshape(H, W, 3)
        rg_scene = np.flipud(rg_scene_flipped).copy()

        return (rg_scene, None)
Пример #2
0
    def render_many(self, obj_ids, W, H, K, Rs, ts, near, far, random_light=True, phong={'ambient':0.4,'diffuse':0.8, 'specular':0.3}):
        assert W <= Renderer.MAX_FBO_WIDTH and H <= Renderer.MAX_FBO_HEIGHT

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glViewport(0, 0, W, H)

        if random_light:
            self.set_light_pose( 1000.*np.random.random(3) )
            self.set_ambient_light(phong['ambient'] + 0.1*(2*np.random.rand()-1))
            self.set_diffuse_light(phong['diffuse'] + 0.1*(2*np.random.rand()-1))
            self.set_specular_light(phong['specular'] + 0.1*(2*np.random.rand()-1))
            # self.set_ambient_light(phong['ambient'])
            # self.set_diffuse_light(0.7)
            # self.set_specular_light(0.3)
        else:
            self.set_light_pose( np.array([400., 400., 400]) )
            self.set_ambient_light(phong['ambient'])
            self.set_diffuse_light(phong['diffuse'])
            self.set_specular_light(phong['specular'])

        bbs = []
        for i in xrange(len(obj_ids)):
            o = obj_ids[i]
            R = Rs[i]
            t = ts[i]
            camera = gu.Camera()
            camera.realCamera(W, H, K, R, t, near, far)
            self._scene_buffer.update(camera.data)

            self._fbo.bind()
            glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, ctypes.c_void_p(o*4*5))

            self._fbo_depth.bind()
            glViewport(0, 0, W, H)
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, ctypes.c_void_p(o*4*5))

            glNamedFramebufferReadBuffer(self._fbo_depth.id, GL_COLOR_ATTACHMENT1)
            depth_flipped = glReadPixels(0, 0, W, H, GL_RED, GL_FLOAT).reshape(H,W)
            depth = np.flipud(depth_flipped).copy()

            ys, xs = np.nonzero(depth > 0)
            obj_bb = misc.calc_2d_bbox(xs, ys, (W,H))
            bbs.append(obj_bb)

        glBindFramebuffer(GL_FRAMEBUFFER, self._fbo.id)
        glNamedFramebufferReadBuffer(self._fbo.id, GL_COLOR_ATTACHMENT0)
        bgr_flipped = np.frombuffer( glReadPixels(0, 0, W, H, GL_BGR, GL_UNSIGNED_BYTE), dtype=np.uint8 ).reshape(H,W,3)
        bgr = np.flipud(bgr_flipped).copy()

        glNamedFramebufferReadBuffer(self._fbo.id, GL_COLOR_ATTACHMENT1)
        depth_flipped = glReadPixels(0, 0, W, H, GL_RED, GL_FLOAT).reshape(H,W)
        depth = np.flipud(depth_flipped).copy()

        return bgr, depth, bbs
Пример #3
0
    def render(self,
               obj_id,
               K,
               R,
               t,
               near,
               far,
               row=0.0,
               col=0.0,
               reconst=False):
        W, H = self.W, self.H

        camera = gu.Camera()
        camera.realCamera(W, H, K, R, t, near, far)
        self._scene_buffer.update(camera.data)

        self._fbo.bind()
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glViewport(0, 0, W, H)

        # if reconst:
        #     self.scene_shader.use()
        #     glDrawArraysIndirect(GL_TRIANGLES, ctypes.c_void_p(obj_id*16))

        #     self._gradient_fbo.bind()
        #     self.outline_shader.use()
        #     glClear(GL_COLOR_BUFFER_BIT)
        #     glViewport(0, 0, W, H)
        #     glDrawArrays(GL_TRIANGLE_FAN, 0, 4)

        self.line_shader.use()
        #number of lines
        glUniform3f(0, self.min_vert[obj_id][0], self.min_vert[obj_id][1],
                    self.min_vert[obj_id][2])
        glUniform3f(1, self.max_vert[obj_id][0], self.max_vert[obj_id][1],
                    self.max_vert[obj_id][2])
        glDrawArraysInstanced(GL_LINES, 0, 2, 15)

        rgb_flipped = np.frombuffer(glReadPixels(0, 0, W, H, GL_RGB,
                                                 GL_UNSIGNED_BYTE),
                                    dtype=np.uint8).reshape(H, W, 3)
        return np.flipud(rgb_flipped).copy()
Пример #4
0
    def __init__(self,
                 models_cad_files,
                 samples=1,
                 vertex_tmp_store_folder='.',
                 clamp=False):
        self._samples = samples
        self._context = gu.OffscreenContext()

        # FBO
        W, H = Renderer.MAX_FBO_WIDTH, Renderer.MAX_FBO_HEIGHT
        self._fbo = gu.Framebuffer({
            GL_COLOR_ATTACHMENT0:
            gu.Texture(GL_TEXTURE_2D, 1, GL_RGB8, W, H),
            GL_COLOR_ATTACHMENT1:
            gu.Texture(GL_TEXTURE_2D, 1, GL_R32F, W, H),
            GL_DEPTH_ATTACHMENT:
            gu.Renderbuffer(GL_DEPTH_COMPONENT32F, W, H)
        })

        self._fbo_depth = gu.Framebuffer({
            GL_COLOR_ATTACHMENT0:
            gu.Texture(GL_TEXTURE_2D, 1, GL_RGB8, W, H),
            GL_COLOR_ATTACHMENT1:
            gu.Texture(GL_TEXTURE_2D, 1, GL_R32F, W, H),
            GL_DEPTH_ATTACHMENT:
            gu.Renderbuffer(GL_DEPTH_COMPONENT32F, W, H)
        })
        glNamedFramebufferDrawBuffers(
            self._fbo.id, 2,
            np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1),
                     dtype=np.uint32))
        glNamedFramebufferDrawBuffers(
            self._fbo_depth.id, 2,
            np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1),
                     dtype=np.uint32))

        if self._samples > 1:
            self._render_fbo = gu.Framebuffer({
                GL_COLOR_ATTACHMENT0:
                gu.TextureMultisample(self._samples, GL_RGB8, W, H, True),
                GL_COLOR_ATTACHMENT1:
                gu.TextureMultisample(self._samples, GL_R32F, W, H, True),
                GL_DEPTH_STENCIL_ATTACHMENT:
                gu.RenderbufferMultisample(self._samples, GL_DEPTH32F_STENCIL8,
                                           W, H)
            })
            glNamedFramebufferDrawBuffers(
                self._render_fbo.id, 2,
                np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1),
                         dtype=np.uint32))

        self._fbo.bind()

        # VAO
        attributes = gu.geo.load_meshes_sixd(models_cad_files,
                                             vertex_tmp_store_folder,
                                             recalculate_normals=False)

        vertices = []
        indices = []
        for vertex, normal, color, faces in attributes:
            indices.append(faces.flatten())
            vertices.append(
                np.hstack((vertex, normal, color / 255.0)).flatten())

        indices = np.hstack(indices).astype(np.uint32)
        vertices = np.hstack(vertices).astype(np.float32)

        vao = gu.VAO(
            {
                (gu.Vertexbuffer(vertices), 0, 9 * 4):
                [(0, 3, GL_FLOAT, GL_FALSE, 0 * 4),
                 (1, 3, GL_FLOAT, GL_FALSE, 3 * 4),
                 (2, 3, GL_FLOAT, GL_FALSE, 6 * 4)]
            }, gu.EBO(indices))
        vao.bind()

        # IBO
        vertex_count = [np.prod(vert[3].shape) for vert in attributes]
        instance_count = np.ones(len(attributes))
        first_index = [
            sum(vertex_count[:i]) for i in xrange(len(vertex_count))
        ]

        vertex_sizes = [vert[0].shape[0] for vert in attributes]
        base_vertex = [
            sum(vertex_sizes[:i]) for i in xrange(len(vertex_sizes))
        ]
        base_instance = np.zeros(len(attributes))

        ibo = gu.IBO(vertex_count, instance_count, first_index, base_vertex,
                     base_instance)
        ibo.bind()

        gu.Shader.shader_folder = os.path.join(
            os.path.dirname(os.path.abspath(__file__)), 'shader')
        # if clamp:
        #     shader = gu.Shader('depth_shader_phong.vs', 'depth_shader_phong_clamped.frag')
        # else:
        shader = gu.Shader('depth_shader_phong.vs', 'depth_shader_phong.frag')
        shader.compile_and_use()

        self._scene_buffer = gu.ShaderStorage(0, gu.Camera().data, True)
        self._scene_buffer.bind()

        glEnable(GL_DEPTH_TEST)
        glClearColor(0.0, 0.0, 0.0, 1.0)
Пример #5
0
    def render(self,
               obj_id,
               W,
               H,
               K,
               R,
               t,
               near,
               far,
               random_light=False,
               phong={
                   'ambient': 0.4,
                   'diffuse': 0.8,
                   'specular': 0.3
               }):
        assert W <= Renderer.MAX_FBO_WIDTH and H <= Renderer.MAX_FBO_HEIGHT

        if self._samples > 1:
            self._render_fbo.bind()

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
                | GL_STENCIL_BUFFER_BIT)
        glViewport(0, 0, W, H)

        camera = gu.Camera()
        camera.realCamera(W, H, K, R, t, near, far)

        self._scene_buffer.update(camera.data)
        # print phong
        if random_light:
            self.set_light_pose(1000. * np.random.random(3))
            self.set_ambient_light(phong['ambient'])
            self.set_diffuse_light(phong['diffuse'] + 0.1 *
                                   (2 * np.random.rand() - 1))
            self.set_specular_light(phong['specular'] + 0.1 *
                                    (2 * np.random.rand() - 1))
            # self.set_ambient_light(phong['ambient'])
            # self.set_diffuse_light(0.7)
            # self.set_specular_light(0.3)
        else:
            self.set_light_pose(np.array([400., 400., 400]))
            self.set_ambient_light(phong['ambient'])
            self.set_diffuse_light(phong['diffuse'])
            self.set_specular_light(phong['specular'])

        # self.set_ambient_light(0.4)
        # self.set_diffuse_light(0.7)

        # self.set_ambient_light(0.5)
        # self.set_diffuse_light(0.4)
        # self.set_specular_light(0.1)

        glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT,
                               ctypes.c_void_p(obj_id * 4 * 5))

        # if self._samples > 1:
        #     for i in xrange(2):
        #         glNamedFramebufferReadBuffer(self._render_fbo.id, GL_COLOR_ATTACHMENT0 + i)
        #         glNamedFramebufferDrawBuffer(self._fbo.id, GL_COLOR_ATTACHMENT0 + i)
        #         glBlitNamedFramebuffer(self._render_fbo.id, self._fbo.id, 0, 0, W, H, 0, 0, W, H, GL_COLOR_BUFFER_BIT, GL_NEAREST)
        #     self._fbo.bind()

        if self._samples > 1:
            self._fbo.bind()
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glNamedFramebufferDrawBuffer(self._fbo.id, GL_COLOR_ATTACHMENT1)
            glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT,
                                   ctypes.c_void_p(obj_id * 4 * 5))

            glNamedFramebufferReadBuffer(self._render_fbo.id,
                                         GL_COLOR_ATTACHMENT0)
            glNamedFramebufferDrawBuffer(self._fbo.id, GL_COLOR_ATTACHMENT0)
            glBlitNamedFramebuffer(self._render_fbo.id, self._fbo.id, 0, 0, W,
                                   H, 0, 0, W, H, GL_COLOR_BUFFER_BIT,
                                   GL_NEAREST)

            glNamedFramebufferDrawBuffers(
                self._fbo.id, 2,
                np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1),
                         dtype=np.uint32))

        glNamedFramebufferReadBuffer(self._fbo.id, GL_COLOR_ATTACHMENT0)
        bgr_flipped = np.frombuffer(glReadPixels(0, 0, W, H, GL_BGR,
                                                 GL_UNSIGNED_BYTE),
                                    dtype=np.uint8).reshape(H, W, 3)
        bgr = np.flipud(bgr_flipped).copy()

        glNamedFramebufferReadBuffer(self._fbo.id, GL_COLOR_ATTACHMENT1)
        depth_flipped = glReadPixels(0, 0, W, H, GL_RED,
                                     GL_FLOAT).reshape(H, W)
        depth = np.flipud(depth_flipped).copy()

        return bgr, depth
Пример #6
0
)

vao.bind()
ibo.bind(GL_DRAW_INDIRECT_BUFFER)



path = '/home/dimitri/Desktop/kittens-cat-cat-puppy-rush-45170.jpeg'
import glob
paths = glob.glob('/home/dimitri/Pictures/*.png')[:2]

tex = gu.build_textures(paths)
texture_buffer = gu.build_texture_buffer(*tex)


camera = gu.Camera()
camera.lookAt((0,0,0.5),(0,0,-1), (0,1,0))

scene_buffer = gu.Buffer(
    camera.data,
    GL_DYNAMIC_STORAGE_BIT|GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT
)

scene_buffer.bind_range(GL_SHADER_STORAGE_BUFFER, 0)
texture_buffer.bind_range(GL_SHADER_STORAGE_BUFFER, 1)

glClear(GL_COLOR_BUFFER_BIT)


while window.is_open():
    camera.projection(fov=np.pi*0.2, aspect=float(H)/float(W), near=0.1, far=1000)
Пример #7
0
    def __init__(self,
                 models_cad_files,
                 samples,
                 W,
                 H,
                 vertex_tmp_store_folder='.',
                 debug_mode=False):
        self.W, self.H = W, H
        self._context = gu.OffscreenContext()

        self._samples = 1

        self._rgb_tex = gu.Texture(GL_TEXTURE_2D, 1, GL_RGB32F, self.W, self.H)
        self._rgb_tex.setFilter(GL_NEAREST, GL_NEAREST)
        self._rgb_tex.setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE)

        self._edge_tex = gu.Texture(GL_TEXTURE_2D, 1, GL_RGB32F, self.W,
                                    self.H)
        self._edge_tex.setFilter(GL_NEAREST, GL_NEAREST)
        self._edge_tex.setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE)

        # TEXTURE BUFFER
        handles = [self._rgb_tex.makeResident(), self._edge_tex.makeResident()]
        self._material_buffer = gu.ShaderStorage(
            2, np.array(handles, dtype=np.uint64), False)
        self._material_buffer.bind()

        self._fbo = gu.Framebuffer({
            GL_COLOR_ATTACHMENT0:
            self._rgb_tex,
            GL_DEPTH_ATTACHMENT:
            gu.Renderbuffer(GL_DEPTH_COMPONENT24, self.W, self.H)
        })

        # FOR GRADIENTS
        if debug_mode:
            self._gradient_fbo = gu.Framebuffer({
                GL_COLOR_ATTACHMENT0:
                gu.Texture(GL_TEXTURE_2D, 1, GL_R32F, self.W, self.H),
                GL_COLOR_ATTACHMENT1:
                gu.Texture(GL_TEXTURE_2D, 1, GL_RGB32F, self.W, self.H),
                GL_COLOR_ATTACHMENT2:
                gu.Texture(GL_TEXTURE_2D, 1, GL_RGB32F, self.W, self.H)
            })
            glNamedFramebufferDrawBuffers(
                self._gradient_fbo.id, 3,
                np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,
                          GL_COLOR_ATTACHMENT2),
                         dtype=np.uint32))
        else:
            self._gradient_fbo = gu.Framebuffer({
                GL_COLOR_ATTACHMENT0:
                gu.Texture(GL_TEXTURE_2D, 1, GL_RGB32F, self.W, self.H)
            })
        # VAO
        vert_norms = gu.geo.load_meshes(models_cad_files,
                                        vertex_tmp_store_folder,
                                        recalculate_normals=True)

        vertices = np.empty(0, dtype=np.float32)
        self.min_vert = {}
        self.max_vert = {}
        for obj_id, vert_norm in enumerate(vert_norms):
            vertices = np.hstack(
                (vertices, np.hstack(
                    (vert_norm[0], vert_norm[1])).reshape(-1)))
            # if obj==obj_id:
            self.min_vert[obj_id] = np.min(vert_norm[0], axis=0)
            self.max_vert[obj_id] = np.max(vert_norm[0], axis=0)

        print self.min_vert, self.max_vert

        vao = gu.VAO({
            (gu.Vertexbuffer(vertices), 0, 6 * 4):
            [(0, 3, GL_FLOAT, GL_FALSE, 0 * 4),
             (1, 3, GL_FLOAT, GL_FALSE, 3 * 4)]
        })
        vao.bind()

        # IBO
        sizes = [vert[0].shape[0] for vert in vert_norms]
        offsets = [sum(sizes[:i]) for i in xrange(len(sizes))]

        ibo = gu.IBO(sizes, np.ones(len(vert_norms)), offsets,
                     np.zeros(len(vert_norms)))
        ibo.bind()

        gu.Shader.shader_folder = os.path.join(
            os.path.dirname(os.path.abspath(__file__)), 'shader')
        # self.scene_shader = gu.Shader('common_shader.vs', 'common_shader.frag')
        # self.scene_shader.compile()

        # self.edge_shader = gu.Shader('screen.vs', 'edge_shader.frag')
        # self.edge_shader.compile_and_use()
        # glUniform1i(1, 1 if debug_mode else 0)

        # self.outline_shader = gu.Shader('screen.vs', 'edge_shader_lineout.frag')
        # self.outline_shader.compile()

        # self.screen_shader = gu.Shader('screen.vs', 'screen.frag')
        # self.screen_shader.compile()

        self.line_shader = gu.Shader('line.vs', 'line.frag')
        self.line_shader.compile()

        self._scene_buffer = gu.ShaderStorage(0, gu.Camera().data, True)
        self._scene_buffer.bind()

        glClearColor(0.0, 0.0, 0.0, 1.0)
        self.camera = gu.Camera()
        self.debug_mode = debug_mode
        glLineWidth(3)
Пример #8
0
    def __init__(self,
                 models_cad_files,
                 samples=1,
                 vertex_tmp_store_folder='.',
                 vertex_scale=1.):
        self._samples = samples
        self._context = gu.OffscreenContext()

        # FBO
        W, H = Renderer.MAX_FBO_WIDTH, Renderer.MAX_FBO_HEIGHT
        self._fbo = gu.Framebuffer({
            GL_COLOR_ATTACHMENT0:
            gu.Texture(GL_TEXTURE_2D, 1, GL_RGB8, W, H),
            GL_COLOR_ATTACHMENT1:
            gu.Texture(GL_TEXTURE_2D, 1, GL_R32F, W, H),
            GL_DEPTH_ATTACHMENT:
            gu.Renderbuffer(GL_DEPTH_COMPONENT32F, W, H)
        })
        self._fbo_depth = gu.Framebuffer({
            GL_COLOR_ATTACHMENT0:
            gu.Texture(GL_TEXTURE_2D, 1, GL_RGB8, W, H),
            GL_COLOR_ATTACHMENT1:
            gu.Texture(GL_TEXTURE_2D, 1, GL_R32F, W, H),
            GL_DEPTH_ATTACHMENT:
            gu.Renderbuffer(GL_DEPTH_COMPONENT32F, W, H)
        })
        glNamedFramebufferDrawBuffers(
            self._fbo.id, 2,
            np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1),
                     dtype=np.uint32))
        glNamedFramebufferDrawBuffers(
            self._fbo_depth.id, 2,
            np.array((GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1),
                     dtype=np.uint32))

        if self._samples > 1:
            self._render_fbo = gu.Framebuffer({
                GL_COLOR_ATTACHMENT0:
                gu.TextureMultisample(self._samples, GL_RGB8, W, H, True),
                GL_DEPTH_ATTACHMENT:
                gu.RenderbufferMultisample(self._samples,
                                           GL_DEPTH_COMPONENT32F, W, H)
            })

        # VAO
        vert_norms = gu.geo.load_meshes(models_cad_files,
                                        vertex_tmp_store_folder,
                                        recalculate_normals=True)

        vertices = np.empty(0, dtype=np.float32)
        for vert_norm in vert_norms:
            _verts = vert_norm[0] * vertex_scale
            vertices = np.hstack((vertices, np.hstack(
                (_verts, vert_norm[1])).reshape(-1)))

        vao = gu.VAO({
            (gu.Vertexbuffer(vertices), 0, 6 * 4):
            [(0, 3, GL_FLOAT, GL_FALSE, 0 * 4),
             (1, 3, GL_FLOAT, GL_FALSE, 3 * 4)]
        })

        sizes = [vert[0].shape[0] for vert in vert_norms]
        offsets = [sum(sizes[:i]) for i in xrange(len(sizes))]

        ibo = gu.IBO(sizes, np.ones(len(vert_norms)), offsets,
                     np.zeros(len(vert_norms)))

        gu.Shader.shader_folder = os.path.join(
            os.path.dirname(os.path.abspath(__file__)), 'shader')
        shader = gu.Shader('cad_shader.vs', 'cad_shader.frag')
        shader.compile()

        self._scene_buffer = gu.ShaderStorage(0, gu.Camera().data, True)

        self._fbo.bind()
        self._scene_buffer.bind()
        vao.bind()
        ibo.bind()
        shader.use()

        glEnable(GL_DEPTH_TEST)
        glClearColor(0.0, 0.0, 0.0, 1.0)