From a8039d99f8a38ec9acb8bc048d38259bab574c53 Mon Sep 17 00:00:00 2001 From: Martijn Berger Date: Thu, 13 Mar 2014 20:08:10 +0100 Subject: Fix cycles texture interpolation mode closest constant offset on some devices --- intern/cycles/kernel/svm/svm_image.h | 49 +++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 18 deletions(-) (limited to 'intern/cycles/kernel/svm') diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h index 750af97150e..73c0ab1ae0b 100644 --- a/intern/cycles/kernel/svm/svm_image.h +++ b/intern/cycles/kernel/svm/svm_image.h @@ -63,30 +63,43 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, uint periodic = (info.w & 0x1); uint interpolation = info.w >> 1; + float4 r; int ix, iy, nix, niy; - float tx = svm_image_texture_frac(x*width, &ix); - float ty = svm_image_texture_frac(y*height, &iy); - - if(periodic) { - ix = svm_image_texture_wrap_periodic(ix, width); - iy = svm_image_texture_wrap_periodic(iy, height); - - nix = svm_image_texture_wrap_periodic(ix+1, width); - niy = svm_image_texture_wrap_periodic(iy+1, height); - } - else { - ix = svm_image_texture_wrap_clamp(ix, width); - iy = svm_image_texture_wrap_clamp(iy, height); + if (interpolation == INTERPOLATION_CLOSEST){ + svm_image_texture_frac(x*width, &ix); + svm_image_texture_frac(y*height, &iy); - nix = svm_image_texture_wrap_clamp(ix+1, width); - niy = svm_image_texture_wrap_clamp(iy+1, height); - } + if(periodic) { + ix = svm_image_texture_wrap_periodic(ix, width); + iy = svm_image_texture_wrap_periodic(iy, height); + } + else { + ix = svm_image_texture_wrap_clamp(ix, width); + iy = svm_image_texture_wrap_clamp(iy, height); - float4 r; - if (interpolation == INTERPOLATION_CLOSEST){ + } r = svm_image_texture_read(kg, offset + ix + iy*width); } else { /* We default to linear interpolation if it is not closest */ + float tx = svm_image_texture_frac(x*width, &ix); + float ty = svm_image_texture_frac(y*height, &iy); + + if(periodic) { + ix = svm_image_texture_wrap_periodic(ix, width); + iy = svm_image_texture_wrap_periodic(iy, height); + + nix = svm_image_texture_wrap_periodic(ix+1, width); + niy = svm_image_texture_wrap_periodic(iy+1, height); + } + else { + ix = svm_image_texture_wrap_clamp(ix, width); + iy = svm_image_texture_wrap_clamp(iy, height); + + nix = svm_image_texture_wrap_clamp(ix+1, width); + niy = svm_image_texture_wrap_clamp(iy+1, height); + } + + r = (1.0f - ty)*(1.0f - tx)*svm_image_texture_read(kg, offset + ix + iy*width); r += (1.0f - ty)*tx*svm_image_texture_read(kg, offset + nix + iy*width); r += ty*(1.0f - tx)*svm_image_texture_read(kg, offset + ix + niy*width); -- cgit v1.2.3