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>2021-02-11 20:48:21 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-02-12 17:01:29 +0300
commit9febda912b04559277d465b9610334c04a73d2ce (patch)
treeed64b83783214e4605924de6fd4ab28001a132d5 /source/blender/render
parent9fa6e06287dc49f1fcf2bbfa150c0ff368668fed (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.h1
-rw-r--r--source/blender/render/intern/bake.c3
-rw-r--r--source/blender/render/intern/engine.c2
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];