Panagiotis Christopoulos Charitos 7 years ago
parent
commit
9f37b34dea

+ 1 - 1
samples/common/Framework.cpp

@@ -32,7 +32,7 @@ Error SampleApp::init(int argc, char** argv, CString sampleName)
 	getInput().moveCursor(Vec2(0.0f));
 
 	// Some renderer stuff
-	getMainRenderer().getOffscreenRenderer().getVolumetricFog().setFogParticleColor(Vec3(1.0f, 0.9f, 0.9f) * 0.0001f);
+	getMainRenderer().getOffscreenRenderer().getVolumetricFog().setFogParticleColor(Vec3(1.0f, 0.9f, 0.9f));
 
 	ANKI_CHECK(sampleExtraInit());
 

+ 2 - 1
samples/sponza/Main.cpp

@@ -17,7 +17,8 @@ public:
 		ANKI_CHECK(getResourceManager().loadResource("assets/scene.lua", script));
 		ANKI_CHECK(getScriptManager().evalString(script->getSource()));
 
-		getMainRenderer().getOffscreenRenderer().getVolumetricFog().setFogParticleColor(Vec3(1.0, 0.9, 0.9) * 0.009);
+		getMainRenderer().getOffscreenRenderer().getVolumetricFog().setFogParticleColor(Vec3(1.0, 0.9, 0.9));
+		getMainRenderer().getOffscreenRenderer().getVolumetricFog().setParticleDensity(2.0f);
 		return Error::NONE;
 	}
 };

+ 5 - 4
shaders/LightShadingApplyFog.glslp

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma anki input const UVec3 FOG_VOLUME_SIZE
+#pragma anki input const U32 FOG_LAST_CLASTER
 
 #pragma anki start vert
 #include <shaders/QuadVert.glsl>
@@ -11,10 +11,11 @@
 
 #pragma anki start frag
 
+#include <shaders/glsl_cpp_common/ClusteredShading.h>
 #include <shaders/Common.glsl>
 
 layout(location = 0) in Vec2 in_uv;
-layout(location = 0) out Vec3 out_color;
+layout(location = 0) out Vec4 out_color;
 
 layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_depthRt;
 layout(ANKI_TEX_BINDING(0, 1)) uniform sampler3D u_fogVolume;
@@ -33,11 +34,11 @@ void main()
 	F32 depth = textureLod(u_depthRt, in_uv, 0.0).r;
 
 	// Get world position
-	Vec4 worldPos4 = u_invViewProjMat * Vec4(ndc, depth, 1.0);
+	Vec4 worldPos4 = u_invViewProjMat * Vec4(UV_TO_NDC(in_uv), depth, 1.0);
 	Vec3 worldPos = worldPos4.xyz / worldPos4.w;
 
 	// Read the volume
-	Vec3 uv3d = computeClustererVolumeTextureUvs(u_clustererMagic, uv, worldPos, FOG_VOLUME_SIZE.z);
+	Vec3 uv3d = computeClustererVolumeTextureUvs(u_clustererMagic, in_uv, worldPos, FOG_LAST_CLASTER + 1u);
 	Vec4 fogVals = textureLod(u_fogVolume, uv3d, 0.0);
 	Vec3 inScattering = fogVals.rgb;
 	F32 transmittance = fogVals.a;

+ 9 - 7
shaders/VolumetricFogAccumulation.glslp

@@ -12,6 +12,7 @@
 #pragma anki start comp
 
 #include <shaders/glsl_cpp_common/ClusteredShading.h>
+#include <shaders/Common.glsl>
 
 layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
 
@@ -29,7 +30,7 @@ ANKI_PUSH_CONSTANTS(PushConsts, u_regs);
 #define u_fogAbsorptionCoeff u_regs.m_fogScatteringCoeffFogAbsorptionCoeffDensityPad1.y
 #define u_density u_regs.m_fogScatteringCoeffFogAbsorptionCoeffDensityPad1.z
 #define u_fogDiffuse u_regs.m_fogDiffusePad1.xyz
-#define u_clustererMagic m_regs.m_clustererMagic
+#define u_clustererMagic u_regs.m_clustererMagic
 
 void main()
 {
@@ -41,7 +42,7 @@ void main()
 	Vec2 uv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(VOLUME_SIZE.xy);
 
 	Vec4 colorAndDensityFront = Vec4(0.0);
-	ANKI_LOOP for(U32 i = 0u; i <= VOLUME_SIZE.z; ++i)
+	ANKI_LOOP for(U32 i = 0u; i < VOLUME_SIZE.z; ++i)
 	{
 		// Compute the cluster K limits of this cluster fragment
 		F32 clusterKNear = F32(i) * (F32(FINAL_CLUSTER_Z + 1u) / F32(VOLUME_SIZE.z));
@@ -59,18 +60,19 @@ void main()
 		F32 absorption = u_density * u_fogAbsorptionCoeff * layerThinkness;
 
 		// Read the light value
-		F32 k = mix(clusterKFar, clusterKNear, 0.5);
-		Vec3 light = textureLod(u_lightVolume, Vec3(uv, k / F32(FINAL_CLUSTER_Z + 1u)), 0.0).rgb;
+		Vec3 light = textureLod(u_lightVolume, Vec3(uv, clusterKFar / F32(FINAL_CLUSTER_Z + 1u)), 0.0).rgb;
 		light *= u_fogDiffuse;
 
 		// Integrate
-		Vec4 colorAndDensityBack = Vec4(light * scattering, scattering * absoption);
+		Vec4 colorAndDensityBack = Vec4(light * scattering, scattering + absorption);
 
 		Vec3 l = colorAndDensityFront.rgb + saturate(exp(-colorAndDensityFront.a)) * colorAndDensityBack.rgb;
 		colorAndDensityFront = Vec4(l.rgb, colorAndDensityFront.a + colorAndDensityBack.a);
 
 		// Write the value
-		Vec4 valToWrite = Vec4(colorAndDensityFront.rgb, exp(-colorAndDensityFront.a));
+		Vec4 valToWrite = Vec4(colorAndDensityFront.rgb, saturate(exp(-colorAndDensityFront.a)));
 		imageStore(u_fogVolume, IVec3(UVec3(gl_GlobalInvocationID.xy, i)), valToWrite);
 	}
-}
+}
+
+#pragma anki end

+ 7 - 0
src/anki/gr/vulkan/TextureImpl.cpp

@@ -690,6 +690,13 @@ VkImageView TextureImpl::getOrCreateView(const TextureSubresourceInfo& subresour
 
 		m_viewsMap.emplace(getAllocator(), subresource, view);
 
+#if 0
+		printf("Creating image view %p. Texture %p %s\n",
+		static_cast<void*>(view),
+		static_cast<void*>(m_imageHandle),
+		getName() ? getName().cstr() : "Unnamed");
+#endif
+
 		return view;
 	}
 }

+ 4 - 2
src/anki/renderer/LightShading.cpp

@@ -84,8 +84,7 @@ Error LightShading::initApplyFog(const ConfigSet& config)
 	ANKI_CHECK(getResourceManager().loadResource("shaders/LightShadingApplyFog.glslp", m_applyFog.m_prog));
 
 	ShaderProgramResourceConstantValueInitList<1> consts(m_applyFog.m_prog);
-	const auto& volSize = m_r->getVolumetricFog().getVolumeSize();
-	consts.add("VOLUMETRIC_SIZE", UVec3(volSize[0], volSize[1], volSize[2]));
+	consts.add("FOG_LAST_CLASTER", U32(m_r->getVolumetricFog().getFinalClusterInZ()));
 
 	const ShaderProgramResourceVariant* variant;
 	m_applyFog.m_prog->getOrCreateVariant(consts.get(), variant);
@@ -214,6 +213,9 @@ void LightShading::populateRenderGraph(RenderingContext& ctx)
 	pass.newDependency({m_r->getIndirect().getReflectionRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newDependency({m_r->getIndirect().getIrradianceRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 
+	// Fog
+	pass.newDependency({m_r->getVolumetricFog().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+
 	// For forward shading
 	m_r->getForwardShading().setDependencies(ctx, pass);
 }

+ 3 - 3
src/anki/renderer/Renderer.cpp

@@ -129,15 +129,15 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_shadowMapping.reset(m_alloc.newInstance<ShadowMapping>(this));
 	ANKI_CHECK(m_shadowMapping->init(config));
 
+	m_volFog.reset(m_alloc.newInstance<VolumetricFog>(this));
+	ANKI_CHECK(m_volFog->init(config));
+
 	m_lightShading.reset(m_alloc.newInstance<LightShading>(this));
 	ANKI_CHECK(m_lightShading->init(config));
 
 	m_depth.reset(m_alloc.newInstance<DepthDownscale>(this));
 	ANKI_CHECK(m_depth->init(config));
 
-	m_volFog.reset(m_alloc.newInstance<VolumetricFog>(this));
-	ANKI_CHECK(m_volFog->init(config));
-
 	m_forwardShading.reset(m_alloc.newInstance<ForwardShading>(this));
 	ANKI_CHECK(m_forwardShading->init(config));
 

+ 4 - 3
src/anki/renderer/VolumetricFog.cpp

@@ -45,8 +45,8 @@ Error VolumetricFog::init(const ConfigSet& config)
 	m_grProg = variant->getProgram();
 
 	// RT descr
-	m_rtDescr = m_r->create2DRenderTargetDescription(
-		m_volumeSize[0], m_volumeSize[1], LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "Fog");
+	m_rtDescr =
+		m_r->create2DRenderTargetDescription(m_volumeSize[0], m_volumeSize[1], Format::R16G16B16A16_SFLOAT, "Fog");
 	m_rtDescr.m_depth = m_volumeSize[2];
 	m_rtDescr.m_type = TextureType::_3D;
 	m_rtDescr.bake();
@@ -63,7 +63,8 @@ void VolumetricFog::run(RenderPassWorkContext& rgraphCtx)
 
 	rgraphCtx.bindImage(0, 0, m_runCtx.m_rt, TextureSubresourceInfo());
 
-	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getVolumetricFog().getRt(), m_r->getLinearSampler());
+	rgraphCtx.bindColorTextureAndSampler(
+		0, 0, m_r->getVolumetricLightingAccumulation().getRt(), m_r->getLinearSampler());
 
 	struct PushConsts
 	{

+ 24 - 3
src/anki/renderer/VolumetricFog.h

@@ -22,6 +22,21 @@ public:
 		m_fogDiffuseColor = col;
 	}
 
+	const Vec3& getFogParticleColor() const
+	{
+		return m_fogDiffuseColor;
+	}
+
+	void setParticleDensity(F32 d)
+	{
+		m_fogDensity = d;
+	}
+
+	F32 getParticleDensity() const
+	{
+		return m_fogDensity;
+	}
+
 anki_internal:
 	VolumetricFog(Renderer* r)
 		: RendererObject(r)
@@ -47,6 +62,12 @@ anki_internal:
 		return m_volumeSize;
 	}
 
+	/// Get the last cluster split in Z axis that will be affected by lighting.
+	U32 getFinalClusterInZ() const
+	{
+		return m_finalClusterZ;
+	}
+
 private:
 	ShaderProgramResourcePtr m_prog;
 	ShaderProgramPtr m_grProg;
@@ -59,9 +80,9 @@ private:
 	Array<U32, 3> m_volumeSize;
 
 	Vec3 m_fogDiffuseColor = Vec3(1.0f);
-	F32 m_fogDensity = 0.01f;
-	F32 m_fogScatteringCoeff = 0.1f;
-	F32 m_fogAbsorptionCoeff = 0.2f;
+	F32 m_fogDensity = 0.9f;
+	F32 m_fogScatteringCoeff = 0.01f;
+	F32 m_fogAbsorptionCoeff = 0.02f;
 
 	class
 	{

+ 2 - 2
src/anki/scene/components/SceneComponent.cpp

@@ -11,10 +11,10 @@ namespace anki
 {
 
 SceneComponent::SceneComponent(SceneComponentType type, SceneNode* node)
-	: m_type(type)
-	, m_node(node)
+	: m_node(node)
 	, m_uuid(node->getSceneGraph().getNewUuid())
 	, m_idx(node->getComponentCount())
+	, m_type(type)
 {
 }