diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-02-25 15:12:29 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-02-25 15:18:22 +0300 |
commit | 8885fb5929f23d59141986cda6f71f9503018a40 (patch) | |
tree | 4019474608afc5ed9f875f2578c854ae2c14cf24 /source | |
parent | 7463da6c72a0fb2bc72bda53ece27670d5af2c72 (diff) |
EEVEE: Fix seams in reflection cubemap on low roughness
This was caused by the texture size not being power of 2. Thus the
padding applied to the base LOD did not match the highest mipmaps.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lookdev.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 15 |
3 files changed, 15 insertions, 4 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 92e36597d99..3201ffb10f4 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -186,7 +186,7 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) #elif defined(IRRADIANCE_HL2) int grid_res = 4; #endif - int cube_res = OCTAHEDRAL_SIZE_FROM_CUBESIZE(scene_eval->eevee.gi_cubemap_resolution); + int cube_res = octahedral_size_from_cubesize(scene_eval->eevee.gi_cubemap_resolution); int vis_res = scene_eval->eevee.gi_visibility_resolution; sldata->fallback_lightcache = EEVEE_lightcache_create( 1, 1, cube_res, vis_res, (int[3]){grid_res, grid_res, 1}); diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c index 94d61a81fcc..55a35087684 100644 --- a/source/blender/draw/engines/eevee/eevee_lookdev.c +++ b/source/blender/draw/engines/eevee/eevee_lookdev.c @@ -117,7 +117,7 @@ void EEVEE_lookdev_cache_init(EEVEE_Data *vedata, #elif defined(IRRADIANCE_HL2) int grid_res = 4; #endif - int cube_res = OCTAHEDRAL_SIZE_FROM_CUBESIZE(scene_eval->eevee.gi_cubemap_resolution); + int cube_res = octahedral_size_from_cubesize(scene_eval->eevee.gi_cubemap_resolution); int vis_res = scene_eval->eevee.gi_visibility_resolution; stl->lookdev_lightcache = EEVEE_lightcache_create( diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 7e93892ab3b..dfe3dc5a538 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -136,9 +136,20 @@ extern struct DrawEngineType draw_engine_eevee_type; ((v3d->shading.type == OB_RENDER) && \ ((v3d->shading.flag & V3D_SHADING_SCENE_WORLD_RENDER) == 0)))) -#define OCTAHEDRAL_SIZE_FROM_CUBESIZE(cube_size) \ - ((int)ceilf(sqrtf((cube_size * cube_size) * 6.0f))) #define MIN_CUBE_LOD_LEVEL 3 + +BLI_INLINE int octahedral_size_from_cubesize(int cube_size) +{ + int cube_pixel_count = SQUARE(cube_size) * 6.0f; + int octa_size = (int)ceilf(sqrtf(cube_pixel_count)); + int lod_count = log2_floor_u(octa_size) - MIN_CUBE_LOD_LEVEL; + /* Find lowest lod size and grow back to avoid having non matching mipsizes that would + * break trilinear interpolation. */ + octa_size /= 1 << lod_count; + octa_size *= 1 << lod_count; + return octa_size; +} + #define MAX_PLANAR_LOD_LEVEL 9 /* All the renderpasses that use the GPUMaterial for accumulation */ |