From ca6732a18a9f3a869364a1f82c216d7530080b97 Mon Sep 17 00:00:00 2001 From: PMunkes Date: Sun, 28 Mar 2021 17:11:11 +0200 Subject: [PATCH] Update scatter.glsl to fix issue with textures (#37) * Update scatter.glsl to fix texture issues on RDNA2 This change fixes GPSnoopy#36 without any visual impact. The problem resulted from non-specified nonuniform texture indices. As the compiler is allowed to assume uniformity in certain variables, unless specified, this was a bug. https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_nonuniform_qualifier.txt * Update Scatter.glsl to include extensions * Remove extraneous #version * Update Scatter.glsl to fix a corner case --- assets/shaders/Scatter.glsl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/assets/shaders/Scatter.glsl b/assets/shaders/Scatter.glsl index f20b33ba..d597be35 100644 --- a/assets/shaders/Scatter.glsl +++ b/assets/shaders/Scatter.glsl @@ -1,3 +1,6 @@ +#extension GL_EXT_nonuniform_qualifier : require +#extension GL_GOOGLE_include_directive : require +#extension GL_EXT_ray_tracing : require #include "Random.glsl" #include "RayPayload.glsl" @@ -13,7 +16,7 @@ float Schlick(const float cosine, const float refractionIndex) RayPayload ScatterLambertian(const Material m, const vec3 direction, const vec3 normal, const vec2 texCoord, const float t, inout uint seed) { const bool isScattered = dot(direction, normal) < 0; - const vec4 texColor = m.DiffuseTextureId >= 0 ? texture(TextureSamplers[m.DiffuseTextureId], texCoord) : vec4(1); + const vec4 texColor = m.DiffuseTextureId >= 0 ? texture(TextureSamplers[nonuniformEXT(m.DiffuseTextureId)], texCoord) : vec4(1); const vec4 colorAndDistance = vec4(m.Diffuse.rgb * texColor.rgb, t); const vec4 scatter = vec4(normal + RandomInUnitSphere(seed), isScattered ? 1 : 0); @@ -26,8 +29,8 @@ RayPayload ScatterMetallic(const Material m, const vec3 direction, const vec3 no const vec3 reflected = reflect(direction, normal); const bool isScattered = dot(reflected, normal) > 0; - const vec4 texColor = m.DiffuseTextureId >= 0 ? texture(TextureSamplers[m.DiffuseTextureId], texCoord) : vec4(1); - const vec4 colorAndDistance = isScattered ? vec4(m.Diffuse.rgb * texColor.rgb, t) : vec4(1, 1, 1, -1); + const vec4 texColor = m.DiffuseTextureId >= 0 ? texture(TextureSamplers[nonuniformEXT(m.DiffuseTextureId)], texCoord) : vec4(1); + const vec4 colorAndDistance = vec4(m.Diffuse.rgb * texColor.rgb, t); const vec4 scatter = vec4(reflected + m.Fuzziness*RandomInUnitSphere(seed), isScattered ? 1 : 0); return RayPayload(colorAndDistance, scatter, seed); @@ -44,7 +47,7 @@ RayPayload ScatterDieletric(const Material m, const vec3 direction, const vec3 n const vec3 refracted = refract(direction, outwardNormal, niOverNt); const float reflectProb = refracted != vec3(0) ? Schlick(cosine, m.RefractionIndex) : 1; - const vec4 texColor = m.DiffuseTextureId >= 0 ? texture(TextureSamplers[m.DiffuseTextureId], texCoord) : vec4(1); + const vec4 texColor = m.DiffuseTextureId >= 0 ? texture(TextureSamplers[nonuniformEXT(m.DiffuseTextureId)], texCoord) : vec4(1); return RandomFloat(seed) < reflectProb ? RayPayload(vec4(texColor.rgb, t), vec4(reflect(direction, normal), 1), seed)