Пример #1
0
    def render(self, objects: [Mesh], camera: (PerspectiveCamera, OrthographicCamera)):
        super().render()

        with puregl.fbo.bind(self.fbo), puregl.program.use(self.program):
            glViewport(0,0, self.width, self.height)
            glClearColor(0,0,0,0)
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            
            # set camera
            puregl.program.set_uniform(self.program, "projection", camera.projection)
            puregl.program.set_uniform(self.program, "view", camera.view)

            # draw scene
            for mesh in objects:
                # transform
                puregl.program.set_uniform(self.program, "model", mesh.transform)

                # material
                puregl.program.set_uniform(self.program, "albedo", to_linear(glm.vec3(*mesh.material.albedo)))
                puregl.program.set_uniform(self.program, "emission", to_linear(glm.vec3(*mesh.material.emission)))
                puregl.program.set_uniform(self.program, "roughness", mesh.material.roughness)
                puregl.program.set_uniform(self.program, "metallic", mesh.material.metallic)

                # geometry
                mesh.geometry._draw(self.program)

        return self.gPosition, self.gNormal, self.gAlbedo, self.gEmission, self.gRoughness, self.gMetallic
Пример #2
0
    def __init__(self, width, height):
        super().__init__(width, height)

        self.environment_image = assets.imread(
            'hdri/Tropical_Beach_3k.hdr').astype(np.float32)
        self.environment_image = assets.to_linear(self.environment_image)

        # init passes
        self.geometry_pass = GeometryPass(self.width, self.height)
        self.environment_pass = EnvironmentPass(512, 512)
        self.irradiance_pass = IrradiancePass(32, 32)
        self.prefilter_pass = PrefilterPass(128, 128)
        self.brdf_pass = BRDFPass(512, 512)
        self.lighting_pass = PBRLightingPass(self.width, self.height)
        self.tonemapping_pass = TonemappingPass(self.width, self.height)
        self.clamp_pass = ClampPass(self.width, self.height)
        self.gaussianblur_pass = GaussianblurPass(self.width, self.height)
        self.add_pass = AddPass(self.width, self.height)

        self.skybox_pass = SkyboxPass(self.width, self.height)

        self.environment_texture = None
        self.environment_cubemap = None
        self.irradiance_cubemap = None
        self.prefilter_cubemap = None
        self.brdf_texture = None
Пример #3
0
    def __init__(self, scene):
        # window
        self.width = 1024
        self.height = 768
        self.window = GLFWViewer(self.width, self.height, (0.2, 0.2, 0.2, 1.0))
        self.camera = PerspectiveCamera(glm.inverse(self.window.view_matrix),
                                        glm.radians(60),
                                        self.width / self.height, 1, 30)
        self.scene = scene

        # assets
        self.environment_image = assets.imread('hdri/Tropical_Beach_3k.hdr')
        self.environment_image = assets.to_linear(self.environment_image)

        # render passes
        self.environment_pass = EnvironmentPass(512, 512)
        self.irradiance_pass = IrradiancePass(32, 32)
        self.prefilter_pass = PrefilterPass()
        self.brdf_pass = BRDFPass(512, 512)
        self.tonemapping_pass = TonemappingPass(self.width, self.height)

        self.geometry_pass = GeometryPass(self.width, self.height,
                                          self.draw_scene_for_geometry)
        dirlight.shadowpass = DepthPass(1024, 1024, GL_FRONT,
                                        self.draw_scene_for_shadows)
        spotlight.shadowpass = DepthPass(1024, 1024, GL_FRONT,
                                         self.draw_scene_for_shadows)
        pointlight.shadowpass = CubeDepthPass(
            512,
            512,
            GL_FRONT,
            near=1,
            far=15,
            draw_scene=self.draw_scene_for_shadows)

        self.lighting_pass = LightingPass(
            self.width, self.height, lights=[dirlight, spotlight, pointlight])
Пример #4
0
                          direction=glm.vec3(1, -0.5, 3),
                          color=glm.vec3(0.04, 0.6, 1.0),
                          intensity=150.0,
                          fov=60,
                          near=1,
                          far=15)
    scene.add_child(spotlight)

    pointlight = PointLight(position=glm.vec3(2.5, 1.3, 2.5),
                            color=glm.vec3(1, 0.7, 0.1),
                            intensity=50.0,
                            near=0.1,
                            far=10)
    scene.add_child(pointlight)

    environment_image = assets.to_linear(
        assets.imread("hdri/Tropical_Beach_3k.hdr"))

    # Create Viewer
    viewer = Viewer(title="Simple PBR with Shadows Example")

    # Create render pipeline
    geometry_pass = GeometryPass(viewer.width, viewer.height)
    environment_pass = EnvironmentPass(512, 512)
    irradiance_pass = IrradiancePass(32, 32)
    prefilter_pass = PrefilterPass(128, 128)
    brdf_pass = BRDFPass(512, 512)
    lighting_pass = PBRLightingPass(viewer.width, viewer.height)
    skybox_pass = SkyboxPass(viewer.width, viewer.height)
    tonemapping_pass = TonemappingPass(viewer.width, viewer.height)
    clamp_pass = ClampPass(viewer.width, viewer.height)
    gaussianblur_pass = GaussianblurPass(viewer.width, viewer.height)
Пример #5
0
    def render(self, cameraPos, lights, gBuffer, irradiance, prefilter, brdf):
        super().render()
        gPosition, gNormal, gAlbedo, gEmissive, gRoughness, gMetallic = gBuffer
        with puregl.fbo.bind(self.fbo), puregl.program.use(self.program):
            # clear fbo
            glViewport(0, 0, self.width, self.height)
            glClearColor(0.3, 0.3, 0.3, 1.0)
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

            # configure shader
            puregl.program.set_uniform(self.program, "numLights", len(lights))
            puregl.program.set_uniform(self.program, "cameraPos", cameraPos)

            glActiveTexture(GL_TEXTURE0 + 0)
            glBindTexture(GL_TEXTURE_2D, gPosition)
            puregl.program.set_uniform(self.program, "gPosition", 0)

            glActiveTexture(GL_TEXTURE0 + 1)
            glBindTexture(GL_TEXTURE_2D, gNormal)
            puregl.program.set_uniform(self.program, "gNormal", 1)

            glActiveTexture(GL_TEXTURE0 + 2)
            glBindTexture(GL_TEXTURE_2D, gAlbedo)
            puregl.program.set_uniform(self.program, "gAlbedoSpecular", 2)

            glActiveTexture(GL_TEXTURE0 + 3)
            glBindTexture(GL_TEXTURE_2D, gRoughness)
            puregl.program.set_uniform(self.program, "gRoughness", 3)

            glActiveTexture(GL_TEXTURE0 + 4)
            glBindTexture(GL_TEXTURE_2D, gMetallic)
            puregl.program.set_uniform(self.program, "gMetallic", 4)

            glActiveTexture(GL_TEXTURE0 + 5)
            glBindTexture(GL_TEXTURE_2D, gEmissive)
            puregl.program.set_uniform(self.program, "gEmissive", 5)

            glActiveTexture(GL_TEXTURE0 + 6)
            glBindTexture(GL_TEXTURE_CUBE_MAP, irradiance)
            puregl.program.set_uniform(self.program, "irradianceMap", 6)

            glActiveTexture(GL_TEXTURE0 + 7)
            glBindTexture(GL_TEXTURE_CUBE_MAP, prefilter)
            puregl.program.set_uniform(self.program, "prefilterMap", 7)

            glActiveTexture(GL_TEXTURE0 + 8)
            glBindTexture(GL_TEXTURE_2D, brdf)
            puregl.program.set_uniform(self.program, "brdfLUT", 8)

            shadowMapIdx, shadowCubeIdx = 0, 0
            for i, light in enumerate(lights):
                slot = 9 + i
                if isinstance(light, DirectionalLight):
                    puregl.program.set_uniform(self.program,
                                               "lights[{}].type".format(i), 0)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].color".format(i),
                        to_linear(light.color) * light.intensity)

                    puregl.program.set_uniform(
                        self.program, "lights[{}].direction".format(i),
                        light.direction)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].shadowIdx".format(i),
                        shadowMapIdx)

                    glActiveTexture(GL_TEXTURE0 + slot)
                    glBindTexture(GL_TEXTURE_2D, light.shadowmap.texture)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].matrix".format(i),
                        light.camera.projection * light.camera.view)
                    puregl.program.set_uniform(
                        self.program, "shadowMaps[{}]".format(shadowMapIdx),
                        slot)
                    shadowMapIdx += 1

                elif isinstance(light, SpotLight):
                    puregl.program.set_uniform(self.program,
                                               "lights[{}].type".format(i), 1)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].color".format(i),
                        to_linear(light.color) * light.intensity)

                    puregl.program.set_uniform(self.program,
                                               "lights[{}].position".format(i),
                                               light.position)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].direction".format(i),
                        light.direction)
                    puregl.program.set_uniform(self.program,
                                               "lights[{}].cutOff".format(i),
                                               light.cut_off)

                    glActiveTexture(GL_TEXTURE0 + slot)
                    glBindTexture(GL_TEXTURE_2D, light.shadowmap.texture)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].matrix".format(i),
                        light.camera.projection * light.camera.view)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].shadowIdx".format(i),
                        shadowMapIdx)
                    puregl.program.set_uniform(
                        self.program, "shadowMaps[{}]".format(shadowMapIdx),
                        slot)
                    shadowMapIdx += 1

                elif isinstance(light, PointLight):
                    puregl.program.set_uniform(self.program,
                                               "lights[{}].type".format(i), 2)
                    puregl.program.set_uniform(
                        self.program, "lights[{}].color".format(i),
                        to_linear(light.color) * light.intensity)
                    puregl.program.set_uniform(self.program,
                                               "lights[{}].position".format(i),
                                               light.position)

                    glActiveTexture(GL_TEXTURE0 + slot)
                    glBindTexture(GL_TEXTURE_CUBE_MAP, light.shadowmap.texture)
                    puregl.program.set_uniform(self.program,
                                               "lights[{}].farPlane".format(i),
                                               float(light.far))
                    puregl.program.set_uniform(
                        self.program, "lights[{}].shadowIdx".format(i),
                        shadowCubeIdx)
                    puregl.program.set_uniform(
                        self.program, "shadowCubes[{}]".format(shadowCubeIdx),
                        slot)
                    shadowCubeIdx += 1

            # draw
            imdraw.quad(self.program)
        return self.texture
Пример #6
0
    with fbo.bind(pointlight_shadowfbo):
        glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                             pointlight_shadowcube, 0)
        glDrawBuffer(GL_NONE)
        glReadBuffer(GL_NONE)
        assert glCheckFramebufferStatus(
            GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE

    # create shader
    point_shadow_program = program.create(*glsl.read("point_shadow"))

    # Environment pass
    # ----------------
    ## Create environment texture
    environment_data = assets.imread('hdri/Tropical_Beach_3k.hdr')
    environment_data = assets.to_linear(environment_data)

    env_height, env_width, env_channels = environment_data.shape
    environment_tex = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, environment_tex)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, env_width, env_height, 0, GL_RGB,
                 GL_FLOAT, environment_data)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

    ## Capture environment map to cubemap
    # create cubemap texture
    env_cubemap = glGenTextures(1)
    equirectangular_to_cubemap_program = program.create(