# generate sample kernel # ---------------------- ssaoKernel = [] for i in range(64): sample = glm.vec3(np.random.uniform((-1, -1, 0), (1, 1, 1), (3, ))) sample = glm.normalize(sample) sample *= np.random.uniform(0, 1) scale = i / 64 # scale samples s.t. they are more aligned to center of kernel scale = glm.mix(0.1, 1.0, scale * scale) sample *= scale ssaoKernel.append(sample) with program.use(ssao_program): for i, sample in enumerate(ssaoKernel): name = "samples[{}]".format(i) location = glGetUniformLocation(ssao_program, name) program.set_uniform(ssao_program, name, sample) noise_data = np.random.uniform((-1, -1, 0), (1, 1, 0), (4, 4, 3)) noise_texture = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, noise_texture) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 4, 4, 0, GL_RGB, GL_FLOAT, noise_data) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) glBindTexture(GL_TEXTURE_2D, 0)
def render(self): # Animate # ------- import math, time spotlight.position = glm.vec3(math.cos(time.time() * 3) * 4, 0.3, -4) spotlight.direction = -spotlight.position pointlight.position = glm.vec3( math.cos(time.time()) * 4, 4, math.sin(time.time()) * 4) self.camera.transform = glm.inverse(self.window.view_matrix) # Render passes # ------------- ## Geometry self.geometry_pass.camera = self.camera # window.projection_matrix, window.view_matrix self.geometry_pass.render() ## Shadowmaps dirlight.shadowpass.camera = dirlight.camera dirlight.shadowpass.render() spotlight.shadowpass.camera = spotlight.camera spotlight.shadowpass.render() pointlight.shadowpass.position = pointlight.position pointlight.shadowpass.render() ## Lighting self.lighting_pass.cameraPos = self.camera.position self.lighting_pass.gPosition = self.geometry_pass.gPosition self.lighting_pass.gNormal = self.geometry_pass.gNormal self.lighting_pass.gAlbedoSpecular = self.geometry_pass.gAlbedoSpecular self.lighting_pass.gRoughness = self.geometry_pass.gRoughness self.lighting_pass.gMetallic = self.geometry_pass.gMetallic self.lighting_pass.gEmissive = self.geometry_pass.gEmissive self.lighting_pass.render() ## Forward rendering # - Copy depth from geometry pass glBindFramebuffer(GL_READ_FRAMEBUFFER, self.geometry_pass.gBuffer) glBindFramebuffer(GL_DRAW_FRAMEBUFFER, self.forward_fbo) # write to default framebuffer glBlitFramebuffer(0, 0, self.width, self.height, 0, 0, self.width, self.height, GL_DEPTH_BUFFER_BIT, GL_NEAREST) glBindFramebuffer(GL_READ_FRAMEBUFFER, self.lighting_pass.fbo) glBlitFramebuffer(0, 0, self.width, self.height, 0, 0, self.width, self.height, GL_COLOR_BUFFER_BIT, GL_NEAREST) glBindFramebuffer(GL_FRAMEBUFFER, 0) glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LEQUAL) glDepthMask(GL_FALSE) with fbo.bind(self.forward_fbo): # draw skybox glViewport(0, 0, self.width, self.height) with program.use(self.skybox_program) as prog: program.set_uniform(prog, 'projection', self.camera.projection) sky_view = glm.mat4(glm.mat3(self.camera.view)) program.set_uniform(prog, 'view', sky_view) program.set_uniform(prog, 'cameraPos', self.camera.position) program.set_uniform(prog, 'skybox', 0) program.set_uniform(prog, 'groundProjection', True) glActiveTexture(GL_TEXTURE0 + 0) glBindTexture(GL_TEXTURE_CUBE_MAP, self.environment_pass.cubemap) imdraw.cube(prog, flip=True) glBindTexture(GL_TEXTURE_CUBE_MAP, 0) glDepthMask(GL_TRUE) ## Tonemapping self.tonemapping_pass.hdrimage = self.lighting_pass.beauty self.tonemapping_pass.exposure = 0.0 self.tonemapping_pass.gamma = 2.2 self.tonemapping_pass.render() # Render to screen # ---------------- glViewport(0, 0, self.width, self.height) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glDisable(GL_DEPTH_TEST) # draw to screen imdraw.texture(self.tonemapping_pass.ldrimage, (0, 0, self.width, self.height)) # debug imdraw.texture(self.geometry_pass.gPosition, (0, 0, 90, 90)) imdraw.texture(self.geometry_pass.gNormal, (100, 0, 90, 90)) imdraw.texture(self.geometry_pass.gAlbedoSpecular, (200, 0, 90, 90), shuffle=(0, 1, 2, -1)) imdraw.texture(self.geometry_pass.gAlbedoSpecular, (300, 0, 90, 90), shuffle=(3, 3, 3, -1)) imdraw.texture(self.geometry_pass.gRoughness, (400, 0, 90, 90), shuffle=(0, 0, 0, -1)) imdraw.texture(self.geometry_pass.gMetallic, (500, 0, 90, 90), shuffle=(0, 0, 0, -1)) imdraw.texture(dirlight.shadowpass.texture, (0, 100, 90, 90), shuffle=(0, 0, 0, -1)) imdraw.texture(spotlight.shadowpass.texture, (100, 100, 90, 90), shuffle=(0, 0, 0, -1)) imdraw.cubemap(pointlight.shadowpass.cubemap, (200, 100, 90, 90), self.window.projection_matrix, self.window.view_matrix) imdraw.texture(self.environment_tex, (0, 200, 90, 90)) imdraw.cubemap(self.environment_pass.cubemap, (100, 200, 90, 90), self.window.projection_matrix, self.window.view_matrix) imdraw.cubemap(self.irradiance_pass.irradiance, (200, 200, 90, 90), self.window.projection_matrix, self.window.view_matrix) imdraw.cubemap(self.prefilter_pass.prefilter, (300, 200, 90, 90), self.window.projection_matrix, self.window.view_matrix) imdraw.texture(self.brdf_pass.brdflut, (400, 200, 90, 90)) imdraw.texture(self.lighting_pass.beauty, (0, 300, 90, 90)) # swap buffers # ------------ self.window.swap_buffers() GLFWViewer.poll_events()
# create rbo capture_rbo = glGenRenderbuffers(1) glBindRenderbuffer(GL_RENDERBUFFER, capture_rbo) glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, env_width, env_height) glBindRenderbuffer(GL_RENDERBUFFER, 0) # create fbo capture_fbo = glGenFramebuffers(1) # draw environment map to skybox glViewport(0, 0, env_width, env_height) glActiveTexture(GL_TEXTURE0) glBindTexture(GL_TEXTURE_2D, environment_tex) with program.use(equirectangular_to_cubemap_program): program.set_uniform(equirectangular_to_cubemap_program, "equirectangularMap", 0) program.set_uniform(equirectangular_to_cubemap_program, "projectionMatrix", capture_projection) with fbo.bind(capture_fbo): for i in range(6): glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, env_cubemap, 0) program.set_uniform(equirectangular_to_cubemap_program, "viewMatrix", capture_views[i]) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) imdraw.cube(equirectangular_to_cubemap_program, flip=True)
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, env_width, env_height) glBindRenderbuffer(GL_RENDERBUFFER, 0) # create cubemap fbo capture_fbo = glGenFramebuffers(1) # attach depth buffer with fbo.bind(capture_fbo): glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, capture_rbo) # draw environment map to each cubemap side glViewport(0, 0, env_width, env_height) glActiveTexture(GL_TEXTURE0) glBindTexture(GL_TEXTURE_2D, environment_tex) with program.use(equirectangular_to_cubemap_program): program.set_uniform(equirectangular_to_cubemap_program, "equirectangularMap", 0) program.set_uniform(equirectangular_to_cubemap_program, "projectionMatrix", capture_projection) with fbo.bind(capture_fbo): for i in range(6): glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, env_cubemap, 0) program.set_uniform(equirectangular_to_cubemap_program, "viewMatrix", capture_views[i]) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) imdraw.cube(equirectangular_to_cubemap_program, flip=True)
#version 330 core uniform mat4 projection; uniform mat4 view; uniform mat4 model; layout (location = 0) in vec3 position; void main(){ gl_Position = projection * view * model * vec4(position, 1.0); } """, """ #version 330 core out vec4 FragColor; void main(){ FragColor = vec4(1,1,1,1); } """) while not window.should_close(): glViewport(0, 0, window.width, window.height) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) with program.use(prog): program.set_uniform(prog, 'projection', window.projection_matrix) program.set_uniform(prog, 'view', window.view_matrix) program.set_uniform(prog, 'model', np.eye(4)) imdraw.cube(prog) # draw grid window.swap_buffers() GLFWViewer.poll_events()
shadowTransforms.append( shadowProj * glm.lookAt(lightPos, lightPos + glm.vec3(0.0, -1.0, 0.0), glm.vec3(0.0, 0.0, -1.0))) shadowTransforms.append( shadowProj * glm.lookAt(lightPos, lightPos + glm.vec3(0.0, 0.0, 1.0), glm.vec3(0.0, -1.0, 0.0))) shadowTransforms.append( shadowProj * glm.lookAt(lightPos, lightPos + glm.vec3(0.0, 0.0, -1.0), glm.vec3(0.0, -1.0, 0.0))) shadowTransforms = np.array([np.array(m) for m in shadowTransforms]) glViewport(0, 0, shadow_width, shadow_height) with fbo.bind(shadow_depth_fbo), program.use( point_shadow_program) as prog: glClear(GL_DEPTH_BUFFER_BIT) for i in range(6): program.set_uniform(prog, "shadowMatrices[{}]".format(i), shadowTransforms[i]) program.set_uniform(prog, 'farPlane', far_plane) program.set_uniform(prog, 'lightPos', lightPos) # draw scene program.set_uniform(prog, 'model', glm.translate(glm.mat4(1), (-1, 0.5, -1))) imdraw.cube(prog) program.set_uniform(prog, 'model', glm.translate(glm.mat4(1), (1, 0.5, -1))) imdraw.cube(prog) program.set_uniform(prog, 'model',