diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-09-03 15:14:35 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-09-03 16:16:30 +0300 |
commit | 0bc4bc2e616bc860634bb3b4a637c3400dc5c68f (patch) | |
tree | cea67e3c4aa7523586749af4247832d6dcd23bdc /intern/cycles/kernel/kernel_compat_cpu.h | |
parent | 2c2f075929169d3b5cdc7f59e2314e35b5883681 (diff) |
Fix T45946: Cycles texture interpolation bug
Coordinate clamping was done in the wrong order.
Diffstat (limited to 'intern/cycles/kernel/kernel_compat_cpu.h')
-rw-r--r-- | intern/cycles/kernel/kernel_compat_cpu.h | 78 |
1 files changed, 29 insertions, 49 deletions
diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h index 951de884494..ed145b4a967 100644 --- a/intern/cycles/kernel/kernel_compat_cpu.h +++ b/intern/cycles/kernel/kernel_compat_cpu.h @@ -173,16 +173,11 @@ template<typename T> struct texture_image { } /* Fall through. */ case EXTENSION_EXTEND: + nix = wrap_clamp(ix+1, width); + niy = wrap_clamp(iy+1, height); + ix = wrap_clamp(ix, width); iy = wrap_clamp(iy, height); - - if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) { - nix = wrap_clamp(ix+1, width); - niy = wrap_clamp(iy+1, height); - } - else { - return read(data[ix + iy*width]); - } break; } @@ -195,8 +190,8 @@ template<typename T> struct texture_image { } else { /* Bicubic b-spline interpolation. */ - const float tx = frac(x*(float)width - 0.5f, &ix); - const float ty = frac(y*(float)height - 0.5f, &iy); + float tx = frac(x*(float)width - 0.5f, &ix); + float ty = frac(y*(float)height - 0.5f, &iy); int pix, piy, nnix, nniy; switch(extension) { case EXTENSION_REPEAT: @@ -218,22 +213,17 @@ template<typename T> struct texture_image { } /* Fall through. */ case EXTENSION_EXTEND: - ix = wrap_clamp(ix, width); - iy = wrap_clamp(iy, height); + pix = wrap_clamp(ix-1, width); + piy = wrap_clamp(iy-1, height); - if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) { - pix = wrap_clamp(ix-1, width); - piy = wrap_clamp(iy-1, height); + nix = wrap_clamp(ix+1, width); + niy = wrap_clamp(iy+1, height); - nix = wrap_clamp(ix+1, width); - niy = wrap_clamp(iy+1, height); + nnix = wrap_clamp(ix+2, width); + nniy = wrap_clamp(iy+2, height); - nnix = wrap_clamp(ix+2, width); - nniy = wrap_clamp(iy+2, height); - } - else { - return read(data[ix + iy*width]); - } + ix = wrap_clamp(ix, width); + iy = wrap_clamp(iy, height); break; } @@ -323,18 +313,13 @@ template<typename T> struct texture_image { } /* Fall through. */ case EXTENSION_EXTEND: + nix = wrap_clamp(ix+1, width); + niy = wrap_clamp(iy+1, height); + niz = wrap_clamp(iz+1, depth); + ix = wrap_clamp(ix, width); iy = wrap_clamp(iy, height); iz = wrap_clamp(iz, depth); - - if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) { - nix = wrap_clamp(ix+1, width); - niy = wrap_clamp(iy+1, height); - niz = wrap_clamp(iz+1, depth); - } - else { - return read(data[ix + iy*width + iz*width*height]); - } break; } @@ -383,26 +368,21 @@ template<typename T> struct texture_image { } /* Fall through. */ case EXTENSION_EXTEND: - ix = wrap_clamp(ix, width); - iy = wrap_clamp(iy, height); - iz = wrap_clamp(iz, depth); + pix = wrap_clamp(ix-1, width); + piy = wrap_clamp(iy-1, height); + piz = wrap_clamp(iz-1, depth); - if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) { - pix = wrap_clamp(ix-1, width); - piy = wrap_clamp(iy-1, height); - piz = wrap_clamp(iz-1, depth); + nix = wrap_clamp(ix+1, width); + niy = wrap_clamp(iy+1, height); + niz = wrap_clamp(iz+1, depth); - nix = wrap_clamp(ix+1, width); - niy = wrap_clamp(iy+1, height); - niz = wrap_clamp(iz+1, depth); + nnix = wrap_clamp(ix+2, width); + nniy = wrap_clamp(iy+2, height); + nniz = wrap_clamp(iz+2, depth); - nnix = wrap_clamp(ix+2, width); - nniy = wrap_clamp(iy+2, height); - nniz = wrap_clamp(iz+2, depth); - } - else { - return read(data[ix + iy*width + iz*width*height]); - } + ix = wrap_clamp(ix, width); + iy = wrap_clamp(iy, height); + iz = wrap_clamp(iz, depth); break; } |