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 range(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
    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
    def __init__(self,
                 models_cad_files,
                 samples=1,
                 vertex_tmp_store_folder='.',
                 clamp=False,
                 vertex_scale=1.0):
        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 * vertex_scale, 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 range(len(vertex_count))]

        vertex_sizes = [vert[0].shape[0] for vert in attributes]
        base_vertex = [sum(vertex_sizes[:i]) for i in range(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)
Esempio n. 4
0
    def __init__(self,
                 models_cad_files,
                 samples=1,
                 vertex_tmp_store_folder='.',
                 vertex_scale=1.):
        #import ipdb; ipdb.set_trace()
        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 range(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)