diff options
author | Martijn Versteegh <Baardaap> | 2022-01-17 20:00:35 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2022-01-17 21:36:13 +0300 |
commit | 449db0ab1e34976f3936310b846ab38cc2d6467d (patch) | |
tree | a0eb26c834c1a6b89e5461d219c042abde200b5f /source/blender/render/intern/multires_bake.c | |
parent | 8af22719d0c98e24104d01089ecb0cff840df7e8 (diff) |
Baking: new method to generate margin, based on adjacent faces
This significantly reduces discontinuities on UV seams, by giving a better
match of the texture filtered colors on both sides of the seam. It works by
using pixels from adjacent faces across the UV seam.
This new option is called "Adjacent Faces" and is the default. The old option
is called "Extend", and extends border pixels outwards.
Differential Revision: https://developer.blender.org/D13303
Diffstat (limited to 'source/blender/render/intern/multires_bake.c')
-rw-r--r-- | source/blender/render/intern/multires_bake.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/source/blender/render/intern/multires_bake.c b/source/blender/render/intern/multires_bake.c index d3e7dca2035..5cf328a3a73 100644 --- a/source/blender/render/intern/multires_bake.c +++ b/source/blender/render/intern/multires_bake.c @@ -47,6 +47,7 @@ #include "RE_multires_bake.h" #include "RE_pipeline.h" #include "RE_texture.h" +#include "RE_texture_margin.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -1296,14 +1297,23 @@ static void apply_ao_callback(DerivedMesh *lores_dm, /* ******$***************** Post processing ************************* */ -static void bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter) +static void bake_ibuf_filter( + ImBuf *ibuf, char *mask, const int margin, const char margin_type, DerivedMesh *dm) { /* must check before filtering */ const bool is_new_alpha = (ibuf->planes != R_IMF_PLANES_RGBA) && BKE_imbuf_alpha_test(ibuf); - /* Margin */ - if (filter) { - IMB_filter_extend(ibuf, mask, filter); + if (margin) { + switch (margin_type) { + case R_BAKE_ADJACENT_FACES: + RE_generate_texturemargin_adjacentfaces_dm(ibuf, mask, margin, dm); + break; + default: + /* fall through */ + case R_BAKE_EXTEND: + IMB_filter_extend(ibuf, mask, margin); + break; + } } /* if the bake results in new alpha then change the image setting */ @@ -1311,7 +1321,7 @@ static void bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter) ibuf->planes = R_IMF_PLANES_RGBA; } else { - if (filter && ibuf->planes != R_IMF_PLANES_RGBA) { + if (margin && ibuf->planes != R_IMF_PLANES_RGBA) { /* clear alpha added by filtering */ IMB_rectfill_alpha(ibuf, 1.0f); } @@ -1460,7 +1470,8 @@ static void finish_images(MultiresBakeRender *bkr, MultiresBakeResult *result) result->height_max); } - bake_ibuf_filter(ibuf, userdata->mask_buffer, bkr->bake_filter); + bake_ibuf_filter( + ibuf, userdata->mask_buffer, bkr->bake_margin, bkr->bake_margin_type, bkr->lores_dm); ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID; BKE_image_mark_dirty(ima, ibuf); |