Browse Source

Rendering indirect in full resolution

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
1235f75c06

+ 0 - 1
include/anki/renderer/Common.h

@@ -25,7 +25,6 @@ class Pps;
 class Dbg;
 class Dbg;
 class Tiler;
 class Tiler;
 class Ir;
 class Ir;
-class Refl;
 class Upsample;
 class Upsample;
 
 
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal

+ 6 - 0
include/anki/renderer/Fs.h

@@ -27,8 +27,14 @@ anki_internal:
 	ANKI_USE_RESULT Error init(const ConfigSet& initializer);
 	ANKI_USE_RESULT Error init(const ConfigSet& initializer);
 	ANKI_USE_RESULT Error run(CommandBufferPtr& cmdb);
 	ANKI_USE_RESULT Error run(CommandBufferPtr& cmdb);
 
 
+	TexturePtr getRt() const
+	{
+		return m_rt;
+	}
+
 private:
 private:
 	FramebufferPtr m_fb;
 	FramebufferPtr m_fb;
+	TexturePtr m_rt;
 
 
 	ResourceGroupPtr m_globalResources;
 	ResourceGroupPtr m_globalResources;
 };
 };

+ 0 - 6
include/anki/renderer/Ir.h

@@ -56,11 +56,6 @@ anki_internal:
 		return m_cubemapArrMipCount;
 		return m_cubemapArrMipCount;
 	}
 	}
 
 
-	const Clusterer& getClusterer() const
-	{
-		return m_clusterer;
-	}
-
 	ResourceGroupPtr getResourceGroup() const
 	ResourceGroupPtr getResourceGroup() const
 	{
 	{
 		return m_rcGroup;
 		return m_rcGroup;
@@ -83,7 +78,6 @@ private:
 	U16 m_fbSize = 0;
 	U16 m_fbSize = 0;
 	DArray<CacheEntry> m_cacheEntries;
 	DArray<CacheEntry> m_cacheEntries;
 	Barrier m_barrier;
 	Barrier m_barrier;
-	Clusterer m_clusterer;
 
 
 	// Irradiance
 	// Irradiance
 	TexturePtr m_irradianceCubemapArr;
 	TexturePtr m_irradianceCubemapArr;

+ 0 - 55
include/anki/renderer/Refl.h

@@ -1,55 +0,0 @@
-// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma once
-
-#include <anki/renderer/RenderingPass.h>
-
-namespace anki
-{
-
-// Forward
-class Ir;
-
-/// @addtogroup renderer
-/// @{
-
-/// Reflections.
-class Refl : public RenderingPass
-{
-anki_internal:
-	Refl(Renderer* r);
-
-	~Refl();
-
-	ANKI_USE_RESULT Error init(const ConfigSet& config);
-
-	/// Run after IS.
-	void run(CommandBufferPtr cmdb);
-
-	TexturePtr getRt() const
-	{
-		return m_rt;
-	}
-
-private:
-	U32 m_width = 0;
-	U32 m_height = 0;
-
-	Bool8 m_sslrEnabled = false;
-
-	// 1st pass: Do the indirect lighting computation
-	ShaderResourcePtr m_frag;
-	ShaderResourcePtr m_vert;
-	PipelinePtr m_ppline;
-	TexturePtr m_rt;
-	FramebufferPtr m_fb;
-	ResourceGroupPtr m_rcGroup;
-
-	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);
-};
-/// @}
-
-} // end namespace anki

+ 5 - 6
include/anki/renderer/Renderer.h

@@ -64,6 +64,11 @@ public:
 		return *m_is;
 		return *m_is;
 	}
 	}
 
 
+	Fs& getFs()
+	{
+		return *m_fs;
+	}
+
 	const Pps& getPps() const
 	const Pps& getPps() const
 	{
 	{
 		return *m_pps;
 		return *m_pps;
@@ -84,11 +89,6 @@ public:
 		return *m_dbg;
 		return *m_dbg;
 	}
 	}
 
 
-	Refl& getRefl()
-	{
-		return *m_refl;
-	}
-
 	U32 getWidth() const
 	U32 getWidth() const
 	{
 	{
 		return m_width;
 		return m_width;
@@ -312,7 +312,6 @@ private:
 	UniquePtr<Ir> m_ir;
 	UniquePtr<Ir> m_ir;
 	UniquePtr<Ms> m_ms; ///< Material rendering stage
 	UniquePtr<Ms> m_ms; ///< Material rendering stage
 	UniquePtr<Is> m_is; ///< Illumination rendering stage
 	UniquePtr<Is> m_is; ///< Illumination rendering stage
-	UniquePtr<Refl> m_refl; ///< Reflections.
 	UniquePtr<Tiler> m_tiler;
 	UniquePtr<Tiler> m_tiler;
 	UniquePtr<Pps> m_pps; ///< Postprocessing rendering stage
 	UniquePtr<Pps> m_pps; ///< Postprocessing rendering stage
 	UniquePtr<Fs> m_fs; ///< Forward shading.
 	UniquePtr<Fs> m_fs; ///< Forward shading.

+ 9 - 8
shaders/ImageReflections.glsl

@@ -10,8 +10,6 @@
 
 
 #include "shaders/Clusterer.glsl"
 #include "shaders/Clusterer.glsl"
 
 
-#define ACCURATE_RAYS 1
-
 // Representation of a reflection probe
 // Representation of a reflection probe
 struct ReflectionProbe
 struct ReflectionProbe
 {
 {
@@ -61,9 +59,8 @@ layout(TEX_BINDING(IMAGE_REFLECTIONS_SET,
 //==============================================================================
 //==============================================================================
 // Compute the cubemap texture lookup vector given the reflection vector (r)
 // Compute the cubemap texture lookup vector given the reflection vector (r)
 // the radius squared of the probe (R2) and the frag pos in sphere space (f)
 // the radius squared of the probe (R2) and the frag pos in sphere space (f)
-vec3 computeCubemapVec(in vec3 r, in float R2, in vec3 f)
+vec3 computeCubemapVecAccurate(in vec3 r, in float R2, in vec3 f)
 {
 {
-#if ACCURATE_RAYS
 	// Compute the collision of the r to the inner part of the sphere
 	// Compute the collision of the r to the inner part of the sphere
 	// From now on we work on the sphere's space
 	// From now on we work on the sphere's space
 
 
@@ -84,9 +81,13 @@ vec3 computeCubemapVec(in vec3 r, in float R2, in vec3 f)
 	vec3 uv = u_invViewRotation * x;
 	vec3 uv = u_invViewRotation * x;
 
 
 	return uv;
 	return uv;
-#else
+}
+
+//==============================================================================
+// Cheap version of computeCubemapVecAccurate
+vec3 computeCubemapVecCheap(in vec3 r, in float R2, in vec3 f)
+{
 	return u_invViewRotation * r;
 	return u_invViewRotation * r;
-#endif
 }
 }
 
 
 //==============================================================================
 //==============================================================================
@@ -117,7 +118,7 @@ void readIndirectInternal(in uint clusterIndex,
 		vec3 f = posVSpace - center;
 		vec3 f = posVSpace - center;
 
 
 		// Cubemap UV in view space
 		// Cubemap UV in view space
-		vec3 uv = computeCubemapVec(r, R2, f);
+		vec3 uv = computeCubemapVecAccurate(r, R2, f);
 
 
 		// Read!
 		// Read!
 		float cubemapIndex = probe.cubemapIndexPad3.x;
 		float cubemapIndex = probe.cubemapIndexPad3.x;
@@ -131,7 +132,7 @@ void readIndirectInternal(in uint clusterIndex,
 		// Same as: specIndirect = c * (1.0 - factor) + specIndirect * factor
 		// Same as: specIndirect = c * (1.0 - factor) + specIndirect * factor
 
 
 		// Do the same for diffuse
 		// Do the same for diffuse
-		uv = computeCubemapVec(n, R2, f);
+		uv = computeCubemapVecCheap(n, R2, f);
 		vec3 id = texture(u_irradianceTex, vec4(uv, cubemapIndex)).rgb;
 		vec3 id = texture(u_irradianceTex, vec4(uv, cubemapIndex)).rgb;
 		diffIndirect = mix(id, diffIndirect, factor);
 		diffIndirect = mix(id, diffIndirect, factor);
 	}
 	}

+ 27 - 0
shaders/IsLp.frag.glsl

@@ -29,6 +29,15 @@ layout(location = 0) out vec3 out_color;
 
 
 const uint TILE_COUNT = TILE_COUNT_X * TILE_COUNT_Y;
 const uint TILE_COUNT = TILE_COUNT_X * TILE_COUNT_Y;
 
 
+#if INDIRECT_ENABLED
+#define IMAGE_REFLECTIONS_SET 1
+#define IMAGE_REFLECTIONS_FIRST_SS_BINDING 0
+#define IMAGE_REFLECTIONS_TEX_BINDING 0
+#include "shaders/ImageReflections.glsl"
+#undef IMAGE_REFLECTIONS_SET
+#undef IMAGE_REFLECTIONS_FIRST_SS_BINDING
+#endif
+
 //==============================================================================
 //==============================================================================
 // Return frag pos in view space
 // Return frag pos in view space
 vec3 getFragPosVSpace()
 vec3 getFragPosVSpace()
@@ -164,6 +173,24 @@ void main()
 			(diffC + specC) * (att * spot * max(subsurface, lambert * shadow));
 			(diffC + specC) * (att * spot * max(subsurface, lambert * shadow));
 	}
 	}
 
 
+#if INDIRECT_ENABLED
+	vec3 eye = -viewDir;
+	vec3 r = reflect(eye, normal);
+	float reflLod = float(IR_MIPMAP_COUNT) * gbuffer.roughness;
+
+	vec3 specIndirect, diffIndirect;
+	readIndirect(fragPos, r, normal, reflLod, specIndirect, diffIndirect);
+
+	diffIndirect *= gbuffer.diffuse;
+
+	// Finalize the indirect specular
+	float ndotv = dot(gbuffer.normal, viewDir);
+	vec2 envBRDF = texture(u_integrationLut, vec2(gbuffer.roughness, ndotv)).xy;
+	specIndirect = specIndirect * (gbuffer.specular * envBRDF.x + envBRDF.y);
+
+	out_color += specIndirect + diffIndirect;
+#endif
+
 // out_color = diffCol;
 // out_color = diffCol;
 #if 0
 #if 0
 	if(pointLightsCount == 0)
 	if(pointLightsCount == 0)

+ 3 - 3
shaders/NearDepthUpscale.frag.glsl

@@ -65,9 +65,9 @@ void main()
 		}
 		}
 	}
 	}
 
 
-	// Check for depth discontinuites. Use textureLod because it's undefined
-	// if you are sampling mipmaped in a conditional branch. See
-	// http://teknicool.tumblr.com/post/77263472964/glsl-dynamic-branching-and-texture-samplers
+// Check for depth discontinuites. Use textureLod because it's undefined
+// if you are sampling mipmaped in a conditional branch. See
+// http://teknicool.tumblr.com/post/77263472964/glsl-dynamic-branching-and-texture-samplers
 #if 0
 #if 0
 	float a = u_linearizePad2.x;
 	float a = u_linearizePad2.x;
 	float b = u_linearizePad2.y;
 	float b = u_linearizePad2.y;

+ 11 - 3
src/renderer/Fs.cpp

@@ -7,7 +7,6 @@
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Is.h>
 #include <anki/renderer/Is.h>
-#include <anki/renderer/Refl.h>
 #include <anki/scene/SceneGraph.h>
 #include <anki/scene/SceneGraph.h>
 #include <anki/scene/Camera.h>
 #include <anki/scene/Camera.h>
 
 
@@ -22,11 +21,20 @@ Fs::~Fs()
 //==============================================================================
 //==============================================================================
 Error Fs::init(const ConfigSet&)
 Error Fs::init(const ConfigSet&)
 {
 {
+	// Create RT
+	m_r->createRenderTarget(m_r->getWidth() / 2,
+		m_r->getHeight() / 2,
+		Is::RT_PIXEL_FORMAT,
+		1,
+		SamplingFilter::NEAREST,
+		1,
+		m_rt);
+
 	FramebufferInitializer fbInit;
 	FramebufferInitializer fbInit;
 	fbInit.m_colorAttachmentsCount = 1;
 	fbInit.m_colorAttachmentsCount = 1;
-	fbInit.m_colorAttachments[0].m_texture = m_r->getRefl().getRt();
+	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation =
 	fbInit.m_colorAttachments[0].m_loadOperation =
-		AttachmentLoadOperation::LOAD;
+		AttachmentLoadOperation::CLEAR;
 	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs().getDepthRt();
 	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs().getDepthRt();
 	fbInit.m_depthStencilAttachment.m_loadOperation =
 	fbInit.m_depthStencilAttachment.m_loadOperation =
 		AttachmentLoadOperation::LOAD;
 		AttachmentLoadOperation::LOAD;

+ 16 - 29
src/renderer/Ir.cpp

@@ -223,7 +223,7 @@ Error Ir::init(const ConfigSet& config)
 	m_envCubemapArr = getGrManager().newInstance<Texture>(texinit);
 	m_envCubemapArr = getGrManager().newInstance<Texture>(texinit);
 
 
 	texinit.m_width = IRRADIANCE_SIZE;
 	texinit.m_width = IRRADIANCE_SIZE;
-	texinit.m_height = IRRADIANCE_SIZE;	
+	texinit.m_height = IRRADIANCE_SIZE;
 	m_irradianceCubemapArr = getGrManager().newInstance<Texture>(texinit);
 	m_irradianceCubemapArr = getGrManager().newInstance<Texture>(texinit);
 
 
 	m_cubemapArrMipCount = computeMaxMipmapCount(m_fbSize, m_fbSize);
 	m_cubemapArrMipCount = computeMaxMipmapCount(m_fbSize, m_fbSize);
@@ -243,18 +243,6 @@ Error Ir::init(const ConfigSet& config)
 	sinit.m_repeat = false;
 	sinit.m_repeat = false;
 	m_integrationLutSampler = getGrManager().newInstance<Sampler>(sinit);
 	m_integrationLutSampler = getGrManager().newInstance<Sampler>(sinit);
 
 
-	// Init the clusterer
-	U width = m_r->getWidth() / 2;
-	U height = m_r->getHeight() / 2;
-	ANKI_ASSERT(isAligned(Renderer::TILE_SIZE, width)
-		&& isAligned(Renderer::TILE_SIZE, height));
-
-	U tileCountX = width / Renderer::TILE_SIZE;
-	U tileCountY = height / Renderer::TILE_SIZE;
-	U clusterCountZ = config.getNumber("ir.clusterSizeZ");
-
-	m_clusterer.init(getAllocator(), tileCountX, tileCountY, clusterCountZ);
-
 	// Init the resource group
 	// Init the resource group
 	ResourceGroupInitializer rcInit;
 	ResourceGroupInitializer rcInit;
 	rcInit.m_textures[0].m_texture = m_envCubemapArr;
 	rcInit.m_textures[0].m_texture = m_envCubemapArr;
@@ -316,11 +304,6 @@ Error Ir::run(CommandBufferPtr cmdb)
 		ANKI_LOGW("Increase the ir.cubemapTextureArraySize");
 		ANKI_LOGW("Increase the ir.cubemapTextureArraySize");
 	}
 	}
 
 
-	//
-	// Prepare clusterer
-	//
-	m_clusterer.prepare(m_r->getThreadPool(), frc);
-
 	//
 	//
 	// Perform some initialization
 	// Perform some initialization
 	//
 	//
@@ -332,7 +315,7 @@ Error Ir::run(CommandBufferPtr cmdb)
 
 
 	// Allocate temp CPU mem
 	// Allocate temp CPU mem
 	ctx.m_clusterData.create(
 	ctx.m_clusterData.create(
-		getFrameAllocator(), m_clusterer.getClusterCount());
+		getFrameAllocator(), m_r->getClusterer().getClusterCount());
 
 
 	//
 	//
 	// Render and populate probes GPU mem
 	// Render and populate probes GPU mem
@@ -352,7 +335,7 @@ Error Ir::run(CommandBufferPtr cmdb)
 
 
 	Vec4* nearClusterDivisor = reinterpret_cast<Vec4*>(invViewRotation + 1);
 	Vec4* nearClusterDivisor = reinterpret_cast<Vec4*>(invViewRotation + 1);
 	nearClusterDivisor->x() = frc.getFrustum().getNear();
 	nearClusterDivisor->x() = frc.getFrustum().getNear();
-	nearClusterDivisor->y() = m_clusterer.getShaderMagicValue();
+	nearClusterDivisor->y() = m_r->getClusterer().getShaderMagicValue();
 	nearClusterDivisor->z() = 0.0;
 	nearClusterDivisor->z() = 0.0;
 	nearClusterDivisor->w() = 0.0;
 	nearClusterDivisor->w() = 0.0;
 
 
@@ -414,7 +397,7 @@ void Ir::binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx)
 	// Init clusterer test result for this thread
 	// Init clusterer test result for this thread
 	if(start < end)
 	if(start < end)
 	{
 	{
-		m_clusterer.initTestResults(
+		m_r->getClusterer().initTestResults(
 			getFrameAllocator(), task.m_clustererTestResult);
 			getFrameAllocator(), task.m_clustererTestResult);
 	}
 	}
 
 
@@ -438,12 +421,13 @@ void Ir::binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx)
 	if(who == 0)
 	if(who == 0)
 	{
 	{
 		void* mem = getGrManager().allocateFrameHostVisibleMemory(
 		void* mem = getGrManager().allocateFrameHostVisibleMemory(
-			m_clusterer.getClusterCount() * sizeof(IrShaderCluster),
+			m_r->getClusterer().getClusterCount() * sizeof(IrShaderCluster),
 			BufferUsage::STORAGE,
 			BufferUsage::STORAGE,
 			m_clustersToken);
 			m_clustersToken);
 
 
-		ctx.m_clusters = SArray<IrShaderCluster>(
-			static_cast<IrShaderCluster*>(mem), m_clusterer.getClusterCount());
+		ctx.m_clusters =
+			SArray<IrShaderCluster>(static_cast<IrShaderCluster*>(mem),
+				m_r->getClusterer().getClusterCount());
 	}
 	}
 
 
 	// Use the same trick to allocate the indices
 	// Use the same trick to allocate the indices
@@ -474,8 +458,11 @@ void Ir::binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx)
 	m_barrier.wait();
 	m_barrier.wait();
 	ANKI_TRACE_START_EVENT(RENDER_IR);
 	ANKI_TRACE_START_EVENT(RENDER_IR);
 
 
-	ThreadPool::Task::choseStartEnd(
-		threadId, threadsCount, m_clusterer.getClusterCount(), start, end);
+	ThreadPool::Task::choseStartEnd(threadId,
+		threadsCount,
+		m_r->getClusterer().getClusterCount(),
+		start,
+		end);
 
 
 	for(auto i = start; i < end; i++)
 	for(auto i = start; i < end; i++)
 	{
 	{
@@ -525,7 +512,7 @@ void Ir::binProbe(U probeIdx, IrRunContext& ctx, IrTaskContext& task) const
 		task.m_node->getComponent<ReflectionProbeComponent>();
 		task.m_node->getComponent<ReflectionProbeComponent>();
 
 
 	// Perform the expensive tests
 	// Perform the expensive tests
-	m_clusterer.bin(sp.getSpatialCollisionShape(),
+	m_r->getClusterer().bin(sp.getSpatialCollisionShape(),
 		sp.getAabb(),
 		sp.getAabb(),
 		task.m_clustererTestResult);
 		task.m_clustererTestResult);
 
 
@@ -538,8 +525,8 @@ void Ir::binProbe(U probeIdx, IrRunContext& ctx, IrTaskContext& task) const
 		U y = (*it)[1];
 		U y = (*it)[1];
 		U z = (*it)[2];
 		U z = (*it)[2];
 
 
-		U i = m_clusterer.getClusterCountX()
-				* (z * m_clusterer.getClusterCountY() + y)
+		U i = m_r->getClusterer().getClusterCountX()
+				* (z * m_r->getClusterer().getClusterCountY() + y)
 			+ x;
 			+ x;
 
 
 		auto& cluster = ctx.m_clusterData[i];
 		auto& cluster = ctx.m_clusterData[i];

+ 17 - 2
src/renderer/Is.cpp

@@ -7,6 +7,7 @@
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Pps.h>
 #include <anki/renderer/Pps.h>
+#include <anki/renderer/Ir.h>
 #include <anki/scene/Camera.h>
 #include <anki/scene/Camera.h>
 #include <anki/scene/Light.h>
 #include <anki/scene/Light.h>
 #include <anki/scene/Visibility.h>
 #include <anki/scene/Visibility.h>
@@ -252,7 +253,9 @@ Error Is::initInternal(const ConfigSet& config)
 				"#define MAX_SPOT_LIGHTS %u\n"
 				"#define MAX_SPOT_LIGHTS %u\n"
 				"#define MAX_LIGHT_INDICES %u\n"
 				"#define MAX_LIGHT_INDICES %u\n"
 				"#define GROUND_LIGHT %u\n"
 				"#define GROUND_LIGHT %u\n"
-				"#define POISSON %u\n",
+				"#define POISSON %u\n"
+				"#define INDIRECT_ENABLED %u\n"
+				"#define IR_MIPMAP_COUNT %u\n",
 		m_r->getTileCountXY().x(),
 		m_r->getTileCountXY().x(),
 		m_r->getTileCountXY().y(),
 		m_r->getTileCountXY().y(),
 		m_r->getClusterCount(),
 		m_r->getClusterCount(),
@@ -262,7 +265,9 @@ Error Is::initInternal(const ConfigSet& config)
 		m_maxSpotLights,
 		m_maxSpotLights,
 		m_maxLightIds,
 		m_maxLightIds,
 		m_groundLightEnabled,
 		m_groundLightEnabled,
-		m_sm.getPoissonEnabled());
+		m_sm.getPoissonEnabled(),
+		m_r->getIrEnabled(),
+		(m_r->getIrEnabled()) ? m_r->getIr().getCubemapArrayMipmapCount() : 0);
 
 
 	// point light
 	// point light
 	ANKI_CHECK(getResourceManager().loadResourceToCache(
 	ANKI_CHECK(getResourceManager().loadResourceToCache(
@@ -776,6 +781,16 @@ void Is::setState(CommandBufferPtr& cmdb)
 	dyn.m_storageBuffers[4] = m_lightIdsToken;
 	dyn.m_storageBuffers[4] = m_lightIdsToken;
 
 
 	cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
 	cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
+
+	if(m_r->getIrEnabled())
+	{
+		DynamicBufferInfo dyn;
+		dyn.m_storageBuffers[0] = m_r->getIr().getProbesToken();
+		dyn.m_storageBuffers[1] = m_r->getIr().getProbeIndicesToken();
+		dyn.m_storageBuffers[2] = m_r->getIr().getClustersToken();
+
+		cmdb->bindResourceGroup(m_r->getIr().getResourceGroup(), 1, &dyn);
+	}
 }
 }
 
 
 //==============================================================================
 //==============================================================================

+ 0 - 204
src/renderer/Refl.cpp

@@ -1,204 +0,0 @@
-// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include <anki/renderer/Refl.h>
-#include <anki/renderer/Renderer.h>
-#include <anki/renderer/Ms.h>
-#include <anki/renderer/Ir.h>
-#include <anki/renderer/Is.h>
-#include <anki/renderer/Pps.h>
-#include <anki/misc/ConfigSet.h>
-#include <anki/scene/FrustumComponent.h>
-
-namespace anki
-{
-
-//==============================================================================
-// Misc                                                                        =
-//==============================================================================
-
-struct ReflUniforms
-{
-	Vec4 m_projectionParams;
-	Mat4 m_projectionMat;
-};
-
-//==============================================================================
-// Refl                                                                        =
-//==============================================================================
-
-//==============================================================================
-Refl::Refl(Renderer* r)
-	: RenderingPass(r)
-{
-}
-
-//==============================================================================
-Refl::~Refl()
-{
-}
-
-//==============================================================================
-Error Refl::init(const ConfigSet& config)
-{
-	Error err = initInternal(config);
-	if(err)
-	{
-		ANKI_LOGE("Failed to init reflections");
-	}
-
-	return err;
-}
-
-//==============================================================================
-Error Refl::initInternal(const ConfigSet& config)
-{
-	m_sslrEnabled = config.getNumber("sslr.enabled") && m_r->getIrEnabled();
-
-	// Size
-	m_width = m_r->getWidth() / 2;
-	m_height = m_r->getHeight() / 2;
-
-	// Continue
-	GrManager& gr = getGrManager();
-
-	// Create shader
-	StringAuto pps(getFrameAllocator());
-	const PixelFormat& pixFormat = Is::RT_PIXEL_FORMAT;
-
-	pps.sprintf("#define WIDTH %u\n"
-				"#define HEIGHT %u\n"
-				"#define TILE_COUNT_X %u\n"
-				"#define TILE_COUNT_Y %u\n"
-				"#define SSLR_ENABLED %u\n"
-				"#define IR_ENABLED %u\n"
-				"#define IR_MIPMAP_COUNT %u\n"
-				"#define TILE_SIZE %u\n"
-				"#define SSLR_START_ROUGHNESS %f\n",
-		m_width,
-		m_height,
-		(m_r->getIrEnabled()) ? m_r->getIr().getClusterer().getClusterCountX()
-							  : 0,
-		(m_r->getIrEnabled()) ? m_r->getIr().getClusterer().getClusterCountY()
-							  : 0,
-		U(m_sslrEnabled),
-		U(m_r->getIrEnabled()),
-		(m_r->getIrEnabled()) ? m_r->getIr().getCubemapArrayMipmapCount() : 0,
-		Renderer::TILE_SIZE,
-		config.getNumber("sslr.startRoughnes"));
-
-	ANKI_CHECK(getResourceManager().loadResourceToCache(
-		m_frag, "shaders/Refl.frag.glsl", pps.toCString(), "r_refl_"));
-
-	// Create vert shader
-	pps.destroy();
-	pps.sprintf("#define UV_OFFSET vec2(%f, %f)",
-		(1.0 / m_width) / 2.0,
-		(1.0 / m_height) / 2.0);
-
-	ANKI_CHECK(getResourceManager().loadResourceToCache(
-		m_vert, "shaders/Quad.vert.glsl", pps.toCString(), "r_refl_"));
-
-	// Create ppline
-	PipelineInitializer ppinit;
-	ppinit.m_color.m_attachmentCount = 1;
-	ppinit.m_color.m_attachments[0].m_format = pixFormat;
-	ppinit.m_depthStencil.m_depthWriteEnabled = true;
-	ppinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
-	ppinit.m_depthStencil.m_format = Ms::DEPTH_RT_PIXEL_FORMAT;
-	ppinit.m_shaders[ShaderType::VERTEX] = m_vert->getGrShader();
-	ppinit.m_shaders[ShaderType::FRAGMENT] = m_frag->getGrShader();
-
-	m_ppline = gr.newInstance<Pipeline>(ppinit);
-
-	// Create RC group
-	ResourceGroupInitializer rcInit;
-
-	SamplerInitializer sinit;
-	sinit.m_minMagFilter = SamplingFilter::LINEAR;
-	rcInit.m_textures[0].m_texture = m_r->getMs().getDepthRt();
-	rcInit.m_textures[0].m_sampler = gr.newInstance<Sampler>(sinit);
-
-	rcInit.m_textures[1].m_texture = m_r->getMs().getRt0();
-	rcInit.m_textures[1].m_sampler = rcInit.m_textures[0].m_sampler;
-
-	rcInit.m_textures[2].m_texture = m_r->getMs().getRt1();
-	rcInit.m_textures[2].m_sampler = rcInit.m_textures[0].m_sampler;
-
-	rcInit.m_textures[3].m_texture = m_r->getMs().getRt2();
-	rcInit.m_textures[3].m_sampler = rcInit.m_textures[0].m_sampler;
-
-	if(m_sslrEnabled)
-	{
-		rcInit.m_textures[4].m_texture = m_r->getIs().getRt();
-	}
-
-	rcInit.m_uniformBuffers[0].m_dynamic = true;
-
-	m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
-
-	// Create RTs
-	m_r->createRenderTarget(
-		m_width, m_height, pixFormat, 1, SamplingFilter::NEAREST, 1, m_rt);
-
-	// Create FB
-	FramebufferInitializer fbInit;
-	fbInit.m_colorAttachmentsCount = 2;
-	fbInit.m_colorAttachments[0].m_texture = m_rt;
-	fbInit.m_colorAttachments[0].m_loadOperation =
-		AttachmentLoadOperation::DONT_CARE;
-
-	fbInit.m_colorAttachments[1].m_texture = m_r->getMs().getRt2();
-	fbInit.m_colorAttachments[1].m_loadOperation =
-		AttachmentLoadOperation::DONT_CARE;
-	fbInit.m_colorAttachments[1].m_mipmap = 1;
-
-	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs().getDepthRt();
-	fbInit.m_depthStencilAttachment.m_format = Ms::DEPTH_RT_PIXEL_FORMAT;
-	fbInit.m_depthStencilAttachment.m_loadOperation =
-		AttachmentLoadOperation::DONT_CARE;
-	fbInit.m_depthStencilAttachment.m_mipmap = 1;
-
-	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
-
-	return ErrorCode::NONE;
-}
-
-//==============================================================================
-void Refl::run(CommandBufferPtr cmdb)
-{
-	cmdb->bindFramebuffer(m_fb);
-	cmdb->setViewport(0, 0, m_width, m_height);
-	cmdb->bindPipeline(m_ppline);
-
-	// Bind first resource group
-	DynamicBufferInfo dyn;
-
-	const FrustumComponent& frc = m_r->getActiveFrustumComponent();
-	ReflUniforms* blk = static_cast<ReflUniforms*>(
-		getGrManager().allocateFrameHostVisibleMemory(sizeof(ReflUniforms),
-			BufferUsage::UNIFORM,
-			dyn.m_uniformBuffers[0]));
-	blk->m_projectionParams = m_r->getProjectionParameters();
-	blk->m_projectionMat = frc.getProjectionMatrix();
-
-	cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
-
-	// Bind second resource group
-	if(m_r->getIrEnabled())
-	{
-		DynamicBufferInfo dyn;
-
-		dyn.m_storageBuffers[0] = m_r->getIr().getProbesToken();
-		dyn.m_storageBuffers[1] = m_r->getIr().getProbeIndicesToken();
-		dyn.m_storageBuffers[2] = m_r->getIr().getClustersToken();
-
-		cmdb->bindResourceGroup(m_r->getIr().getResourceGroup(), 1, &dyn);
-	};
-
-	m_r->drawQuad(cmdb);
-}
-
-} // end namespace anki

+ 1 - 5
src/renderer/Renderer.cpp

@@ -17,7 +17,6 @@
 #include <anki/renderer/Lf.h>
 #include <anki/renderer/Lf.h>
 #include <anki/renderer/Dbg.h>
 #include <anki/renderer/Dbg.h>
 #include <anki/renderer/Tiler.h>
 #include <anki/renderer/Tiler.h>
-#include <anki/renderer/Refl.h>
 #include <anki/renderer/Upsample.h>
 #include <anki/renderer/Upsample.h>
 
 
 namespace anki
 namespace anki
@@ -129,9 +128,6 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_is.reset(m_alloc.newInstance<Is>(this));
 	m_is.reset(m_alloc.newInstance<Is>(this));
 	ANKI_CHECK(m_is->init(config));
 	ANKI_CHECK(m_is->init(config));
 
 
-	m_refl.reset(m_alloc.newInstance<Refl>(this));
-	ANKI_CHECK(m_refl->init(config));
-
 	m_fs.reset(m_alloc.newInstance<Fs>(this));
 	m_fs.reset(m_alloc.newInstance<Fs>(this));
 	ANKI_CHECK(m_fs->init(config));
 	ANKI_CHECK(m_fs->init(config));
 
 
@@ -193,7 +189,7 @@ Error Renderer::render(
 
 
 	ANKI_CHECK(m_is->run(cmdb));
 	ANKI_CHECK(m_is->run(cmdb));
 
 
-	m_refl->run(cmdb);
+	cmdb->generateMipmaps(m_ms->getDepthRt());
 
 
 	ANKI_CHECK(m_fs->run(cmdb));
 	ANKI_CHECK(m_fs->run(cmdb));
 	m_lf->run(cmdb);
 	m_lf->run(cmdb);

+ 3 - 3
src/renderer/Upsample.cpp

@@ -7,7 +7,7 @@
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Is.h>
 #include <anki/renderer/Is.h>
-#include <anki/renderer/Refl.h>
+#include <anki/renderer/Fs.h>
 #include <anki/scene/FrustumComponent.h>
 #include <anki/scene/FrustumComponent.h>
 
 
 namespace anki
 namespace anki
@@ -31,11 +31,11 @@ Error Upsample::init(const ConfigSet& config)
 	rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
 
 
 	sinit.m_minLod = 0.0;
 	sinit.m_minLod = 0.0;
-	rcInit.m_textures[2].m_texture = m_r->getRefl().getRt();
+	rcInit.m_textures[2].m_texture = m_r->getFs().getRt();
 	rcInit.m_textures[2].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcInit.m_textures[2].m_sampler = gr.newInstance<Sampler>(sinit);
 
 
 	sinit.m_minMagFilter = SamplingFilter::LINEAR;
 	sinit.m_minMagFilter = SamplingFilter::LINEAR;
-	rcInit.m_textures[3].m_texture = m_r->getRefl().getRt();
+	rcInit.m_textures[3].m_texture = m_r->getFs().getRt();
 	rcInit.m_textures[3].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcInit.m_textures[3].m_sampler = gr.newInstance<Sampler>(sinit);
 
 
 	rcInit.m_uniformBuffers[0].m_dynamic = true;
 	rcInit.m_uniformBuffers[0].m_dynamic = true;

+ 1 - 1
src/scene/Sector.cpp

@@ -617,7 +617,7 @@ void SectorGroup::findVisibleSectorsInternal(const FrustumComponent& frc,
 #if 0
 #if 0
 			&& r.doGpuVisibilityTest(p.getBoundingShape(), box))
 			&& r.doGpuVisibilityTest(p.getBoundingShape(), box))
 #else
 #else
-			)
+				)
 #endif
 #endif
 		{
 		{
 			it = p.m_sectors.getBegin();
 			it = p.m_sectors.getBegin();