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:
authorClément Foucault <foucault.clem@gmail.com>2019-03-12 17:45:44 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-03-12 18:01:23 +0300
commitaaeca5d87244bca2832b86d60457f0568acf1427 (patch)
tree1a06cfe4459de9077ba82c941eeaa712f58d593f /source/blender/draw/engines/eevee/eevee_lightprobes.c
parentccb4484ea346d640fcd583ced9137313382390ad (diff)
Eevee: Planar Ref.: Invert view matrix to remove triangle front face flip
This was the cause of some issue with normal mapping. This way is cleaner since it does not modify the state of the drawcalls and other ad-hoc solutions to fix the problems down the road. Unfortunately, it does require to fix every sampling coordinate for this texture. Fix T62215: flipped normals in reflection plane
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_lightprobes.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightprobes.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index dfd8a048276..1f46fee7398 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -654,23 +654,19 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob, EEVEE_PlanarReflectio
}
static void lightbake_planar_compute_render_matrices(
- EEVEE_PlanarReflection *eplanar, DRWMatrixState *r_matstate, const float viewmat[4][4])
+ EEVEE_PlanarReflection *eplanar, DRWMatrixState *r_matstate,
+ const float viewmat[4][4], const float winmat[4][4])
{
/* Reflect Camera Matrix. */
mul_m4_m4m4(r_matstate->viewmat, viewmat, eplanar->mtx);
- /* TODO FOV margin */
- /* Temporal sampling jitter should be already applied to the DRW_MAT_WIN. */
- DRW_viewport_matrix_get(r_matstate->winmat, DRW_MAT_WIN);
+ /* Invert X to avoid flipping the triangle facing direction. */
+ r_matstate->viewmat[0][0] = -r_matstate->viewmat[0][0];
+ r_matstate->viewmat[1][0] = -r_matstate->viewmat[1][0];
+ r_matstate->viewmat[2][0] = -r_matstate->viewmat[2][0];
+ r_matstate->viewmat[3][0] = -r_matstate->viewmat[3][0];
/* Apply Projection Matrix. */
- mul_m4_m4m4(r_matstate->persmat, r_matstate->winmat, r_matstate->viewmat);
-
- /* This is the matrix used to reconstruct texture coordinates.
- * We use the original view matrix because it does not create
- * visual artifacts if receiver is not perfectly aligned with
- * the planar reflection probe. */
- mul_m4_m4m4(eplanar->reflectionmat, r_matstate->winmat, viewmat); /* TODO FOV margin */
- /* Convert from [-1, 1] to [0, 1] (NDC to Texture coord). */
- mul_m4_m4m4(eplanar->reflectionmat, texcomat, eplanar->reflectionmat);
+ /* Temporal sampling jitter should be already applied to the DRW_MAT_WIN. */
+ mul_m4_m4m4(r_matstate->persmat, winmat, r_matstate->viewmat);
}
static void eevee_lightprobes_extract_from_cache(EEVEE_LightProbesInfo *pinfo, LightCache *lcache)
@@ -783,12 +779,13 @@ static void render_reflections(
{
DRWMatrixState matstate;
- float original_viewmat[4][4];
+ float original_viewmat[4][4], original_winmat[4][4];
DRW_viewport_matrix_get(original_viewmat, DRW_MAT_VIEW);
+ DRW_viewport_matrix_get(original_winmat, DRW_MAT_WIN);
for (int i = 0; i < ref_count; ++i) {
/* Setup custom matrices */
- lightbake_planar_compute_render_matrices(planar_data + i, &matstate, original_viewmat);
+ lightbake_planar_compute_render_matrices(planar_data + i, &matstate, original_viewmat, original_winmat);
invert_m4_m4(matstate.persinv, matstate.persmat);
invert_m4_m4(matstate.viewinv, matstate.viewmat);
invert_m4_m4(matstate.wininv, matstate.winmat);
@@ -884,9 +881,7 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us
/* Be sure that cascaded shadow maps are updated. */
EEVEE_draw_shadows(sldata, vedata);
- /* Since we are rendering with an inverted view matrix, we need
- * to invert the facing for backface culling to be the same. */
- DRW_state_invert_facing();
+
/* Compute offset plane equation (fix missing texels near reflection plane). */
copy_v4_v4(sldata->clip_data.clip_planes[0], eplanar->plane_equation);
sldata->clip_data.clip_planes[0][3] += eplanar->clipsta;
@@ -924,7 +919,6 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us
}
DRW_draw_pass(psl->transparent_pass);
- DRW_state_invert_facing();
DRW_state_clip_planes_reset();
DRW_stats_group_end();