Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2020-05-07 23:01:26 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-05-07 23:02:39 +0300
commit05fafb05b199729916f10504336747a504cf8563 (patch)
treee7b18c0bd67d946d6245dcd15743413a25cfd159 /source/blender
parent5473f0c49dc8e6bd4708ab48bb944b7265c88ace (diff)
Fix T76510: Eevee OpenVDB render artifacts due to texture clamping
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/studiolight.c4
-rw-r--r--source/blender/draw/intern/draw_cache_impl_volume.c1
-rw-r--r--source/blender/draw/intern/draw_manager_texture.c2
-rw-r--r--source/blender/gpu/GPU_texture.h2
-rw-r--r--source/blender/gpu/intern/gpu_texture.c9
5 files changed, 12 insertions, 6 deletions
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)