From a831fdb02757b8a882f1fb22321de35e9e8ed01f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 26 Feb 2024 16:21:04 +0100 Subject: [PATCH] Move monte carlo math functions to its own file --- .../static/shaders/lightmap/montecarlo.glsl | 30 +++++++++++++++++++ .../lightmap/trace_ambient_occlusion.glsl | 18 +---------- .../static/shaders/lightmap/trace_light.glsl | 18 ++--------- .../shaders/lightmap/trace_sunlight.glsl | 3 +- 4 files changed, 35 insertions(+), 34 deletions(-) create mode 100644 wadsrc/static/shaders/lightmap/montecarlo.glsl diff --git a/wadsrc/static/shaders/lightmap/montecarlo.glsl b/wadsrc/static/shaders/lightmap/montecarlo.glsl new file mode 100644 index 000000000..9a84d0af9 --- /dev/null +++ b/wadsrc/static/shaders/lightmap/montecarlo.glsl @@ -0,0 +1,30 @@ + +float RadicalInverse_VdC(uint bits) +{ + bits = (bits << 16u) | (bits >> 16u); + bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); + bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); + bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); + bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); + return float(bits) * 2.3283064365386963e-10f; // / 0x100000000 +} + +vec2 Hammersley(uint i, uint N) +{ + return vec2(float(i) / float(N), RadicalInverse_VdC(i)); +} + +vec2 getVogelDiskSample(int sampleIndex, int sampleCount, float phi) +{ + const float goldenAngle = radians(180.0) * (3.0 - sqrt(5.0)); + float sampleIndexF = float(sampleIndex); + float sampleCountF = float(sampleCount); + + float r = sqrt((sampleIndexF + 0.5) / sampleCountF); // Assuming index and count are positive + float theta = sampleIndexF * goldenAngle + phi; + + float sine = sin(theta); + float cosine = cos(theta); + + return vec2(cosine, sine) * r; +} diff --git a/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl b/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl index 154b4036a..76e64aab2 100644 --- a/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl +++ b/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl @@ -1,6 +1,5 @@ -vec2 Hammersley(uint i, uint N); -float RadicalInverse_VdC(uint bits); +#include float TraceAORay(vec3 origin, float tmin, vec3 dir, float tmax); @@ -58,18 +57,3 @@ float TraceAORay(vec3 origin, float tmin, vec3 dir, float tmax) } return tmax; } - -vec2 Hammersley(uint i, uint N) -{ - return vec2(float(i) / float(N), RadicalInverse_VdC(i)); -} - -float RadicalInverse_VdC(uint bits) -{ - bits = (bits << 16u) | (bits >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - return float(bits) * 2.3283064365386963e-10f; // / 0x100000000 -} diff --git a/wadsrc/static/shaders/lightmap/trace_light.glsl b/wadsrc/static/shaders/lightmap/trace_light.glsl index e4323970b..6ab51fc01 100644 --- a/wadsrc/static/shaders/lightmap/trace_light.glsl +++ b/wadsrc/static/shaders/lightmap/trace_light.glsl @@ -1,6 +1,7 @@ +#include + vec4 TracePointLightRay(vec3 origin, vec3 lightpos, float tmin, vec4 rayColor); -vec2 getVogelDiskSample(int sampleIndex, int sampleCount, float phi); vec3 TraceLight(vec3 origin, vec3 normal, LightInfo light, int surfaceIndex) { @@ -86,18 +87,3 @@ vec4 TracePointLightRay(vec3 origin, vec3 lightpos, float tmin, vec4 rayColor) } return vec4(0.0); } - -vec2 getVogelDiskSample(int sampleIndex, int sampleCount, float phi) -{ - const float goldenAngle = radians(180.0) * (3.0 - sqrt(5.0)); - float sampleIndexF = float(sampleIndex); - float sampleCountF = float(sampleCount); - - float r = sqrt((sampleIndexF + 0.5) / sampleCountF); // Assuming index and count are positive - float theta = sampleIndexF * goldenAngle + phi; - - float sine = sin(theta); - float cosine = cos(theta); - - return vec2(cosine, sine) * r; -} diff --git a/wadsrc/static/shaders/lightmap/trace_sunlight.glsl b/wadsrc/static/shaders/lightmap/trace_sunlight.glsl index 44bfaf636..01fed131c 100644 --- a/wadsrc/static/shaders/lightmap/trace_sunlight.glsl +++ b/wadsrc/static/shaders/lightmap/trace_sunlight.glsl @@ -1,5 +1,6 @@ -vec2 getVogelDiskSample(int sampleIndex, int sampleCount, float phi); +#include + vec4 TraceSunRay(vec3 origin, float tmin, vec3 dir, float tmax, vec4 rayColor); vec3 TraceSunLight(vec3 origin, vec3 normal, int surfaceIndex)