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:
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c8
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightcache.c12
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightprobes.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_lights.c8
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h8
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c6
-rw-r--r--source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl8
-rw-r--r--source/blender/gpu/shaders/gpu_shader_material.glsl35
8 files changed, 63 insertions, 24 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 1d173e6d3fc..e9d67b73a0d 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -244,14 +244,16 @@ static void eevee_draw_background(void *vedata)
EEVEE_lightprobes_refresh_planar(sldata, vedata);
DRW_stats_group_end();
- /* Update common buffer after probe rendering. */
- DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
-
/* Refresh shadows */
DRW_stats_group_start("Shadows");
EEVEE_draw_shadows(sldata, vedata);
DRW_stats_group_end();
+ /* Set ray type. */
+ sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
+ sldata->common_data.ray_depth = 0.0f;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+
GPU_framebuffer_bind(fbl->main_fb);
GPUFrameBufferBits clear_bits = GPU_DEPTH_BIT;
clear_bits |= (DRW_state_draw_background()) ? 0 : GPU_COLOR_BIT;
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index ccff90a9890..36425e80094 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -865,6 +865,8 @@ static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
common_data->spec_toggle = false;
common_data->prb_num_planar = 0;
common_data->prb_num_render_cube = 0;
+ common_data->ray_type = EEVEE_RAY_DIFFUSE;
+ common_data->ray_depth = lbake->bounce_curr + 1;
if (lbake->bounce_curr == 0) {
common_data->prb_num_render_grid = 0;
}
@@ -924,6 +926,8 @@ static void eevee_lightbake_render_probe_sample(void *ved, void *user_data)
common_data->spec_toggle = false;
common_data->prb_num_planar = 0;
common_data->prb_num_render_cube = 0;
+ common_data->ray_type = EEVEE_RAY_GLOSSY;
+ common_data->ray_depth = 1;
DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, eprobe->position, prb->clipsta, prb->clipend);
@@ -1172,8 +1176,16 @@ void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, EEVEE_Data
EEVEE_lightbake_cache_init(sldata, vedata, lbake.rt_color, lbake.rt_depth);
+ sldata->common_data.ray_type = EEVEE_RAY_GLOSSY;
+ sldata->common_data.ray_depth = 1;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
EEVEE_lightbake_render_world(sldata, vedata, lbake.rt_fb);
EEVEE_lightbake_filter_glossy(sldata, vedata, lbake.rt_color, lbake.store_fb, 0, 1.0f, lcache->mips_len);
+
+ sldata->common_data.ray_type = EEVEE_RAY_DIFFUSE;
+ sldata->common_data.ray_depth = 1;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+ EEVEE_lightbake_render_world(sldata, vedata, lbake.rt_fb);
EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake.rt_color, lbake.store_fb, 0, 1.0f);
/* Don't hide grids if they are already rendered. */
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index d1e798098bb..256425221f4 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -1316,6 +1316,8 @@ void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
common_data->ssr_toggle = false;
common_data->sss_toggle = false;
+ common_data->ray_type = EEVEE_RAY_GLOSSY;
+ common_data->ray_depth = 1.0f;
DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
/* Rendering happens here! */
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 5c82eadcbd1..d5badab1254 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -1182,6 +1182,11 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
int i;
DRWMatrixState saved_mats;
+ int saved_ray_type = sldata->common_data.ray_type;
+
+ /* TODO: make it optionnal if we don't draw shadows. */
+ sldata->common_data.ray_type = EEVEE_RAY_SHADOW;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
/* Precompute all shadow/view test before rendering and trashing the culling cache. */
bool cube_visible[MAX_SHADOW_CUBE];
@@ -1420,6 +1425,9 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
DRW_uniformbuffer_update(sldata->light_ubo, &linfo->light_data);
DRW_uniformbuffer_update(sldata->shadow_ubo, &linfo->shadow_data); /* Update all data at once */
+
+ sldata->common_data.ray_type = saved_ray_type;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
}
void EEVEE_lights_free(void)
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index e732bc8d40d..1c04dc81aad 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -656,8 +656,16 @@ typedef struct EEVEE_CommonUniformBuffer {
float prb_lod_planar_max; /* float */
/* Misc */
int hiz_mip_offset; /* int */
+ int ray_type; /* int */
+ float ray_depth; /* float */
} EEVEE_CommonUniformBuffer;
+/* ray_type (keep in sync with rayType) */
+#define EEVEE_RAY_CAMERA 0
+#define EEVEE_RAY_SHADOW 1
+#define EEVEE_RAY_DIFFUSE 2
+#define EEVEE_RAY_GLOSSY 3
+
/* ***************** CLIP PLANES DATA **************** */
typedef struct EEVEE_ClipPlanesUniformBuffer {
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index a2c44cbcd38..8d196ee07eb 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -527,7 +527,6 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
RE_engine_update_stats(engine, NULL, "Updating Probes");
EEVEE_lightprobes_refresh(sldata, vedata);
EEVEE_lightprobes_refresh_planar(sldata, vedata);
- DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
char info[42];
BLI_snprintf(info, sizeof(info), "Rendering %u / %u samples", render_samples + 1, tot_sample);
@@ -537,6 +536,11 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
EEVEE_lights_update(sldata, vedata);
EEVEE_draw_shadows(sldata, vedata);
+ /* Set ray type. */
+ sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
+ sldata->common_data.ray_depth = 0.0f;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+
GPU_framebuffer_bind(fbl->main_fb);
GPU_framebuffer_clear_color_depth_stencil(fbl->main_fb, clear_col, clear_depth, clear_stencil);
/* Depth prepass */
diff --git a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
index 1666d766225..d26013ce132 100644
--- a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
@@ -38,8 +38,16 @@ layout(std140) uniform common_block {
float prbLodPlanarMax;
/* Misc*/
int hizMipOffset;
+ int rayType;
+ float rayDepth;
};
+/* rayType (keep in sync with ray_type) */
+#define EEVEE_RAY_CAMERA 0
+#define EEVEE_RAY_SHADOW 1
+#define EEVEE_RAY_DIFFUSE 2
+#define EEVEE_RAY_GLOSSY 3
+
/* aoParameters */
#define aoDistance aoParameters[0].x
#define aoSamples aoParameters[0].y /* UNUSED */
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 24115dbd9c4..e729034f617 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -2896,27 +2896,22 @@ void node_light_path(
out float transparent_depth,
out float transmission_depth)
{
-#ifndef PROBE_CAPTURE
- is_camera_ray = 1.0;
- is_glossy_ray = 0.0;
- is_diffuse_ray = 0.0;
- is_reflection_ray = 0.0;
- is_transmission_ray = 0.0;
-#else
- is_camera_ray = 0.0;
- is_glossy_ray = 1.0;
- is_diffuse_ray = 1.0;
- is_reflection_ray = 1.0;
- is_transmission_ray = 1.0;
-#endif
- is_shadow_ray = 0.0;
- is_singular_ray = 0.0;
+ /* Supported. */
+ is_camera_ray = (rayType == EEVEE_RAY_CAMERA) ? 1.0 : 0.0;
+ is_shadow_ray = (rayType == EEVEE_RAY_SHADOW) ? 1.0 : 0.0;
+ is_diffuse_ray = (rayType == EEVEE_RAY_DIFFUSE) ? 1.0 : 0.0;
+ is_glossy_ray = (rayType == EEVEE_RAY_GLOSSY) ? 1.0 : 0.0;
+ /* Kind of supported. */
+ is_singular_ray = is_glossy_ray;
+ is_reflection_ray = is_glossy_ray;
+ is_transmission_ray = is_glossy_ray;
+ ray_depth = rayDepth;
+ diffuse_depth = (is_diffuse_ray == 1.0) ? rayDepth : 0.0;
+ glossy_depth = (is_glossy_ray == 1.0) ? rayDepth : 0.0;
+ transmission_depth = (is_transmission_ray == 1.0) ? glossy_depth : 0.0;
+ /* Not supported. */
ray_length = 1.0;
- ray_depth = 1.0;
- diffuse_depth = 1.0;
- glossy_depth = 1.0;
- transparent_depth = 1.0;
- transmission_depth = 1.0;
+ transparent_depth = 0.0;
}
void node_light_falloff(float strength, float tsmooth, out float quadratic, out float linear, out float constant)