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/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index 1098ad6d95c..325a3c0fc11 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -855,7 +855,10 @@ void BKE_volume_eval_geometry(struct Depsgraph *depsgraph, Volume *volume) /* Flush back to original. */ if (DEG_is_active(depsgraph)) { Volume *volume_orig = (Volume *)DEG_get_original_id(&volume->id); - volume_orig->runtime.frame = volume->runtime.frame; + if (volume_orig->runtime.frame != volume->runtime.frame) { + BKE_volume_unload(volume_orig); + volume_orig->runtime.frame = volume->runtime.frame; + } } } 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)