def __init__(self, pipeline): DebugObject.__init__(self, "GlobalIllumnination") self.pipeline = pipeline # Fetch the scene data self.targetCamera = Globals.base.cam self.targetSpace = Globals.base.render # Store grid size in world space units # This is the half voxel grid size self.voxelGridSizeWS = Vec3(60) # When you change this resolution, you have to change it in Shader/GI/ConvertGrid.fragment aswell self.voxelGridResolution = LVecBase3i(256) self.targetLight = None self.helperLight = None self.ptaGridPos = PTALVecBase3f.emptyArray(1) self.gridPos = Vec3(0) # Create ptas self.ptaLightUVStart = PTALVecBase2f.emptyArray(1) self.ptaLightMVP = PTAMat4.emptyArray(1) self.ptaVoxelGridStart = PTALVecBase3f.emptyArray(1) self.ptaVoxelGridEnd = PTALVecBase3f.emptyArray(1) self.ptaLightDirection = PTALVecBase3f.emptyArray(1) self.targetSpace.setShaderInput("giLightUVStart", self.ptaLightUVStart) self.targetSpace.setShaderInput("giLightMVP", self.ptaLightMVP) self.targetSpace.setShaderInput("giVoxelGridStart", self.ptaVoxelGridStart) self.targetSpace.setShaderInput("giVoxelGridEnd", self.ptaVoxelGridEnd) self.targetSpace.setShaderInput("giLightDirection", self.ptaLightDirection)
def __init__(self, pos=Vec2(0), rightAligned=False, color=Vec3(0, 0, 0), size=0.04, parent=None): if parent is None: parent = Globals.base.aspect2d self.parent = parent self._loadCharset() self._prepareFontTextures() self._makeFontShader() self._makeSquare() self.data = PTAFloat.empty_array(100) self.lastText = "" self.size = 16.0 / base.win.getYSize() * 2.0 self.square.setShaderInput("displData", self.data) self.rightAligned = rightAligned self.pos = pos self.posOffset = Vec2(0) self.color = PTALVecBase3f.emptyArray(1) self.color[0] = color self.posPTA = PTALVecBase2f.emptyArray(1) self.square.setShaderInput("pos", self.posPTA) self._updateInputs()
def __init__(self, pos=Vec2(0), rightAligned=False, color=Vec3(0, 0, 0), size=0.04): self._loadCharset() self._prepareFontTextures() self._makeFontShader() self._makeSquare() self.data = PTAFloat.empty_array(100) self.lastText = "" self.size = size self.square.setShaderInput("displData", self.data) self.rightAligned = rightAligned self.pos = pos self.posOffset = Vec2(0) self.color = color self.posPTA = PTALVecBase2f.emptyArray(1) self.square.setShaderInput("pos", self.posPTA) self._updateInputs()
def __init__(self, num_splits): self._split_count = num_splits self._mvps = PTALMatrix4f.empty_array(num_splits) self._nearfar = PTALVecBase2f.empty_array(num_splits) for i in range(num_splits): self._nearfar[i] = Vec2(20, 1000) mat = Mat4() mat.fill(0) self._mvps[i] = mat self._lens = OrthographicLens() self._lens.set_near_far(20, 1000) self._lens.set_film_size(100, 100) self._camera = Camera("PSSMDummy", self._lens) self._cam_node = NodePath(self._camera) self._parent = None
def __init__(self, num_splits): self._split_count = num_splits self._mvps = PTALMatrix4f.empty_array(num_splits) self._nearfar = PTALVecBase2f.empty_array(num_splits) for i in range(num_splits): self._nearfar[i] = Vec2(20, 1000) mat = Mat4() mat.fill(0) self._mvps[i] = mat self._lens = OrthographicLens() self._lens.set_near_far(20, 1000) self._lens.set_film_size(100, 100) self._camera = Camera("PSSMDummy", self._lens) self._cam_node = NodePath(self._camera) self._parent = None self._resolution = 1024 self._snap_grid = True self._sun_distance = 500.0
def enable(self): if not self.isSupported(): # HDR/auto exposure is implemented using compute # shaders, which are only supported by more modern # graphics cards and requires at least OpenGL 4.3. return self.sceneTex = Texture('hdrSceneTex') self.sceneTex.setup2dTexture(self.Size, self.Size, Texture.TFloat, Texture.FRgba32) self.sceneTex.setWrapU(SamplerState.WMClamp) self.sceneTex.setWrapV(SamplerState.WMClamp) self.sceneTex.clearImage() self.__setupSceneQuad() # Build luminance histogram bucket ranges. self.ptaBucketRange = PTALVecBase2f.emptyArray(self.NumBuckets) for i in xrange(self.NumBuckets): # Use even distribution bmin = float(i) / float(self.NumBuckets) bmax = float(i + 1) / float(self.NumBuckets) # Use a distribution with slightly more bins in the low range. if bmin > 0.0: bmin = math.pow(bmin, 1.5) if bmax > 0.0: bmax = math.pow(bmax, 1.5) self.ptaBucketRange.setElement(i, Vec2(bmin, bmax)) self.histogramTex = Texture('histogram') self.histogramTex.setup1dTexture(self.NumBuckets, Texture.TInt, Texture.FR32i) self.histogramTex.setClearColor(Vec4(0)) self.histogramTex.clearImage() self.histogramCompute = base.computeRoot.attachNewNode(ComputeNode('histogramCompute')) self.histogramCompute.node().addDispatch(self.Size / 8, self.Size / 8, self.Size / 16) self.histogramCompute.setShader(Shader.loadCompute(Shader.SLGLSL, "phase_14/models/shaders/build_histogram.compute.glsl"), 1) self.histogramCompute.setShaderInput("scene_texture", self.sceneTex) self.histogramCompute.setShaderInput("histogram_texture", self.histogramTex) self.histogramCompute.setShaderInput("bucketrange", self.ptaBucketRange) self.histogramCompute.setBin("fixed", 0) self.exposureTex = Texture('exposure') self.exposureTex.setup1dTexture(1, Texture.TFloat, Texture.FR16) self.exposureTex.setClearColor(Vec4(0.0)) self.exposureTex.clearImage() self.exposureCompute = base.computeRoot.attachNewNode(ComputeNode('exposureCompute')) self.exposureCompute.node().addDispatch(1, 1, 1) self.exposureCompute.setShader(Shader.loadCompute(Shader.SLGLSL, "phase_14/models/shaders/calc_luminance.compute.glsl"), 1) self.exposureCompute.setShaderInput("histogram_texture", self.histogramTex) self.exposureCompute.setShaderInput("avg_lum_texture", self.exposureTex) self.exposureCompute.setShaderInput("bucketrange", self.ptaBucketRange) self.exposureCompute.setShaderInput("exposure_minmax", Vec2(1.0, 2.0)) self.exposureCompute.setShaderInput("adaption_rate_brightdark", Vec2(0.6, 0.6)) self.exposureCompute.setShaderInput("exposure_scale", base.config.GetFloat("hdr-tonemapscale", 1.75)) self.exposureCompute.setShaderInput("config_minAvgLum", base.config.GetFloat("hdr-min-avglum", 3.0)) self.exposureCompute.setShaderInput("config_perctBrightPixels", base.config.GetFloat("hdr-percent-bright-pixels", 2.0)) self.exposureCompute.setShaderInput("config_perctTarget", base.config.GetFloat("hdr-percent-target", 60.0)) self.exposureCompute.setBin("fixed", 1) base.filters.setExposure(self.exposureTex) taskMgr.add(self.__update, "hdrUpdate", sort = -10000000) if base.config.GetBool("hdr-debug-histogram", False): self.debugTex = Texture('histogramDebugTex') self.debugTex.setup2dTexture(self.NumBuckets, 1, Texture.TFloat, Texture.FRgba32) self.debugTex.setMagfilter(SamplerState.FTNearest) self.debugTex.setClearColor(Vec4(0.3, 0.3, 0.5, 1.0)) self.debugTex.clearImage() self.debugCompute = base.computeRoot.attachNewNode(ComputeNode('debugHistogramCompute')) self.debugCompute.node().addDispatch(1, 1, 1) self.debugCompute.setShader(Shader.loadCompute(Shader.SLGLSL, "phase_14/models/shaders/debug_histogram.compute.glsl"), 1) self.debugCompute.setShaderInput("histogram_texture", self.histogramTex) self.debugCompute.setShaderInput("debug_texture", self.debugTex) self.debugCompute.setBin("fixed", 2) self.debugImg = OnscreenImage(image = self.debugTex, scale = 0.3, pos = (-0.6, -0.7, -0.7))