2
0
Panagiotis Christopoulos Charitos 10 жил өмнө
parent
commit
a6ad6a76a0

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

@@ -35,6 +35,11 @@ anki_internal:
 		return m_cubemapArr;
 	}
 
+	DynamicBufferToken getProbesToken() const
+	{
+		return m_probesToken;
+	}
+
 private:
 	Renderer m_nestedR;
 	TexturePtr m_cubemapArr;

+ 15 - 0
include/anki/renderer/Renderer.h

@@ -68,6 +68,21 @@ public:
 		return *m_dbg;
 	}
 
+	const Ir& getIr() const
+	{
+		return *m_ir;
+	}
+
+	Ir& getIr()
+	{
+		return *m_ir;
+	}
+
+	Bool irEnabled() const
+	{
+		return m_ir.isCreated();
+	}
+
 	Dbg& getDbg()
 	{
 		return *m_dbg;

+ 6 - 4
shaders/ImageReflections.glsl

@@ -17,7 +17,7 @@ struct ReflectionProbe
 	vec4 positionRadiusSq;
 
 	// Slice in u_reflectionsTex vector.
-	vec4 cubemapSlicePad3;
+	vec4 cubemapIndexPad3;
 };
 
 layout(std140, row_major, SS_BINDING(IMAGE_REFLECTIONS_SET,
@@ -50,6 +50,8 @@ vec3 computeCubemapVec(in vec3 r, in float R2, in vec3 f)
 	pp = min(pp, R2);
 	float sq = sqrt(R2 - pp);
 	vec3 x = p + sq * r;
+
+	return normalize(x);
 }
 
 //==============================================================================
@@ -66,15 +68,15 @@ vec3 readReflection(in vec3 posVSpace, in vec3 normalVSpace)
 	for(uint i = 0; i < count; ++i)
 	{
 		float R2 = u_reflectionProbes[i].positionRadiusSq.w;
-		vec3 c = u_reflectionProbes[i].positionRadius.xyz;
+		vec3 c = u_reflectionProbes[i].positionRadiusSq.xyz;
 
 		// Check if posVSpace is inside the sphere
 		vec3 f = posVSpace - c;
-		if(dot(f) < R2)
+		if(dot(f, f) < R2)
 		{
 			vec3 uv = computeCubemapVec(r, R2, f);
 			color += texture(u_reflectionsTex, vec4(uv,
-				u_reflectionProbes[i].cubemapSlicePad3.x));
+				u_reflectionProbes[i].cubemapIndexPad3.x));
 		}
 	}
 

+ 10 - 0
shaders/IsLp.frag.glsl

@@ -27,6 +27,16 @@ layout(location = 0) out vec3 out_color;
 
 #pragma anki include "shaders/LightFunctions.glsl"
 
+#if IR == 1
+#define IMAGE_REFLECTIONS_SET 0
+#define IMAGE_REFLECTIONS_SS_BINDING 5
+#define IMAGE_REFLECTIONS_TEX_BINDING 6
+#pragma anki include "shaders/ImageReflections.glsl"
+#undef IMAGE_REFLECTIONS_SET
+#undef IMAGE_REFLECTIONS_SS_BINDING
+#undef IMAGE_REFLECTIONS_TEX_BINDING
+#endif
+
 const uint TILE_COUNT = TILES_COUNT_X * TILES_COUNT_Y;
 
 //==============================================================================

+ 17 - 13
src/renderer/Ir.cpp

@@ -21,7 +21,9 @@ namespace anki {
 struct ShaderReflectionProbe
 {
 	Vec3 m_pos;
-	F32 m_radius;
+	F32 m_radiusSq;
+	F32 m_cubemapIndex;
+	U32 _m_pading[3];
 };
 
 //==============================================================================
@@ -57,7 +59,7 @@ Error Ir::init(const ConfigSet& initializer)
 	config.set("dbg.enabled", false);
 	config.set("is.sm.bilinearEnabled", true);
 	config.set("is.groundLightEnabled", false);
-	config.set("is.sm.enabled", true);
+	config.set("is.sm.enabled", false);
 	config.set("is.sm.maxLights", 8);
 	config.set("is.sm.poissonEnabled", false);
 	config.set("is.sm.resolution", 16);
@@ -97,19 +99,19 @@ Error Ir::run(CommandBufferPtr cmdb)
 	FrustumComponent& frc = m_r->getActiveFrustumComponent();
 	VisibilityTestResults& visRez = frc.getVisibilityTestResults();
 
-	if(visRez.getReflectionProbeCount() == 0)
-	{
-		// Early out
-		return ErrorCode::NONE;
-	}
-
 	const VisibleNode* it = visRez.getReflectionProbesBegin();
 	const VisibleNode* end = visRez.getReflectionProbesEnd();
 	U probCount = end - it;
 
-	ShaderReflectionProbe* probes =
-		cmdb->allocateDynamicMemory<ShaderReflectionProbe>(probCount,
-		BufferUsage::UNIFORM, m_probesToken);
+	U8* data = cmdb->allocateDynamicMemory<U8>(
+		sizeof(ShaderReflectionProbe) * m_cubemapArrSize + sizeof(UVec4),
+		BufferUsage::STORAGE, m_probesToken);
+
+	UVec4* counts = reinterpret_cast<UVec4*>(data);
+	counts->x() = probCount;
+
+	ShaderReflectionProbe* probes = reinterpret_cast<ShaderReflectionProbe*>(
+		counts + 1);
 
 	while(it != end)
 	{
@@ -124,12 +126,14 @@ Error Ir::run(CommandBufferPtr cmdb)
 //==============================================================================
 Error Ir::renderReflection(SceneNode& node, ShaderReflectionProbe& shaderProb)
 {
+	const FrustumComponent& frc = m_r->getActiveFrustumComponent();
 	const ReflectionProbeComponent& reflc =
 		node.getComponent<ReflectionProbeComponent>();
 
 	// Write shader var
-	shaderProb.m_pos = reflc.getPosition().xyz();
-	shaderProb.m_radius = reflc.getRadius();
+	shaderProb.m_pos = (frc.getViewMatrix() * reflc.getPosition()).xyz();
+	shaderProb.m_radiusSq = reflc.getRadius() * reflc.getRadius();
+	shaderProb.m_cubemapIndex = 0;
 
 	// Render cubemap
 	for(U i = 0; i < 6; ++i)

+ 36 - 19
src/renderer/Is.cpp

@@ -3,17 +3,17 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include "anki/renderer/Is.h"
-#include "anki/renderer/Renderer.h"
-#include "anki/renderer/Ms.h"
-#include "anki/renderer/Pps.h"
-#include "anki/renderer/Tiler.h"
-#include "anki/scene/Camera.h"
-#include "anki/scene/Light.h"
-#include "anki/scene/Visibility.h"
-#include "anki/core/Counters.h"
-#include "anki/util/Logger.h"
-#include "anki/misc/ConfigSet.h"
+#include <anki/renderer/Is.h>
+#include <anki/renderer/Renderer.h>
+#include <anki/renderer/Ms.h>
+#include <anki/renderer/Pps.h>
+#include <anki/renderer/Ir.h>
+#include <anki/scene/Camera.h>
+#include <anki/scene/Light.h>
+#include <anki/scene/Visibility.h>
+#include <anki/core/Counters.h>
+#include <anki/util/Logger.h>
+#include <anki/misc/ConfigSet.h>
 
 namespace anki {
 
@@ -245,7 +245,8 @@ Error Is::initInternal(const ConfigSet& config)
 		"#define MAX_SPOT_LIGHTS %u\n"
 		"#define MAX_LIGHT_INDICES %u\n"
 		"#define GROUND_LIGHT %u\n"
-		"#define POISSON %u\n",
+		"#define POISSON %u\n"
+		"#define IR %u\n",
 		m_r->getTileCountXY().x(),
 		m_r->getTileCountXY().y(),
 		m_r->getClusterCount(),
@@ -255,7 +256,8 @@ Error Is::initInternal(const ConfigSet& config)
 		m_maxSpotLights,
 		m_maxLightIds,
 		m_groundLightEnabled,
-		m_sm.getPoissonEnabled());
+		m_sm.getPoissonEnabled(),
+		m_r->irEnabled());
 
 	// point light
 	ANKI_CHECK(getResourceManager().loadResourceToCache(m_lightVert,
@@ -300,12 +302,20 @@ Error Is::initInternal(const ConfigSet& config)
 		init.m_textures[3].m_texture = m_r->getMs().getDepthRt();
 		init.m_textures[4].m_texture = m_sm.getSpotTextureArray();
 		init.m_textures[5].m_texture = m_sm.getOmniTextureArray();
+		if(m_r->irEnabled())
+		{
+			init.m_textures[6].m_texture = m_r->getIr().getCubemapArray();
+		}
 
 		init.m_storageBuffers[0].m_dynamic = true;
 		init.m_storageBuffers[1].m_dynamic = true;
 		init.m_storageBuffers[2].m_dynamic = true;
 		init.m_storageBuffers[3].m_dynamic = true;
 		init.m_storageBuffers[4].m_dynamic = true;
+		if(m_r->irEnabled())
+		{
+			init.m_storageBuffers[5].m_dynamic = true;
+		}
 
 		m_rcGroup = getGrManager().newInstance<ResourceGroup>(init);
 	}
@@ -381,10 +391,13 @@ Error Is::lightPass(CommandBufferPtr& cmdb)
 	//
 	// Do shadows pass
 	//
-	ANKI_CHECK(m_sm.run(
-		{&spotCasters[0], spotCastersCount},
-		{&omniCasters[0], omniCastersCount},
-		cmdb));
+	if(m_sm.getEnabled())
+	{
+		ANKI_CHECK(m_sm.run(
+			{&spotCasters[0], spotCastersCount},
+			{&omniCasters[0], omniCastersCount},
+			cmdb));
+	}
 
 	//
 	// Write the lights and tiles UBOs
@@ -604,7 +617,7 @@ I Is::writePointLight(const LightComponent& lightc,
 	slight.m_posRadius = Vec4(pos.xyz(), -1.0 / lightc.getRadius());
 	slight.m_diffuseColorShadowmapId = lightc.getDiffuseColor();
 
-	if(!lightc.getShadowEnabled())
+	if(!lightc.getShadowEnabled() || !m_sm.getEnabled())
 	{
 		slight.m_diffuseColorShadowmapId.w() = INVALID_TEXTURE_INDEX;
 	}
@@ -633,7 +646,7 @@ I Is::writeSpotLight(const LightComponent& lightc,
 	ShaderSpotLight& light = task.m_spotLights[i];
 	F32 shadowmapIndex = INVALID_TEXTURE_INDEX;
 
-	if(lightc.getShadowEnabled())
+	if(lightc.getShadowEnabled() && m_sm.getEnabled())
 	{
 		// Write matrix
 		static const Mat4 biasMat4(
@@ -732,6 +745,10 @@ void Is::setState(CommandBufferPtr& cmdb)
 	dyn.m_storageBuffers[2] = m_sLightsToken;
 	dyn.m_storageBuffers[3] = m_clustersToken;
 	dyn.m_storageBuffers[4] = m_lightIdsToken;
+	if(m_r->irEnabled())
+	{
+		dyn.m_storageBuffers[5] = m_r->getIr().getProbesToken();
+	}
 
 	cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
 }

+ 4 - 4
testapp/Main.cpp

@@ -89,8 +89,8 @@ Error init()
 #if !PLAYER
 	cam->getComponent<MoveComponent>().
 		setLocalTransform(Transform(
-		Vec4(147.392776, -10.132728, 16.607138, 0.0),
-		//Vec4(0.0),
+		//Vec4(147.392776, -10.132728, 16.607138, 0.0),
+		Vec4(0.0, 10, 0, 0),
 		Mat3x4(Euler(toRad(0.0), toRad(90.0), toRad(0.0))),
 		1.0));
 #endif
@@ -100,7 +100,7 @@ Error init()
 		ReflectionProbe* refl;
 		scene.newSceneNode<ReflectionProbe>("refl", refl, 6.0f);
 		move = refl->tryGetComponent<MoveComponent>();
-		move->setLocalOrigin(Vec4(137.392166, -10.132728, 16.407137, 0.0));
+		move->setLocalOrigin(Vec4(0.0, 10, 0, 0));
 	}
 
 #if 0
@@ -481,7 +481,7 @@ Error initSubsystems(int argc, char* argv[])
 	config.set("is.sm.poissonEnabled", true);
 	config.set("is.sm.resolution", 1024);
 	config.set("lf.maxFlares", 32);
-	config.set("pps.enabled", true);
+	config.set("pps.enabled", false);
 	config.set("pps.bloom.enabled", true);
 	config.set("pps.bloom.renderingQuality", 0.5);
 	config.set("pps.bloom.blurringDist", 1.0);