diff options
author | Brecht Van Lommel <brecht@blender.org> | 2021-02-11 20:48:21 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2021-02-12 17:01:29 +0300 |
commit | 9febda912b04559277d465b9610334c04a73d2ce (patch) | |
tree | ed64b83783214e4605924de6fd4ab28001a132d5 /source/blender/render | |
parent | 9fa6e06287dc49f1fcf2bbfa150c0ff368668fed (diff) |
Baking: support vertex color baking of normal material, UV discontinuities
Baking vertex colors per-corner leads to unwanted discontinuities when there is
sampling noise, for example in ambient occlusion or with a bevel shader node for
normals. For this reason the code used to always average results per-vertex.
However when using split normals, multiple materials or UV islands, we do want to
preserve discontinuities. So now bake per corner, but make sure the sampling seed
is shared for vertices.
Fix T85550: vertex color baking crash with split normals, Ref D10399
Fix T84663: vertex color baking blending at UV seams
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/RE_bake.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/bake.c | 3 | ||||
-rw-r--r-- | source/blender/render/intern/engine.c | 2 |
3 files changed, 5 insertions, 1 deletions
diff --git a/source/blender/render/RE_bake.h b/source/blender/render/RE_bake.h index 3463362adb1..bb30b524b61 100644 --- a/source/blender/render/RE_bake.h +++ b/source/blender/render/RE_bake.h @@ -59,6 +59,7 @@ typedef struct BakeTargets { typedef struct BakePixel { int primitive_id, object_id; + int seed; float uv[2]; float du_dx, du_dy; float dv_dx, dv_dy; diff --git a/source/blender/render/intern/bake.c b/source/blender/render/intern/bake.c index caf81870fac..7af6d3e234f 100644 --- a/source/blender/render/intern/bake.c +++ b/source/blender/render/intern/bake.c @@ -135,6 +135,7 @@ static void store_bake_pixel(void *handle, int x, int y, float u, float v) pixel->dv_dx = bd->dv_dx; pixel->dv_dy = bd->dv_dy; pixel->object_id = 0; + pixel->seed = i; } void RE_bake_mask_fill(const BakePixel pixel_array[], const size_t num_pixels, char *mask) @@ -383,6 +384,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, pixel_high->primitive_id = primitive_id_high; pixel_high->object_id = hit_mesh; + pixel_high->seed = pixel_id; /* ray direction in high poly object space */ float dir_high[3]; @@ -434,6 +436,7 @@ static bool cast_ray_highpoly(BVHTreeFromMesh *treeData, else { pixel_array[pixel_id].primitive_id = -1; pixel_array[pixel_id].object_id = -1; + pixel_array[pixel_id].seed = 0; } MEM_freeN(hits); diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index 151d994dddf..b199b1b0743 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -194,7 +194,7 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y, primitive[1] = int_as_float(-1); } else { - primitive[0] = int_as_float(bake_pixel->object_id); + primitive[0] = int_as_float(bake_pixel->seed); primitive[1] = int_as_float(bake_pixel->primitive_id); primitive[2] = bake_pixel->uv[0]; primitive[3] = bake_pixel->uv[1]; |