diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl index 699836d4f44..145a735e1d0 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl @@ -12,6 +12,11 @@ void main() vec2 coordinates = (vec2(texel) + vec2(0.5)) / output_size; vec3 transformed_coordinates = to_float3x3(homography_matrix) * vec3(coordinates, 1.0); + /* Point is at infinity and will be zero when sampled, so early exit. */ + if (transformed_coordinates.z == 0.0) { + imageStore(output_img, texel, vec4(0.0)); + return; + } vec2 projected_coordinates = transformed_coordinates.xy / transformed_coordinates.z; /* The derivatives of the projected coordinates with respect to x and y are the first and diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl index d463033417a..c38d8766ab8 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform_mask.glsl @@ -9,6 +9,11 @@ void main() vec2 coordinates = (vec2(texel) + vec2(0.5)) / vec2(imageSize(mask_img)); vec3 transformed_coordinates = to_float3x3(homography_matrix) * vec3(coordinates, 1.0); + /* Point is at infinity and will be zero when sampled, so early exit. */ + if (transformed_coordinates.z == 0.0) { + imageStore(mask_img, texel, vec4(0.0)); + return; + } vec2 projected_coordinates = transformed_coordinates.xy / transformed_coordinates.z; bool is_inside_plane = all(greaterThanEqual(projected_coordinates, vec2(0.0))) &&