Commit: f391362f8cde96fa06a64c45194c68d36639bd17
Author: Clément Foucault
Date:   Wed Mar 20 14:32:42 2019 +0100
Branches: master
https://developer.blender.org/rBf391362f8cde96fa06a64c45194c68d36639bd17

Fix T60190 Z-fighting with (Culled) Backface

Create a separate pass for backface culled objects.

===================================================================

M       source/blender/draw/engines/eevee/eevee_engine.c
M       source/blender/draw/engines/eevee/eevee_lightprobes.c
M       source/blender/draw/engines/eevee/eevee_materials.c
M       source/blender/draw/engines/eevee/eevee_private.h
M       source/blender/draw/engines/eevee/eevee_render.c
M       source/blender/draw/engines/eevee/eevee_subsurface.c

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c 
b/source/blender/draw/engines/eevee/eevee_engine.c
index 50062088dbe..49cc8e8b791 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -269,6 +269,7 @@ static void eevee_draw_background(void *vedata)
                }
                EEVEE_draw_default_passes(psl);
                DRW_draw_pass(psl->material_pass);
+               DRW_draw_pass(psl->material_pass_cull);
                EEVEE_subsurface_data_render(sldata, vedata);
                DRW_stats_group_end();
 
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c 
b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index c0dd9a81313..b0e0a986630 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -833,7 +833,9 @@ static void lightbake_render_scene_face(int face, 
EEVEE_BakeRenderData *user_dat
        DRW_draw_pass(psl->depth_pass_cull);
        DRW_draw_pass(psl->probe_background);
        DRW_draw_pass(psl->material_pass);
+       DRW_draw_pass(psl->material_pass_cull);
        DRW_draw_pass(psl->sss_pass); /* Only output standard pass */
+       DRW_draw_pass(psl->sss_pass_cull);
        EEVEE_draw_default_passes(psl);
 }
 
@@ -911,7 +913,9 @@ static void lightbake_render_scene_reflected(int layer, 
EEVEE_BakeRenderData *us
        /* Shading pass */
        EEVEE_draw_default_passes(psl);
        DRW_draw_pass(psl->material_pass);
+       DRW_draw_pass(psl->material_pass_cull);
        DRW_draw_pass(psl->sss_pass); /* Only output standard pass */
+       DRW_draw_pass(psl->sss_pass_cull);
        DRW_draw_pass(psl->refract_pass);
 
        /* Transparent */
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c 
b/source/blender/draw/engines/eevee/eevee_materials.c
index cfe493cf3e4..94f484cd4d1 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1037,7 +1037,8 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedata)
 
        {
                DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL 
| DRW_STATE_CLIP_PLANES | DRW_STATE_WIRE;
-               psl->material_pass = DRW_pass_create("Material Shader Pass", 
state);
+               psl->material_pass = DRW_pass_create("Material Pass", state);
+               psl->material_pass_cull = DRW_pass_create("Material Pass Cull", 
state | DRW_STATE_CULL_BACK);
        }
 
        {
@@ -1075,6 +1076,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedata)
                        DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | 
DRW_STATE_CLIP_PLANES |
                        DRW_STATE_WIRE | DRW_STATE_WRITE_STENCIL);
                psl->sss_pass = DRW_pass_create("Subsurface Pass", state);
+               psl->sss_pass_cull = DRW_pass_create("Subsurface Pass Cull", 
state | DRW_STATE_CULL_BACK);
                e_data.sss_count = 0;
        }
 
@@ -1230,7 +1232,8 @@ static void material_opaque(
                                *shgrp = DRW_shgroup_material_create(
                                        *gpumat,
                                        (use_ssrefract) ? psl->refract_pass :
-                                       (use_sss) ? psl->sss_pass : 
psl->material_pass);
+                                       (use_sss) ? ((do_cull) ? 
psl->sss_pass_cull : psl->sss_pass)
+                                                 : ((do_cull) ? 
psl->material_pass_cull : psl->material_pass));
 
                                add_standard_uniforms(*shgrp, sldata, vedata, 
ssr_id, &ma->refract_depth,
                                                      use_diffuse, use_glossy, 
use_refract, use_ssrefract, false);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h 
b/source/blender/draw/engines/eevee/eevee_private.h
index c9ae245c550..25902bce62d 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -253,7 +253,9 @@ typedef struct EEVEE_PassList {
        struct DRWPass *refract_depth_pass_clip_cull;
        struct DRWPass *default_pass[VAR_MAT_MAX];
        struct DRWPass *sss_pass;
+       struct DRWPass *sss_pass_cull;
        struct DRWPass *material_pass;
+       struct DRWPass *material_pass_cull;
        struct DRWPass *refract_pass;
        struct DRWPass *transparent_pass;
        struct DRWPass *background_pass;
diff --git a/source/blender/draw/engines/eevee/eevee_render.c 
b/source/blender/draw/engines/eevee/eevee_render.c
index b7b592decd0..158b008bc14 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -555,6 +555,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine 
*engine, RenderLayer *rl
                GPU_framebuffer_bind(fbl->main_fb);
                EEVEE_draw_default_passes(psl);
                DRW_draw_pass(psl->material_pass);
+               DRW_draw_pass(psl->material_pass_cull);
                EEVEE_subsurface_data_render(sldata, vedata);
                /* Effects pre-transparency */
                EEVEE_subsurface_compute(sldata, vedata);
diff --git a/source/blender/draw/engines/eevee/eevee_subsurface.c 
b/source/blender/draw/engines/eevee/eevee_subsurface.c
index 5954774b00e..8abbaa64fd2 100644
--- a/source/blender/draw/engines/eevee/eevee_subsurface.c
+++ b/source/blender/draw/engines/eevee/eevee_subsurface.c
@@ -285,6 +285,7 @@ void EEVEE_subsurface_data_render(EEVEE_ViewLayerData 
*UNUSED(sldata), EEVEE_Dat
 
                GPU_framebuffer_bind(fbl->main_fb);
                DRW_draw_pass(psl->sss_pass);
+               DRW_draw_pass(psl->sss_pass_cull);
 
                /* Restore */
                GPU_framebuffer_ensure_config(&fbl->main_fb, {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to