diff --git a/servers/rendering/renderer_rd/shaders/cubemap_roughness.glsl b/servers/rendering/renderer_rd/shaders/cubemap_roughness.glsl index 28f4dc59ecf9..47ef4cdb0775 100644 --- a/servers/rendering/renderer_rd/shaders/cubemap_roughness.glsl +++ b/servers/rendering/renderer_rd/shaders/cubemap_roughness.glsl @@ -28,8 +28,10 @@ void main() { } else { vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); + float rotation = quick_hash(id.y * uint(params.face_size) + id.x); // Add some random rotation to the Hammersley sequence for (uint sampleNum = 0u; sampleNum < params.sample_count; sampleNum++) { vec2 xi = Hammersley(sampleNum, params.sample_count); + xi.x += rotation; vec3 H = ImportanceSampleGGX(xi, params.roughness, N); vec3 V = N; diff --git a/servers/rendering/renderer_rd/shaders/cubemap_roughness_inc.glsl b/servers/rendering/renderer_rd/shaders/cubemap_roughness_inc.glsl index ce0a25e12f69..d75e7086b925 100644 --- a/servers/rendering/renderer_rd/shaders/cubemap_roughness_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/cubemap_roughness_inc.glsl @@ -92,3 +92,11 @@ float radicalInverse_VdC(uint bits) { vec2 Hammersley(uint i, uint N) { return vec2(float(i) / float(N), radicalInverse_VdC(i)); } + +float quick_hash(uint x) { + const uint k = 1103515245U; + x = ((x >> 8U) ^ x) * k; + x = ((x >> 8U) ^ x) * k; + x = ((x >> 8U) ^ x) * k; + return float(x) * (1.0 / float(0xffffffffU)); +}