diff options
Diffstat (limited to 'source/blender/draw/engines/eevee')
6 files changed, 110 insertions, 97 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 32de4266c82..bea7d000181 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -137,7 +137,7 @@ void EEVEE_cache_populate(void *vedata, Object *ob) } if (DRW_object_is_renderable(ob) && - DRW_check_object_visible_within_active_context(ob)) + DRW_object_is_visible_in_active_context(ob)) { if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow); diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index a458be040fc..7319572d7eb 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -628,12 +628,12 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli) evli->radius = max_ff(0.001f, la->area_size); } else if (la->type == LA_AREA) { - evli->sizex = max_ff(0.0001f, la->area_size * scale[0] * 0.5f); + evli->sizex = max_ff(0.003f, la->area_size * scale[0] * 0.5f); if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_ELLIPSE)) { - evli->sizey = max_ff(0.0001f, la->area_sizey * scale[1] * 0.5f); + evli->sizey = max_ff(0.003f, la->area_sizey * scale[1] * 0.5f); } else { - evli->sizey = max_ff(0.0001f, la->area_size * scale[1] * 0.5f); + evli->sizey = max_ff(0.003f, la->area_size * scale[1] * 0.5f); } } else { diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 2d27bb8e705..38c2fb50f81 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1080,23 +1080,23 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } -#define ADD_SHGROUP_CALL(shgrp, ob, geom, oedata) do { \ +#define ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata) do { \ if (is_sculpt_mode_draw) { \ DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); \ } \ else { \ if (oedata) { \ - DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, EEVEE_lightprobes_obj_visibility_cb, oedata); \ + DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, ma, EEVEE_lightprobes_obj_visibility_cb, oedata); \ } \ else { \ - DRW_shgroup_call_object_add(shgrp, geom, ob); \ + DRW_shgroup_call_object_add_ex(shgrp, geom, ob, ma, false); \ } \ } \ } while (0) -#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, geom, oedata) do { \ +#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, ma, geom, oedata) do { \ if (shgrp) { \ - ADD_SHGROUP_CALL(shgrp, ob, geom, oedata); \ + ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata); \ } \ } while (0) @@ -1498,95 +1498,97 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld */ bool use_volume_material = (gpumat_array[0] && GPU_material_use_domain_volume(gpumat_array[0])); - /* Get per-material split surface */ - char *auto_layer_names; - int *auto_layer_is_srgb; - int auto_layer_count; - struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get( - ob, gpumat_array, materials_len, - &auto_layer_names, - &auto_layer_is_srgb, - &auto_layer_count); - if (mat_geom) { - for (int i = 0; i < materials_len; ++i) { - if (mat_geom[i] == NULL) { - continue; - } - EEVEE_ObjectEngineData *oedata = NULL; - Material *ma = give_current_material(ob, i + 1); - - if (ma == NULL) - ma = &defmaterial; - - /* Do not render surface if we are rendering a volume object - * and do not have a surface closure. */ - if (use_volume_material && - (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i]))) - { - continue; - } + if (ob->dt >= OB_SOLID) { + /* Get per-material split surface */ + char *auto_layer_names; + int *auto_layer_is_srgb; + int auto_layer_count; + struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get( + ob, gpumat_array, materials_len, + &auto_layer_names, + &auto_layer_is_srgb, + &auto_layer_count); + if (mat_geom) { + for (int i = 0; i < materials_len; ++i) { + if (mat_geom[i] == NULL) { + continue; + } + EEVEE_ObjectEngineData *oedata = NULL; + Material *ma = give_current_material(ob, i + 1); + + if (ma == NULL) + ma = &defmaterial; + + /* Do not render surface if we are rendering a volume object + * and do not have a surface closure. */ + if (use_volume_material && + (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i]))) + { + continue; + } - /* XXX TODO rewrite this to include the dupli objects. - * This means we cannot exclude dupli objects from reflections!!! */ - if ((ob->base_flag & BASE_FROMDUPLI) == 0) { - oedata = EEVEE_object_data_ensure(ob); - oedata->ob = ob; - oedata->test_data = &sldata->probes->vis_data; - } + /* XXX TODO rewrite this to include the dupli objects. + * This means we cannot exclude dupli objects from reflections!!! */ + if ((ob->base_flag & BASE_FROMDUPLI) == 0) { + oedata = EEVEE_object_data_ensure(ob); + oedata->ob = ob; + oedata->test_data = &sldata->probes->vis_data; + } - /* Shading pass */ - ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i], oedata); + /* Shading pass */ + ADD_SHGROUP_CALL(shgrp_array[i], ob, ma, mat_geom[i], oedata); - /* Depth Prepass */ - ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, mat_geom[i], oedata); - ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, mat_geom[i], oedata); + /* Depth Prepass */ + ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, ma, mat_geom[i], oedata); + ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, ma, mat_geom[i], oedata); - char *name = auto_layer_names; - for (int j = 0; j < auto_layer_count; ++j) { - /* TODO don't add these uniform when not needed (default pass shaders). */ - if (shgrp_array[i]) { - DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1); - } - if (shgrp_depth_array[i]) { - DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1); - } - if (shgrp_depth_clip_array[i]) { - DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1); + char *name = auto_layer_names; + for (int j = 0; j < auto_layer_count; ++j) { + /* TODO don't add these uniform when not needed (default pass shaders). */ + if (shgrp_array[i]) { + DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1); + } + if (shgrp_depth_array[i]) { + DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1); + } + if (shgrp_depth_clip_array[i]) { + DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1); + } + /* Go to next layer name. */ + while (*name != '\0') { name++; } + name += 1; } - /* Go to next layer name. */ - while (*name != '\0') { name++; } - name += 1; - } - /* Shadow Pass */ - if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) { - struct GPUMaterial *gpumat; - switch (ma->blend_shadow) { - case MA_BS_SOLID: - EEVEE_lights_cache_shcaster_add( - sldata, stl, mat_geom[i], ob); - *cast_shadow = true; - break; - case MA_BS_CLIP: - gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true); - EEVEE_lights_cache_shcaster_material_add( - sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold); - *cast_shadow = true; - break; - case MA_BS_HASHED: - gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true); - EEVEE_lights_cache_shcaster_material_add( - sldata, psl, gpumat, mat_geom[i], ob, NULL); - *cast_shadow = true; - break; - case MA_BS_NONE: - default: - break; + /* Shadow Pass */ + if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) { + struct GPUMaterial *gpumat; + switch (ma->blend_shadow) { + case MA_BS_SOLID: + EEVEE_lights_cache_shcaster_add( + sldata, stl, mat_geom[i], ob); + *cast_shadow = true; + break; + case MA_BS_CLIP: + gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true); + EEVEE_lights_cache_shcaster_material_add( + sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold); + *cast_shadow = true; + break; + case MA_BS_HASHED: + gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true); + EEVEE_lights_cache_shcaster_material_add( + sldata, psl, gpumat, mat_geom[i], ob, NULL); + *cast_shadow = true; + break; + case MA_BS_NONE: + default: + break; + } + } + else { + EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob); + *cast_shadow = true; } - } - else { - EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob); - *cast_shadow = true; } } } @@ -1617,7 +1619,7 @@ void EEVEE_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, if (!psys_check_enabled(ob, psys, false)) { continue; } - if (!DRW_check_psys_visible_within_active_context(ob, psys)) { + if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { continue; } ParticleSettings *part = psys->part; diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 80d8c066a44..e24142e3f71 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -163,7 +163,7 @@ void EEVEE_render_cache( EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow); } - if (DRW_check_object_visible_within_active_context(ob)) { + if (DRW_object_is_visible_in_active_context(ob)) { if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow); } @@ -191,6 +191,12 @@ static void eevee_render_result_combined( rect->xmin, rect->ymin, BLI_rcti_size_x(rect), BLI_rcti_size_y(rect), 4, 0, rp->rect); + + /* Premult alpha */ + int pixels_len = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect); + for (int i = 0; i < pixels_len * 4; i += 4) { + mul_v3_fl(rp->rect + i, rp->rect[i + 3]); + } } static void eevee_render_result_subsurface( @@ -543,6 +549,9 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl /* Post Process */ EEVEE_draw_effects(sldata, vedata); + /* XXX Seems to fix TDR issue with NVidia drivers on linux. */ + glFinish(); + RE_engine_update_progress(engine, (float)(render_samples++) / (float)tot_sample); } diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 256838609a6..4fffa3f285c 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -46,6 +46,7 @@ #include "eevee_private.h" #include "GPU_draw.h" #include "GPU_texture.h" +#include "GPU_material.h" static struct { char *volumetric_common_lib; @@ -471,13 +472,13 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved struct GPUMaterial *mat = EEVEE_material_mesh_volume_get(scene, ma); - DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]); - /* If shader failed to compile or is currently compiling. */ - if (grp == NULL) { + if (GPU_material_status(mat) != GPU_MAT_SUCCESS) { return; } + DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]); + /* Making sure it's updated. */ invert_m4_m4(ob->imat, ob->obmat); diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl index 5f641c5d490..36c4562e137 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl @@ -75,10 +75,11 @@ vec3 light_volume(LightData ld, vec4 l_vector) } else if (ld.l_type == SUN) { power = (4.0f * ld.l_radius * ld.l_radius * M_2PI) * (1.0 / 12.5); /* Removing area light power*/ - power *= M_2PI * 0.78; /* Matching cycles with point light. */ + power *= M_PI * 0.5; /* Matching cycles. */ } else { power = (4.0 * ld.l_radius * ld.l_radius) * (1.0 /10.0); + power *= M_2PI; /* Matching cycles with point light. */ } /* OPTI: find a better way than calculating this on the fly */ |