diff --git a/source/blender/gpu/shaders/compositor/compositor_realize_on_domain.glsl b/source/blender/gpu/shaders/compositor/compositor_realize_on_domain.glsl index b2961d07219..be984d81603 100644 --- a/source/blender/gpu/shaders/compositor/compositor_realize_on_domain.glsl +++ b/source/blender/gpu/shaders/compositor/compositor_realize_on_domain.glsl @@ -4,18 +4,22 @@ void main() { ivec2 texel = ivec2(gl_GlobalInvocationID.xy); - /* First, transform the input image by transforming the domain coordinates with the inverse of - * input image's transformation. The inverse transformation is an affine matrix and thus the + /* Add 0.5 to evaluate the input sampler at the center of the pixel. */ + vec2 coordinates = vec2(texel) + vec2(0.5); + + /* Transform the input image by transforming the domain coordinates with the inverse of input + * image's transformation. The inverse transformation is an affine matrix and thus the * coordinates should be in homogeneous coordinates. */ - vec2 coordinates = (mat3(inverse_transformation) * vec3(texel, 1.0)).xy; + coordinates = (mat3(inverse_transformation) * vec3(coordinates, 1.0)).xy; /* Since an input image with an identity transformation is supposed to be centered in the domain, * we subtract the offset between the lower left corners of the input image and the domain, which * is half the difference between their sizes, because the difference in size is on both sides of - * the centered image. */ + * the centered image. Additionally, we floor the offset to retain the 0.5 offset added above in + * case the difference in sizes was odd. */ ivec2 domain_size = imageSize(domain_img); ivec2 input_size = texture_size(input_tx); - vec2 offset = (domain_size - input_size) / 2.0; + vec2 offset = floor((domain_size - input_size) / 2.0); /* Subtract the offset and divide by the input image size to get the relevant coordinates into * the sampler's expected [0, 1] range. */