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)
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
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()
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)
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
) 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)
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)
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)