From 5ab2252a6631bfa58a3ceb57f9778253a477e642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 10 Mar 2021 17:39:56 +0100 Subject: Fix T86429 EEVEE: Ambient occlusion broken on some platform This was cause by a division by 0 if the ray direction had no depth difference. Adding a small epsilon fix the issue. --- source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source/blender/draw') diff --git a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl index e2aad867901..c47a8bdc4e9 100644 --- a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl @@ -48,6 +48,11 @@ void raytrace_screenspace_ray_finalize(inout ScreenSpaceRay ray) if (len_squared(ray.direction.xy) < 0.00001) { ray.direction.xy = vec2(0.0, 0.01); } + /* Avoid divide by 0 error in line_unit_box_intersect_dist, leading to undefined behavior + * (see T86429). */ + if (ray.direction.z == 0.0) { + ray.direction.z = 0.0001; + } float ray_len_sqr = len_squared(ray.direction.xyz); /* Make ray.direction cover one pixel. */ bool is_more_vertical = abs(ray.direction.x) < abs(ray.direction.y); -- cgit v1.2.3