Panagiotis Christopoulos Charitos 4 лет назад
Родитель
Сommit
9ee005025f

+ 0 - 2
AnKi/Renderer/TemporalAA.cpp

@@ -48,7 +48,6 @@ Error TemporalAA::initInternal(const ConfigSet& config)
 									UVec2(m_r->getInternalResolution().x(), m_r->getInternalResolution().y()));
 		variantInitInfo.addMutation("SHARPEN", i + 1);
 		variantInitInfo.addMutation("VARIANCE_CLIPPING", 1);
-		variantInitInfo.addMutation("TONEMAP_FIX", 1);
 		variantInitInfo.addMutation("YCBCR", 0);
 
 		const ShaderProgramResourceVariant* variant;
@@ -84,7 +83,6 @@ void TemporalAA::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphC
 	rgraphCtx.bindColorTexture(0, 3, m_runCtx.m_historyRt);
 	rgraphCtx.bindColorTexture(0, 4, m_r->getMotionVectors().getMotionVectorsRt());
 	rgraphCtx.bindImage(0, 5, m_runCtx.m_renderRt, TextureSubresourceInfo());
-	rgraphCtx.bindUniformBuffer(0, 6, m_r->getTonemapping().getAverageLuminanceBuffer());
 
 	dispatchPPCompute(cmdb, 8, 8, m_r->getInternalResolution().x(), m_r->getInternalResolution().y());
 }

+ 1 - 1
AnKi/Shaders/ApplyIrradianceToReflection.ankiprog

@@ -4,7 +4,7 @@
 // http://www.anki3d.org/LICENSE
 
 #pragma anki start comp
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/LightFunctions.glsl>
 
 layout(local_size_x = 8, local_size_y = 8, local_size_z = 6) in;

+ 0 - 23
AnKi/Shaders/Blit.ankiprog

@@ -1,23 +0,0 @@
-// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki start vert
-#include <AnKi/Shaders/QuadVert.glsl>
-#pragma anki end
-
-#pragma anki start frag
-#include <AnKi/Shaders/Common.glsl>
-
-layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
-layout(set = 0, binding = 1) uniform texture2D u_tex;
-
-layout(location = 0) in Vec2 in_uv;
-layout(location = 0) out Vec3 out_col;
-
-void main()
-{
-	out_col = textureLod(u_tex, u_linearAnyClampSampler, in_uv, 0.0).rgb;
-}
-#pragma anki end

+ 52 - 0
AnKi/Shaders/Blit.glsl

@@ -0,0 +1,52 @@
+// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include <AnKi/Shaders/Functions.glsl>
+
+layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
+layout(set = 0, binding = 1) uniform texture2D u_tex;
+
+#if defined(ANKI_COMPUTE_SHADER)
+#	define USE_COMPUTE 1
+#else
+#	define USE_COMPUTE 0
+#endif
+
+#if USE_COMPUTE
+layout(set = 0, binding = 2) uniform writeonly image2D u_outImage;
+
+layout(push_constant, std140) uniform b_pc
+{
+	Vec2 u_viewportSize;
+	UVec2 u_viewportSizeU;
+};
+
+layout(local_size_x = 8, local_size_y = 8) in;
+#else
+layout(location = 0) in Vec2 in_uv;
+layout(location = 0) out Vec3 out_col;
+#endif
+
+void main()
+{
+#if USE_COMPUTE
+	if(skipOutOfBoundsInvocations(UVec2(8u), u_viewportSizeU))
+	{
+		return;
+	}
+
+	const Vec2 uv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(u_viewportSize);
+#else
+	const Vec2 uv = in_uv;
+#endif
+
+	const Vec3 color = textureLod(u_tex, u_linearAnyClampSampler, uv, 0.0).rgb;
+
+#if USE_COMPUTE
+	imageStore(u_outImage, IVec2(gl_GlobalInvocationID.xy), Vec4(color, 0.0));
+#else
+	out_col = color;
+#endif
+}

+ 8 - 0
AnKi/Shaders/BlitCompute.ankiprog

@@ -0,0 +1,8 @@
+// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma anki start comp
+#include <AnKi/Shaders/Blit.glsl>
+#pragma anki end

+ 12 - 0
AnKi/Shaders/BlitGraphics.ankiprog

@@ -0,0 +1,12 @@
+// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma anki start vert
+#include <AnKi/Shaders/QuadVert.glsl>
+#pragma anki end
+
+#pragma anki start frag
+#include <AnKi/Shaders/Blit.glsl>
+#pragma anki end

+ 1 - 1
AnKi/Shaders/Bloom.ankiprog

@@ -8,7 +8,7 @@ const UVec2 WORKGROUP_SIZE = UVec2(16, 16);
 
 #pragma anki start comp
 #include <AnKi/Shaders/Common.glsl>
-#include <AnKi/Shaders/Tonemapping.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 
 layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
 

+ 1 - 1
AnKi/Shaders/FinalComposite.ankiprog

@@ -17,7 +17,7 @@ ANKI_SPECIALIZATION_CONSTANT_U32(MOTION_BLUR_SAMPLES, 3u);
 
 #pragma anki start frag
 #include <AnKi/Shaders/Common.glsl>
-#include <AnKi/Shaders/Tonemapping.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/MotionBlur.glsl>
 

+ 1 - 1
AnKi/Shaders/GBufferCommon.glsl

@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/Include/ModelTypes.h>
 
 //

+ 1 - 1
AnKi/Shaders/GBufferGpuParticles.ankiprog

@@ -62,7 +62,7 @@ void main()
 
 #pragma anki start frag
 #define MAX_EMISSION 1024.0
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 
 layout(location = 0) out Vec4 out_gbuffer0;
 layout(location = 1) out Vec4 out_gbuffer1;

+ 1 - 1
AnKi/Shaders/GBufferPost.ankiprog

@@ -12,7 +12,7 @@ ANKI_SPECIALIZATION_CONSTANT_U32(TILE_SIZE, 3u);
 #pragma anki end
 
 #pragma anki start frag
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 
 layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;

+ 1 - 1
AnKi/Shaders/IrradianceDice.ankiprog

@@ -13,7 +13,7 @@
 #pragma anki start comp
 
 #include <AnKi/Shaders/Functions.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/LightFunctions.glsl>
 
 #define DEBUG_MODE 0 // 0: disable, 1: different color per dice face, 2: different color per cell

+ 1 - 1
AnKi/Shaders/LightFunctions.glsl

@@ -9,7 +9,7 @@
 
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/CollisionFunctions.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
 #include <AnKi/Shaders/Include/Evsm.h>
 

+ 1 - 1
AnKi/Shaders/LightShading.ankiprog

@@ -15,7 +15,7 @@ ANKI_SPECIALIZATION_CONSTANT_U32(IR_MIPMAP_COUNT, 4u);
 #pragma anki end
 
 #pragma anki start frag
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 

+ 1 - 1
AnKi/Shaders/LumaAwareBlur.ankiprog

@@ -15,7 +15,7 @@ ANKI_SPECIALIZATION_CONSTANT_UVEC2(TEXTURE_SIZE, 0u);
 
 #pragma anki start frag
 #include <AnKi/Shaders/GaussianBlurCommon.glsl>
-#include <AnKi/Shaders/Tonemapping.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 
 layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
 layout(set = 0, binding = 1) uniform texture2D u_tex;

+ 0 - 0
AnKi/Shaders/Pack.glsl → AnKi/Shaders/PackFunctions.glsl


+ 1 - 1
AnKi/Shaders/RtShadows.glsl

@@ -6,7 +6,7 @@
 #pragma once
 
 #include <AnKi/Shaders/Include/RtShadows.h>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 
 const F32 RT_SHADOWS_MAX_HISTORY_LENGTH = 31.0;
 

+ 1 - 1
AnKi/Shaders/RtShadowsDenoise.ankiprog

@@ -12,7 +12,7 @@ ANKI_SPECIALIZATION_CONSTANT_U32(MIN_SAMPLE_COUNT, 2u);
 ANKI_SPECIALIZATION_CONSTANT_U32(MAX_SAMPLE_COUNT, 3u);
 
 #include <AnKi/Shaders/BilateralFilter.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 

+ 1 - 1
AnKi/Shaders/RtShadowsRayGen.ankiprog

@@ -10,7 +10,7 @@
 #pragma anki start rgen
 
 #include <AnKi/Shaders/ImportanceSampling.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 
 #define CLUSTERED_SHADING_SET 0

+ 1 - 1
AnKi/Shaders/Ssao.glsl

@@ -18,7 +18,7 @@ ANKI_SPECIALIZATION_CONSTANT_U32(SAMPLE_COUNT, 6u);
 #pragma once
 
 #include <AnKi/Shaders/Common.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 #define KERNEL_SIZE 3
 #include <AnKi/Shaders/GaussianBlurCommon.glsl>

+ 1 - 1
AnKi/Shaders/Ssgi.ankiprog

@@ -14,7 +14,7 @@
 #pragma anki start comp
 #include <AnKi/Shaders/SsRaymarching.glsl>
 #include <AnKi/Shaders/Functions.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/ImportanceSampling.glsl>
 #include <AnKi/Shaders/Include/SsgiTypes.h>
 

+ 1 - 1
AnKi/Shaders/SsgiDenoise.ankiprog

@@ -12,7 +12,7 @@ ANKI_SPECIALIZATION_CONSTANT_UVEC2(IN_TEXTURE_SIZE, 0u);
 #pragma anki start comp
 
 #include <AnKi/Shaders/BilateralFilter.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 
 #if SAMPLE_COUNT < 3
 #	error See file

+ 2 - 2
AnKi/Shaders/Ssr.ankiprog

@@ -14,9 +14,9 @@
 
 #pragma anki start comp
 #include <AnKi/Shaders/Functions.glsl>
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/Include/SsrTypes.h>
-#include <AnKi/Shaders/Tonemapping.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 #include <AnKi/Shaders/SsRaymarching.glsl>
 
 const UVec2 WORKGROUP_SIZE = UVec2(16, 16);

+ 9 - 25
AnKi/Shaders/TemporalAAResolve.ankiprog

@@ -5,7 +5,6 @@
 
 #pragma anki mutator SHARPEN 0 1 2 // 0: disabled, 1: vertical, 2: horizontal
 #pragma anki mutator VARIANCE_CLIPPING 0 1
-#pragma anki mutator TONEMAP_FIX 0 1
 #pragma anki mutator YCBCR 0 1
 
 ANKI_SPECIALIZATION_CONSTANT_F32(VARIANCE_CLIPPING_GAMMA, 0u);
@@ -14,8 +13,8 @@ ANKI_SPECIALIZATION_CONSTANT_UVEC2(FB_SIZE, 2u);
 
 #pragma anki start comp
 #include <AnKi/Shaders/Functions.glsl>
-#include <AnKi/Shaders/Pack.glsl>
-#include <AnKi/Shaders/Tonemapping.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 
 const UVec2 WORKGROUP_SIZE = UVec2(8, 8);
 layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
@@ -27,12 +26,6 @@ layout(set = 0, binding = 3) uniform texture2D u_historyRt;
 layout(set = 0, binding = 4) uniform texture2D u_motionVectorsTex;
 layout(set = 0, binding = 5) writeonly uniform image2D u_outImg;
 
-#if TONEMAP_FIX
-#	define TONEMAPPING_SET 0
-#	define TONEMAPPING_BINDING 6
-#	include <AnKi/Shaders/TonemappingResources.glsl>
-#endif
-
 #if YCBCR
 #	define sample(s, uv) rgbToYCbCr(textureLod(s, u_linearAnyClampSampler, uv, 0.0).rgb)
 #	define sampleOffset(s, uv, x, y) \
@@ -59,12 +52,9 @@ Vec3 sharpen(Vec2 uv)
 
 void main()
 {
-	if((FB_SIZE.x % WORKGROUP_SIZE.x) != 0u || (FB_SIZE.y % WORKGROUP_SIZE.y) != 0u) // This check is free
+	if(skipOutOfBoundsInvocations(WORKGROUP_SIZE, FB_SIZE))
 	{
-		if(gl_GlobalInvocationID.x >= FB_SIZE.x || gl_GlobalInvocationID.y >= FB_SIZE.y)
-		{
-			return;
-		}
+		return;
 	}
 
 	const Vec2 uv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(FB_SIZE);
@@ -108,15 +98,10 @@ void main()
 	const F32 lum0 = crntCol.r;
 	const F32 lum1 = historyCol.r;
 	const F32 maxLum = boxMax.r;
-#elif TONEMAP_FIX
-	const F32 lum0 = computeLuminance(tonemap(crntCol, u_exposureThreshold0));
-	const F32 lum1 = computeLuminance(tonemap(historyCol, u_exposureThreshold0));
-	// F32 maxLum = computeLuminance(tonemap(boxMax, u_exposureThreshold0));
-	const F32 maxLum = 1.0;
 #else
-	const F32 lum0 = computeLuminance(crntCol);
-	const F32 lum1 = computeLuminance(historyCol);
-	const F32 maxLum = computeLuminance(boxMax);
+	const F32 lum0 = computeLuminance(invertibleTonemap(crntCol));
+	const F32 lum1 = computeLuminance(invertibleTonemap(historyCol));
+	const F32 maxLum = 1.0;
 #endif
 
 	F32 diff = abs(lum0 - lum1) / max(lum0, max(lum1, maxLum + EPSILON));
@@ -125,10 +110,9 @@ void main()
 	const F32 feedback = mix(0.0, BLEND_FACTOR, diff);
 
 	// Write result
+	Vec3 outColor = mix(historyCol, crntCol, feedback);
 #if YCBCR
-	const Vec3 outColor = yCbCrToRgb(mix(historyCol, crntCol, feedback));
-#else
-	const Vec3 outColor = mix(historyCol, crntCol, feedback);
+	outColor = yCbCrToRgb(outColor);
 #endif
 	imageStore(u_outImg, IVec2(gl_GlobalInvocationID.xy), Vec4(outColor, 0.0));
 }

+ 1 - 1
AnKi/Shaders/TonemappingAverageLuminance.ankiprog

@@ -9,7 +9,7 @@ ANKI_SPECIALIZATION_CONSTANT_UVEC2(INPUT_TEX_SIZE, 0u);
 #define LOG_AVG 0
 
 #include <AnKi/Shaders/Common.glsl>
-#include <AnKi/Shaders/Tonemapping.glsl>
+#include <AnKi/Shaders/TonemappingFunctions.glsl>
 
 const UVec2 WORKGROUP_SIZE = UVec2(32u, 32u);
 layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;

+ 13 - 0
AnKi/Shaders/Tonemapping.glsl → AnKi/Shaders/TonemappingFunctions.glsl

@@ -81,3 +81,16 @@ Vec3 tonemap(Vec3 color, F32 avgLum, F32 threshold)
 	const F32 exposure = computeExposure(avgLum, threshold);
 	return tonemap(color, exposure);
 }
+
+// https://graphicrants.blogspot.com/2013/12/tone-mapping.html
+Vec3 invertibleTonemap(Vec3 colour)
+{
+	// 1 / (1 + max(rgb))
+	return colour / (1.0 + max(max(colour.r, colour.g), colour.b));
+}
+
+Vec3 invertInvertibleTonemap(Vec3 colour)
+{
+	// 1 / (1 - max(rgb))
+	return colour / (1.0 - max(max(colour.r, colour.g), colour.b));
+}

+ 1 - 1
AnKi/Shaders/TraditionalDeferredShading.ankiprog

@@ -45,7 +45,7 @@ void main()
 
 // FRAG
 #pragma anki start frag
-#include <AnKi/Shaders/Pack.glsl>
+#include <AnKi/Shaders/PackFunctions.glsl>
 #include <AnKi/Shaders/LightFunctions.glsl>
 #include <AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h>
 

+ 1 - 0
CMakeLists.txt

@@ -357,6 +357,7 @@ if(NOT MSVC)
 		"-Wunused-variable -std=c++14")
 else()
 	#add_definitions("/wd4996 /wd4244 /wd4262 /wd4267 /wd26495 /wd26439")
+	add_compile_definitions("_CRT_SECURE_NO_WARNINGS=1") # Disable some string function warnings
 endif()
 
 # Set platform specific