[Bf-blender-cvs] [05fafb05b19] blender-v2.83-release: Fix T76510: Eevee OpenVDB render artifacts due to texture clamping

Brecht Van Lommel noreply at git.blender.org
Thu May 7 22:05:56 CEST 2020


Commit: 05fafb05b199729916f10504336747a504cf8563
Author: Brecht Van Lommel
Date:   Thu May 7 22:01:26 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB05fafb05b199729916f10504336747a504cf8563

Fix T76510: Eevee OpenVDB render artifacts due to texture clamping

===================================================================

M	source/blender/blenkernel/intern/studiolight.c
M	source/blender/draw/intern/draw_cache_impl_volume.c
M	source/blender/draw/intern/draw_manager_texture.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.c

===================================================================

diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c
index 5cb4703bc46..aef274f7d91 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -505,7 +505,7 @@ static void studiolight_create_equirect_radiance_gputexture(StudioLight *sl)
     GPUTexture *tex = sl->equirect_radiance_gputexture;
     GPU_texture_bind(tex, 0);
     GPU_texture_filter_mode(tex, true);
-    GPU_texture_wrap_mode(tex, true);
+    GPU_texture_wrap_mode(tex, true, true);
     GPU_texture_unbind(tex);
   }
   sl->flag |= STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE;
@@ -569,7 +569,7 @@ static void studiolight_create_equirect_irradiance_gputexture(StudioLight *sl)
     GPUTexture *tex = sl->equirect_irradiance_gputexture;
     GPU_texture_bind(tex, 0);
     GPU_texture_filter_mode(tex, true);
-    GPU_texture_wrap_mode(tex, true);
+    GPU_texture_wrap_mode(tex, true, true);
     GPU_texture_unbind(tex);
   }
   sl->flag |= STUDIOLIGHT_EQUIRECT_IRRADIANCE_GPUTEXTURE;
diff --git a/source/blender/draw/intern/draw_cache_impl_volume.c b/source/blender/draw/intern/draw_cache_impl_volume.c
index a7562b1b8ea..9c2c075ab4f 100644
--- a/source/blender/draw/intern/draw_cache_impl_volume.c
+++ b/source/blender/draw/intern/draw_cache_impl_volume.c
@@ -267,6 +267,7 @@ static DRWVolumeGrid *volume_grid_cache_get(Volume *volume,
 
     GPU_texture_bind(cache_grid->texture, 0);
     GPU_texture_swizzle_channel_auto(cache_grid->texture, channels);
+    GPU_texture_wrap_mode(cache_grid->texture, false, false);
     GPU_texture_unbind(cache_grid->texture);
 
     MEM_freeN(voxels);
diff --git a/source/blender/draw/intern/draw_manager_texture.c b/source/blender/draw/intern/draw_manager_texture.c
index 3f11fe9d11e..810a2e9389b 100644
--- a/source/blender/draw/intern/draw_manager_texture.c
+++ b/source/blender/draw/intern/draw_manager_texture.c
@@ -69,7 +69,7 @@ void drw_texture_set_parameters(GPUTexture *tex, DRWTextureFlag flags)
   else {
     GPU_texture_filter_mode(tex, flags & DRW_TEX_FILTER);
   }
-  GPU_texture_wrap_mode(tex, flags & DRW_TEX_WRAP);
+  GPU_texture_wrap_mode(tex, flags & DRW_TEX_WRAP, true);
   GPU_texture_compare_mode(tex, flags & DRW_TEX_COMPARE);
   GPU_texture_unbind(tex);
 }
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index d6e5866ae28..3d99a3c8a56 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -245,7 +245,7 @@ void GPU_texture_generate_mipmap(GPUTexture *tex);
 void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare);
 void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter);
 void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter);
-void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat);
+void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat, bool use_clamp);
 void GPU_texture_filters(GPUTexture *tex,
                          eGPUFilterFunction min_filter,
                          eGPUFilterFunction mag_filter);
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index 686a20d05a8..fd01ddf8597 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -1856,11 +1856,11 @@ void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter)
   glTexParameteri(tex->target_base, GL_TEXTURE_MAG_FILTER, filter);
 }
 
-void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat)
+void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat, bool use_clamp)
 {
   WARN_NOT_BOUND(tex);
 
-  GLenum repeat = (use_repeat) ? GL_REPEAT : GL_CLAMP_TO_EDGE;
+  GLenum repeat = (use_repeat) ? GL_REPEAT : (use_clamp) ? GL_CLAMP_TO_EDGE : GL_CLAMP_TO_BORDER;
 
   glActiveTexture(GL_TEXTURE0 + tex->number);
   glTexParameteri(tex->target_base, GL_TEXTURE_WRAP_S, repeat);
@@ -1870,6 +1870,11 @@ void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat)
   if (tex->target_base == GL_TEXTURE_3D) {
     glTexParameteri(tex->target_base, GL_TEXTURE_WRAP_R, repeat);
   }
+
+  if (repeat == GL_CLAMP_TO_BORDER) {
+    const float black[] = {0.0f, 0.0f, 0.0f, 0.0f};
+    glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, black);
+  }
 }
 
 void GPU_texture_swizzle_channel_auto(GPUTexture *tex, int channels)



More information about the Bf-blender-cvs mailing list