Example #1
0
    def setupPostFx(self):
        self.filterMan = FilterManager(self.win, self.cam)

        colorTex = Texture()
        finalQuad = self.filterMan.renderSceneInto(colortex=colorTex)
        finalQuad.setShader(loader.loadShader("color.cg"))
        finalQuad.setShaderInput("color", colorTex)
Example #2
0
class Application(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.setupScene()
        self.setupPostFx()

    def setupScene(self):
        self.panda = Actor("panda", {"walk": "panda-walk"})
        self.panda.reparentTo(render)
        self.panda.loop("walk")

        cm = CardMaker("plane")
        cm.setFrame(-10, 10, -10, 10)
        plane = render.attachNewNode(cm.generate())
        plane.setP(270)
        
        self.cam.setPos(0, -40, 6)

        ambLight = AmbientLight("ambient")
        ambLight.setColor(Vec4(0.2, 0.1, 0.1, 1.0))
        ambNode = render.attachNewNode(ambLight)
        render.setLight(ambNode)

        dirLight = DirectionalLight("directional")
        dirLight.setColor(Vec4(0.1, 0.4, 0.1, 1.0))
        dirNode = render.attachNewNode(dirLight)
        dirNode.setHpr(60, 0, 90)
        render.setLight(dirNode)

        pntLight = PointLight("point")
        pntLight.setColor(Vec4(0.8, 0.8, 0.8, 1.0))
        pntNode = render.attachNewNode(pntLight)
        pntNode.setPos(0, 0, 15)
        self.panda.setLight(pntNode)

        sptLight = Spotlight("spot")
        sptLens = PerspectiveLens()
        sptLight.setLens(sptLens)
        sptLight.setColor(Vec4(1.0, 1.0, 1.0, 1.0))
        sptLight.setShadowCaster(True)
        sptNode = render.attachNewNode(sptLight)
        sptNode.setPos(-10, -10, 20)
        sptNode.lookAt(self.panda)
        render.setLight(sptNode)

        render.setShaderAuto()

    def setupPostFx(self):
        self.filterMan = FilterManager(self.win, self.cam)

        colorTex = Texture()
        finalQuad = self.filterMan.renderSceneInto(colortex = colorTex)

        finalTex = Texture()
        interQuad = self.filterMan.renderQuadInto(colortex = finalTex, div = 8)
        interQuad.setShader(loader.loadShader("filter.cg"))
        interQuad.setShaderInput("color", colorTex)

        finalQuad.setShader(loader.loadShader("pass.cg"))
        finalQuad.setShaderInput("color", finalTex)
Example #3
0
    def setupPostFx(self):
        self.filterMan = FilterManager(self.win, self.cam)

        colorTex = Texture()
        blurTex = Texture()
        depthTex = Texture()

        finalQuad = self.filterMan.renderSceneInto(colortex=colorTex,
                                                   depthtex=depthTex)
        blurQuad = self.filterMan.renderQuadInto(colortex=blurTex, div=4)
        blurQuad.setShader(loader.loadShader("blur.cg"))
        blurQuad.setShaderInput("color", colorTex)

        finalQuad.setShader(loader.loadShader("depth.cg"))
        finalQuad.setShaderInput("color", colorTex)
        finalQuad.setShaderInput("blur", blurTex)
        finalQuad.setShaderInput("depth", depthTex)
Example #4
0
    def setupPostFx(self):
        self.gbufMan = FilterManager(self.win, self.cam)
        self.lightMan = FilterManager(self.win, self.lightCam)

        albedo = Texture()
        depth = Texture()
        normal = Texture()
        final = Texture()

        self.gbufMan.renderSceneInto(colortex=albedo,
                                     depthtex=depth,
                                     auxtex=normal,
                                     auxbits=AuxBitplaneAttrib.ABOAuxNormal)

        lightQuad = self.lightMan.renderSceneInto(colortex=final)
        lightQuad.setShader(loader.loadShader("pass.cg"))
        lightQuad.setShaderInput("color", final)

        self.ambient.setShader(loader.loadShader("ambient.cg"))
        self.ambient.setShaderInput("albedo", albedo)

        self.ambient.setAttrib(
            ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne,
                                  ColorBlendAttrib.OOne))
        self.ambient.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))

        self.lights.setShader(loader.loadShader("light.cg"))
        self.lights.setShaderInput("albedo", albedo)
        self.lights.setShaderInput("depth", depth)
        self.lights.setShaderInput("normal", normal)

        self.lights.setAttrib(
            ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne,
                                  ColorBlendAttrib.OOne))
        self.lights.setAttrib(
            CullFaceAttrib.make(CullFaceAttrib.MCullCounterClockwise))
        self.lights.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))
Example #5
0
class Application(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.setupScene()
        self.setupLight()
        self.setupPostFx()

    def setupScene(self):
        self.panda = Actor("panda", {"walk": "panda-walk"})
        self.panda.reparentTo(render)
        self.panda.loop("walk")

        smiley = loader.loadModel("smiley")
        smiley.reparentTo(render)
        smiley.setPos(5, -15, 10)

        smiley = loader.loadModel("smiley")
        smiley.reparentTo(render)
        smiley.setPos(5, 0, 10)

        smiley = loader.loadModel("smiley")
        smiley.reparentTo(render)
        smiley.setPos(5, 20, 10)

        self.world = loader.loadModel("environment")
        self.world.reparentTo(render)
        self.world.setScale(0.5)
        self.world.setPos(-8, 80, 0)

        self.cam.setPos(0, -40, 6)
        self.cam.node().getLens().setNearFar(1.0, 300.0)

    def setupLight(self):
        ambLight = AmbientLight("ambient")
        ambLight.setColor(Vec4(0.2, 0.1, 0.1, 1.0))
        ambNode = render.attachNewNode(ambLight)
        render.setLight(ambNode)

        dirLight = DirectionalLight("directional")
        dirLight.setColor(Vec4(0.1, 0.4, 0.1, 1.0))
        dirNode = render.attachNewNode(dirLight)
        dirNode.setHpr(60, 0, 90)
        render.setLight(dirNode)

        pntLight = PointLight("point")
        pntLight.setColor(Vec4(0.8, 0.8, 0.8, 1.0))
        pntNode = render.attachNewNode(pntLight)
        pntNode.setPos(0, 0, 15)
        self.panda.setLight(pntNode)

        sptLight = Spotlight("spot")
        sptLens = PerspectiveLens()
        sptLight.setLens(sptLens)
        sptLight.setColor(Vec4(1.0, 1.0, 1.0, 1.0))
        sptLight.setShadowCaster(True)
        sptNode = render.attachNewNode(sptLight)
        sptNode.setPos(-10, -10, 50)
        sptNode.lookAt(self.panda)
        render.setLight(sptNode)

        render.setShaderAuto()

    def setupPostFx(self):
        self.filterMan = FilterManager(self.win, self.cam)

        colorTex = Texture()
        blurTex = Texture()
        depthTex = Texture()

        finalQuad = self.filterMan.renderSceneInto(colortex=colorTex,
                                                   depthtex=depthTex)
        blurQuad = self.filterMan.renderQuadInto(colortex=blurTex, div=4)
        blurQuad.setShader(loader.loadShader("blur.cg"))
        blurQuad.setShaderInput("color", colorTex)

        finalQuad.setShader(loader.loadShader("depth.cg"))
        finalQuad.setShaderInput("color", colorTex)
        finalQuad.setShaderInput("blur", blurTex)
        finalQuad.setShaderInput("depth", depthTex)
Example #6
0
 def __init__(self, _base, world, buffer_system):
     
     self.power = Vec3(1,1,0)
     
     self.world = world
     self._base = _base
     
     #self.activate_gui()
     
     self.bias2 = 1
     
     self.blur = 0.5
     self.aperture = 0.1
     self.focus = 0.5
     self.near = 0.1
     self.far = 0.8
     self.focal = 0.5
     self.exposure = 0.5
     self.bloomfactor = 0.1
     
     self.bool_fxaa = 0
     self.last_map = None
     
     self.filterMan = FilterManager(base.win, base.cam)
     self.card = CardMaker('Compositing quad')
     self.card.setFrameFullscreenQuad()
     self.finalQuad = render2d.attachNewNode(self.card.generate())
     
     
     self.resolution_x = 1024
     self.resolution_y = 768
     self.make_initial_pass()
     
     self.original_map = buffer_system.light_map
     self.last_map = self.original_map
     
     # Particles pass
     if(PARTICLES):
         particles_comp_map = Texture()
         quad = self.filterMan.renderQuadInto(colortex = particles_comp_map)
         quad.setShader(loader.loadShader("particles_comp.cg"))
         quad.setShaderInput("color", self.last_map)
         #quad.setShaderInput("camera", self.world.buffer_system.transparency_cam )
         quad.setShaderInput("particles", buffer_system.transparency_map)
         quad.setShaderInput("particles_depth", buffer_system.transparency_depth_map)
         quad.setShaderInput("scene_depth", buffer_system.depth_map)
         self.last_map = particles_comp_map
     
     
         
         
     # Linearize depth pass
     if(DOF or COLOR_CORRECTION):
         self.lineardepth_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = self.lineardepth_map)
         quad.setShader(loader.loadShader("shaders/depth_linear.cg"))
         quad.setShaderInput("depthnonlinear", buffer_system.depth_map)
         quad.setShaderInput("clipplanes", Vec3(NEAR_CLIP,FAR_CLIP,0))
         quad.setShaderInput("camera", buffer_system.light_cam)
         self.lindepthmap = quad
                     
     # Bloom filter
     if(BLOOM):
         # Create emit map
         emit_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = emit_map)
         quad.setShader(loader.loadShader("shaders/create_emit.cg"))
         quad.setShaderInput("emitmap", buffer_system.misc_map)
         quad.setShaderInput("albedomap", buffer_system.albedo_map)
         # Horizontal blur pass
         hblur_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = hblur_map)
         quad.setShader(loader.loadShader("shaders/hblur.cg"))
         quad.setShaderInput("color", emit_map)
         # Vertical blur pass
         vblur_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = vblur_map)
         quad.setShader(loader.loadShader("shaders/vblur.cg"))
         quad.setShaderInput("color", hblur_map)
         # Bloom pass
         hdr_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = hdr_map)
         quad.setShader(loader.loadShader("shaders/hdr.cg"))
         quad.setShaderInput("color", self.last_map)
         quad.setShaderInput("bloom_map", vblur_map)
         quad.setShaderInput("hdr_params", Vec3(0.5,0.5,0))
         self.hdr = quad
         self.last_map = hdr_map
         
     # DOF filter
     if(DOF):
         dof_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = dof_map)
         quad.setShader(loader.loadShader("shaders/dof.cg"))
         quad.setShaderInput("color", self.last_map)
         quad.setShaderInput("depth", buffer_system.depth_map)
         quad.setShaderInput("preblurmap", self.last_map)
         quad.setShaderInput("camera", buffer_system.light_cam)
         quad.setShaderInput("clipplanes", Vec3(50,500,0))
         self.dof = quad
         self.last_map = dof_map
     
     # Color perspective filter # 
     if(COLOR_CORRECTION):
         colpersp_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = colpersp_map)
         quad.setShader(loader.loadShader("shaders/col_persp.cg"))
         quad.setShaderInput("lineardepth", self.lineardepth_map)        
         quad.setShaderInput("originalmap", self.last_map)        
         quad.setShaderInput("fogcolor", FOG_COLOR)        
         quad.setShaderInput("power", FOG_POWER)   
         self.last_map = colpersp_map 
     
     # FXAA filter
     if(FXAA):
         self.fxaa_map = Texture()
         quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = self.fxaa_map)
         quad.setShader(loader.loadShader("shaders/fxaa.cg"))
         quad.setShaderInput("color", self.last_map)
         self.last_map = self.fxaa_map
            
     self.make_final_pass() 
     taskMgr.add(self.update,"update")
Example #7
0
class FilterSystem():

    def __init__(self, _base, world, buffer_system):
        
        self.power = Vec3(1,1,0)
        
        self.world = world
        self._base = _base
        
        #self.activate_gui()
        
        self.bias2 = 1
        
        self.blur = 0.5
        self.aperture = 0.1
        self.focus = 0.5
        self.near = 0.1
        self.far = 0.8
        self.focal = 0.5
        self.exposure = 0.5
        self.bloomfactor = 0.1
        
        self.bool_fxaa = 0
        self.last_map = None
        
        self.filterMan = FilterManager(base.win, base.cam)
        self.card = CardMaker('Compositing quad')
        self.card.setFrameFullscreenQuad()
        self.finalQuad = render2d.attachNewNode(self.card.generate())
        
        
        self.resolution_x = 1024
        self.resolution_y = 768
        self.make_initial_pass()
        
        self.original_map = buffer_system.light_map
        self.last_map = self.original_map
        
        # Particles pass
        if(PARTICLES):
            particles_comp_map = Texture()
            quad = self.filterMan.renderQuadInto(colortex = particles_comp_map)
            quad.setShader(loader.loadShader("particles_comp.cg"))
            quad.setShaderInput("color", self.last_map)
            #quad.setShaderInput("camera", self.world.buffer_system.transparency_cam )
            quad.setShaderInput("particles", buffer_system.transparency_map)
            quad.setShaderInput("particles_depth", buffer_system.transparency_depth_map)
            quad.setShaderInput("scene_depth", buffer_system.depth_map)
            self.last_map = particles_comp_map
        
        
            
            
        # Linearize depth pass
        if(DOF or COLOR_CORRECTION):
            self.lineardepth_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = self.lineardepth_map)
            quad.setShader(loader.loadShader("shaders/depth_linear.cg"))
            quad.setShaderInput("depthnonlinear", buffer_system.depth_map)
            quad.setShaderInput("clipplanes", Vec3(NEAR_CLIP,FAR_CLIP,0))
            quad.setShaderInput("camera", buffer_system.light_cam)
            self.lindepthmap = quad
                        
        # Bloom filter
        if(BLOOM):
            # Create emit map
            emit_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = emit_map)
            quad.setShader(loader.loadShader("shaders/create_emit.cg"))
            quad.setShaderInput("emitmap", buffer_system.misc_map)
            quad.setShaderInput("albedomap", buffer_system.albedo_map)
            # Horizontal blur pass
            hblur_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = hblur_map)
            quad.setShader(loader.loadShader("shaders/hblur.cg"))
            quad.setShaderInput("color", emit_map)
            # Vertical blur pass
            vblur_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = vblur_map)
            quad.setShader(loader.loadShader("shaders/vblur.cg"))
            quad.setShaderInput("color", hblur_map)
            # Bloom pass
            hdr_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = hdr_map)
            quad.setShader(loader.loadShader("shaders/hdr.cg"))
            quad.setShaderInput("color", self.last_map)
            quad.setShaderInput("bloom_map", vblur_map)
            quad.setShaderInput("hdr_params", Vec3(0.5,0.5,0))
            self.hdr = quad
            self.last_map = hdr_map
            
        # DOF filter
        if(DOF):
            dof_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = dof_map)
            quad.setShader(loader.loadShader("shaders/dof.cg"))
            quad.setShaderInput("color", self.last_map)
            quad.setShaderInput("depth", buffer_system.depth_map)
            quad.setShaderInput("preblurmap", self.last_map)
            quad.setShaderInput("camera", buffer_system.light_cam)
            quad.setShaderInput("clipplanes", Vec3(50,500,0))
            self.dof = quad
            self.last_map = dof_map
        
        # Color perspective filter # 
        if(COLOR_CORRECTION):
            colpersp_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = colpersp_map)
            quad.setShader(loader.loadShader("shaders/col_persp.cg"))
            quad.setShaderInput("lineardepth", self.lineardepth_map)        
            quad.setShaderInput("originalmap", self.last_map)        
            quad.setShaderInput("fogcolor", FOG_COLOR)        
            quad.setShaderInput("power", FOG_POWER)   
            self.last_map = colpersp_map 
        
        # FXAA filter
        if(FXAA):
            self.fxaa_map = Texture()
            quad = self.filterMan.renderQuadInto(div=1,mul=1,align=1,colortex = self.fxaa_map)
            quad.setShader(loader.loadShader("shaders/fxaa.cg"))
            quad.setShaderInput("color", self.last_map)
            self.last_map = self.fxaa_map
               
        self.make_final_pass() 
        taskMgr.add(self.update,"update")
        
    def make_initial_pass(self):
        self.map_A = Texture()
        self.map_B = Texture()
                
    def make_final_pass(self):
        self.finalQuad.setShader(loader.loadShader("composite.cg"))
        self.finalQuad.setShaderInput("mapA", self.last_map) 
        self.finalQuad.setShaderInput("mapB", self.last_map) 
        self.finalQuad.setShaderInput("power", self.power)
            
    #def setBias(self): self.bias2 = self.bias_slider['value']
    def setAperture(self): self.aperture = self.aperture_slider['value']
    def setBlur(self): self.blur = self.blur_slider['value']
    def setFocus(self): self.focus = self.focus_slider['value']
    def setExposure(self): self.exposure = self.exposure_slider['value']
    def setBloomfactor(self): self.bloomfactor = self.bloomfactor_slider['value']
    def setBrightmax(self): self.world.brightmax = self.brightmax_slider['value']
    def setNear(self): self.near = self.near_slider['value']
    def setFar(self): self.far = self.far_slider['value']
    def setFocal(self): self.focal = self.focal_slider['value']
    def setFxaa(self,status):
        if status:
            self.bool_fxaa = 1
        else:
            self.bool_fxaa = 0
    def update(self, task):
        RENDER_NODES['LIGHTS'].setShaderInput("dofparams", Vec4(self.near,self.focal,self.far, self.blur))
        #print(self.blur)
        if(DOF):
            self.dof.setShaderInput("params", Vec3(self.exposure,self.aperture,self.focus))
            self.dof.setShaderInput("resolution", Vec3(1024, 768,0))
        if(DOF or COLOR_CORRECTION):
            self.lindepthmap.setShaderInput("dofparams", Vec4(self.near,self.focal,self.far, self.blur))
        if(BLOOM):
            self.hdr.setShaderInput("hdr_params", Vec3(0.5,0.5,0))
        return task.cont
    
    ### GUI tout pourri ###
    def activate_gui(self):
        self.near_slider = DirectSlider(range = (0,1), value = 0.1, pageSize=0.1, text = "shadows", text_scale = 0.1,command = self.setNear)
        self.near_slider.setPos(0.7,0,0.9)
        self.near_slider.setScale(0.5)
        self.focal_slider = DirectSlider(range = (0,10), value = 0.5, pageSize=0.1, text = "ambiant", text_scale = 0.1,command = self.setFocal)
        self.focal_slider.setPos(0.7,0,0.7)
        self.focal_slider.setScale(0.5)
        self.far_slider = DirectSlider(range = (0,1), value = 0.8, pageSize=0.1, text = "ward", text_scale = 0.1,command = self.setFar)
        self.far_slider.setPos(0.7,0,0.5)
        self.far_slider.setScale(0.5)
        
        self.blur_slider = DirectSlider(range = (0,1), value = 0.1, pageSize=0.1, text = "reflection", text_scale = 0.1,command = self.setBlur)
        self.blur_slider.setPos(-0.7,0,0.9)
        self.blur_slider.setScale(0.5)
        
        self.aperture_slider = DirectSlider(range = (0,1), value = 0.2, pageSize=0.1, text = "aperture", text_scale = 0.1,command = self.setAperture)
        self.aperture_slider.setPos(-0.7,0,0.8)
        self.aperture_slider.setScale(0.5)

        self.focus_slider = DirectSlider(range = (0,1), value = 0, pageSize=0.1, text = "focus", text_scale = 0.1,command = self.setFocus)
        self.focus_slider.setPos(-0.7,0,0.6)
        self.focus_slider.setScale(0.5)

        self.exposure_slider = DirectSlider(range = (0.0,0.5), value = 0.8, pageSize=0.1, text = "blur", text_scale = 0.1,command = self.setExposure)
        self.exposure_slider.setPos(-0.7,0,0.4)
        self.exposure_slider.setScale(0.5)

        self.bloomfactor_slider = DirectSlider(range = (0.0,5), value = 0.1, pageSize=0.1, text = "bloomfactor", text_scale = 0.1,command = self.setBloomfactor)
        self.bloomfactor_slider.setPos(-0.7,0,0.2)
        self.bloomfactor_slider.setScale(0.5)

        self.brightmax_slider = DirectSlider(range = (0.000002,1), value = 0, pageSize=0.1, text = "bias", text_scale = 0.1,command = self.setBrightmax)
        self.brightmax_slider.setPos(-0.7,0,0.0)
        self.brightmax_slider.setScale(0.5)
        
        b = DirectCheckButton(text = "Fxaa" ,scale=.05,command=self.setFxaa)
        b.setPos(-1.0,-1.0,-0.6)
        
        self.a = self.aperture_slider
        self.b = self.focus_slider
        self.c = self.exposure_slider
        self.d = self.bloomfactor_slider
        self.e = self.brightmax_slider
        self.i = self.blur_slider
        self.j = b
        
        #self.k = self.bias_slider
        self.sliders_list = [self.near_slider, self.focal_slider, self.far_slider, self.blur_slider, self.aperture_slider, self.focus_slider, self.exposure_slider, self.bloomfactor_slider, self.brightmax_slider, b]
Example #8
0
class Application(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.setupScene()
        self.setupLight()
        self.setupCams()
        self.setupPostFx()

    def setupScene(self):
        self.scene = render.attachNewNode("scene")
        self.panda = Actor("panda", {"walk": "panda-walk"})
        self.panda.reparentTo(self.scene)
        self.panda.loop("walk")

        self.world = loader.loadModel("environment")
        self.world.reparentTo(self.scene)
        self.world.setScale(0.5)
        self.world.setPos(-8, 80, 0)

        self.scene.setShaderAuto()

    def setupCams(self):
        self.lightCam = self.makeCamera(self.win)
        self.lightCam.reparentTo(self.cam)

        sceneMask = BitMask32(1)
        lightMask = BitMask32(2)
        self.cam.node().setCameraMask(sceneMask)
        self.lightCam.node().setCameraMask(lightMask)
        self.lights.hide(sceneMask)
        self.ambient.hide(sceneMask)
        self.scene.hide(lightMask)

        self.cam.node().getDisplayRegion(0).setSort(1)
        self.lightCam.node().getDisplayRegion(0).setSort(2)
        self.win.setSort(3)

        self.lightCam.node().getDisplayRegion(0).setClearColor(Vec4(
            0, 0, 0, 1))
        self.lightCam.node().getDisplayRegion(0).setClearColorActive(1)

        self.cam.setPos(0, -40, 6)

    def setupLight(self):
        self.lights = render.attachNewNode("lights")
        self.sphere = loader.loadModel("misc/sphere")

        for i in range(400):
            light = self.lights.attachNewNode("light")
            light.setPos(random.uniform(-15, 15), random.uniform(-5, 50),
                         random.uniform(0, 15))
            light.setColor(random.random(), random.random(), random.random())
            light.setScale(5)
            self.sphere.instanceTo(light)

            vlight = self.scene.attachNewNode("vlight")
            vlight.setPos(light.getPos())
            vlight.setColor(light.getColor())
            vlight.setScale(0.1)
            self.sphere.instanceTo(vlight)

        cm = CardMaker("ambient")
        cm.setFrame(-100, 100, -100, 100)
        self.ambient = render.attachNewNode("ambient")
        self.ambient.attachNewNode(cm.generate())
        self.ambient.setColor(0.1, 0.1, 0.1, 1)
        self.ambient.reparentTo(self.cam)
        self.ambient.setPos(0, 5, 0)

    def setupPostFx(self):
        self.gbufMan = FilterManager(self.win, self.cam)
        self.lightMan = FilterManager(self.win, self.lightCam)

        albedo = Texture()
        depth = Texture()
        normal = Texture()
        final = Texture()

        self.gbufMan.renderSceneInto(colortex=albedo,
                                     depthtex=depth,
                                     auxtex=normal,
                                     auxbits=AuxBitplaneAttrib.ABOAuxNormal)

        lightQuad = self.lightMan.renderSceneInto(colortex=final)
        lightQuad.setShader(loader.loadShader("pass.cg"))
        lightQuad.setShaderInput("color", final)

        self.ambient.setShader(loader.loadShader("ambient.cg"))
        self.ambient.setShaderInput("albedo", albedo)

        self.ambient.setAttrib(
            ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne,
                                  ColorBlendAttrib.OOne))
        self.ambient.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))

        self.lights.setShader(loader.loadShader("light.cg"))
        self.lights.setShaderInput("albedo", albedo)
        self.lights.setShaderInput("depth", depth)
        self.lights.setShaderInput("normal", normal)

        self.lights.setAttrib(
            ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne,
                                  ColorBlendAttrib.OOne))
        self.lights.setAttrib(
            CullFaceAttrib.make(CullFaceAttrib.MCullCounterClockwise))
        self.lights.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))