class VolumetricLightingPass(RenderPass): """ This pass computes volumetric lighting at half screen resolution """ def __init__(self): RenderPass.__init__(self) def getID(self): return "VolumetricLightingPass" def getRequiredInputs(self): return { # Deferred target "wsPositionTex": "DeferredScenePass.wsPosition", "wsNormalTex": "DeferredScenePass.wsNormal", "depthTex": "DeferredScenePass.depth", # Lighting "lightsPerTileBuffer": "LightCullingPass.lightsPerTile", "lightingTileCount": "Variables.lightingTileCount", "lights": "Variables.allLights", "shadowAtlasPCF": "ShadowScenePass.atlasPCF", "shadowAtlas": "ShadowScenePass.atlas", "shadowSources": "Variables.allShadowSources", "cameraPosition": "Variables.cameraPosition", "mainCam": "Variables.mainCam", "mainRender": "Variables.mainRender" } def create(self): self.target = RenderTarget("Volumetric Lighting") self.target.setHalfResolution() self.target.addColorTexture() self.target.prepareOffscreenBuffer() def setShaders(self): shader = Shader.load(Shader.SLGLSL, "Shader/DefaultPostProcess.vertex", "Shader/VolumetricLighting.fragment") self.target.setShader(shader) return [shader] def setShaderInput(self, name, value, *args): self.target.setShaderInput(name, value, *args) # self.blurTarget.setShaderInput(name, value, *args) def getOutputs(self): return { "VolumetricLightingPass.resultTex": lambda: self.target.getColorTexture(), }
class GlobalIlluminationPass(RenderPass): """ This pass performs voxel cone tracing over the previously generated voxel grid to compute a diffuse, specular and ambient term which can be used later in the lighting pass """ def __init__(self): RenderPass.__init__(self) def getID(self): return "GlobalIlluminationPass" def getRequiredInputs(self): return { "data0": "DeferredScenePass.data0", "data1": "DeferredScenePass.data1", "data2": "DeferredScenePass.data2", "data3": "DeferredScenePass.data3", "giData": "Variables.giVoxelGridData", "cameraPosition": "Variables.cameraPosition", "mainCam": "Variables.mainCam", "mainRender": "Variables.mainRender" } def create(self): self.target = RenderTarget("GlobalIlluminationPass") self.target.setHalfResolution() self.target.addColorTexture() self.target.addAuxTexture() self.target.setColorBits(16) self.target.setAuxBits(16) self.target.prepareOffscreenBuffer() def setShaders(self): shader = Shader.load(Shader.SLGLSL, "Shader/DefaultPostProcess.vertex", "Shader/ComputeGI.fragment") self.target.setShader(shader) return [shader] def getOutputs(self): return { "GlobalIlluminationPass.diffuseResult": lambda: self.target.getColorTexture(), "GlobalIlluminationPass.specularResult": lambda: self.target.getAuxTexture(0) }
class AmbientOcclusionPass(RenderPass): """ This pass computes the screen space ambient occlusion if enabled in the settings. As many samples are required for a good looking result, the pass is done at half resolution and then upscaled by the edge preserving blur pass """ def __init__(self): RenderPass.__init__(self) def getID(self): return "AmbientOcclusionPass" def getRequiredInputs(self): return { "frameIndex": "Variables.frameIndex", "mainRender": "Variables.mainRender", "mainCam": "Variables.mainCam", "noiseTexture": "Variables.noise4x4", "viewSpaceNormals": "ViewSpacePass.normals", "viewSpacePosition": "ViewSpacePass.position" } def create(self): self.target = RenderTarget("AmbientOcclusion") self.target.setHalfResolution() self.target.addColorTexture() self.target.prepareOffscreenBuffer() def setShaders(self): shader = Shader.load(Shader.SLGLSL, "Shader/DefaultPostProcess.vertex", "Shader/ComputeOcclusion.fragment") self.target.setShader(shader) return [shader] def getOutputs(self): return { "AmbientOcclusionPass.computeResult": lambda: self.target.getColorTexture(), }