Browse Source

Convert Tonemap to HLSL

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
f667e7a6be

+ 0 - 54
AnKi/Shaders/Tonemap.glsl

@@ -1,54 +0,0 @@
-// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// Does tonemapping
-
-#include <AnKi/Shaders/Functions.glsl>
-#include <AnKi/Shaders/TonemappingFunctions.glsl>
-
-layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
-layout(set = 0, binding = 1) uniform ANKI_RP texture2D u_inputRt;
-
-const U32 kTonemappingBinding = 2u;
-#include <AnKi/Shaders/TonemappingResources.glsl>
-
-#if defined(ANKI_COMPUTE_SHADER)
-layout(set = 0, binding = 3) writeonly uniform image2D u_outImg;
-
-const UVec2 kWorkgroupSize = UVec2(8, 8);
-layout(local_size_x = kWorkgroupSize.x, local_size_y = kWorkgroupSize.y, local_size_z = 1) in;
-#else
-layout(location = 0) in Vec2 in_uv;
-layout(location = 0) out Vec3 out_color;
-#endif
-
-layout(push_constant, std140) uniform b_pc
-{
-	Vec2 u_viewportSizeOverOne;
-	UVec2 u_viewportSize;
-};
-
-void main()
-{
-#if defined(ANKI_COMPUTE_SHADER)
-	if(skipOutOfBoundsInvocations(kWorkgroupSize, u_viewportSize))
-	{
-		return;
-	}
-
-	const Vec2 uv = (Vec2(gl_GlobalInvocationID.xy) + 0.5f) * u_viewportSizeOverOne;
-#else
-	const Vec2 uv = in_uv;
-#endif
-
-	const ANKI_RP Vec3 hdr = textureLod(u_inputRt, u_nearestAnyClampSampler, uv, 0.0f).rgb;
-	const Vec3 tonemapped = linearToSRgb(tonemap(hdr, readExposureAndAverageLuminance().x));
-
-#if defined(ANKI_COMPUTE_SHADER)
-	imageStore(u_outImg, IVec2(gl_GlobalInvocationID.xy), Vec4(tonemapped, 0.0));
-#else
-	out_color = tonemapped;
-#endif
-}

+ 56 - 0
AnKi/Shaders/Tonemap.hlsl

@@ -0,0 +1,56 @@
+// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+// Does tonemapping
+
+#pragma anki hlsl
+
+#include <AnKi/Shaders/Functions.hlsl>
+#include <AnKi/Shaders/TonemappingFunctions.hlsl>
+
+[[vk::binding(0)]] SamplerState g_nearestAnyClampSampler;
+[[vk::binding(1)]] Texture2D<RVec4> g_inputRt;
+
+constexpr U32 kTonemappingBinding = 2u;
+#include <AnKi/Shaders/TonemappingResources.hlsl>
+
+#if defined(ANKI_COMPUTE_SHADER)
+[[vk::binding(3)]] RWTexture2D<RVec4> g_outUav;
+#	define THREADGROUP_SIZE_SQRT 8
+#endif
+
+struct Uniforms
+{
+	Vec2 m_viewportSizeOverOne;
+	UVec2 m_viewportSize;
+};
+
+[[vk::push_constant]] ConstantBuffer<Uniforms> g_uniforms;
+
+#if defined(ANKI_COMPUTE_SHADER)
+[numthreads(THREADGROUP_SIZE_SQRT, THREADGROUP_SIZE_SQRT, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
+#else
+RVec3 main(Vec2 uv : TEXCOORD) : SV_TARGET0
+#endif
+{
+#if defined(ANKI_COMPUTE_SHADER)
+	if(skipOutOfBoundsInvocations(UVec2(THREADGROUP_SIZE_SQRT, THREADGROUP_SIZE_SQRT), g_uniforms.m_viewportSize,
+								  svDispatchThreadId.xy))
+	{
+		return;
+	}
+
+	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5f) * g_uniforms.m_viewportSizeOverOne;
+#endif
+
+	const RVec3 hdr = g_inputRt.SampleLevel(g_nearestAnyClampSampler, uv, 0.0f).rgb;
+	const Vec3 tonemapped = linearToSRgb(tonemap(hdr, readExposureAndAverageLuminance().x));
+
+#if defined(ANKI_COMPUTE_SHADER)
+	g_outUav[svDispatchThreadId.xy] = RVec4(tonemapped, 0.0);
+#else
+	return tonemapped;
+#endif
+}

+ 1 - 1
AnKi/Shaders/TonemapCompute.ankiprog

@@ -4,5 +4,5 @@
 // http://www.anki3d.org/LICENSE
 
 #pragma anki start comp
-#include <AnKi/Shaders/Tonemap.glsl>
+#include <AnKi/Shaders/Tonemap.hlsl>
 #pragma anki end

+ 2 - 2
AnKi/Shaders/TonemapRaster.ankiprog

@@ -4,9 +4,9 @@
 // http://www.anki3d.org/LICENSE
 
 #pragma anki start vert
-#include <AnKi/Shaders/QuadVert.glsl>
+#include <AnKi/Shaders/QuadVert.hlsl>
 #pragma anki end
 
 #pragma anki start frag
-#include <AnKi/Shaders/Tonemap.glsl>
+#include <AnKi/Shaders/Tonemap.hlsl>
 #pragma anki end