diff options
4 files changed, 26 insertions, 6 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl index 186f438b03b..b3b9c7af19c 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl @@ -77,3 +77,13 @@ vec3 coordinate_incoming(vec3 P) { return vec3(0.0); } + +float attr_load_temperature_post(float attr) +{ + return attr; +} + +vec4 attr_load_color_post(vec4 attr) +{ + return attr; +} diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index b6b0c94f4bf..d31c98e0dee 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -93,7 +93,7 @@ void DRW_curves_free(void); /** * Add attributes bindings of volume grids to an existing shading group. * No draw call is added so the caller can decide how to use the data. - * \return nullptr if there is something to draw. + * \return nullptr if there is nothing to draw. */ struct DRWShadingGroup *DRW_shgroup_volume_create_sub(struct Scene *scene, struct Object *ob, diff --git a/source/blender/draw/intern/draw_volume.cc b/source/blender/draw/intern/draw_volume.cc index 8d9a6f486e2..c4e58ab24cb 100644 --- a/source/blender/draw/intern/draw_volume.cc +++ b/source/blender/draw/intern/draw_volume.cc @@ -129,12 +129,14 @@ static DRWShadingGroup *drw_volume_object_grids_init(Object *ob, volume_infos.temperature_bias = 0.0f; /* Bind volume grid textures. */ - int grid_id = 0; + int grid_id = 0, grids_len = 0; LISTBASE_FOREACH (GPUMaterialAttribute *, attr, attrs) { const VolumeGrid *volume_grid = BKE_volume_grid_find_for_read(volume, attr->name); const DRWVolumeGrid *drw_grid = (volume_grid) ? DRW_volume_batch_cache_get_grid(volume, volume_grid) : nullptr; + /* Count number of valid attributes. */ + grids_len += int(volume_grid != nullptr); /* Handle 3 cases here: * - Grid exists and texture was loaded -> use texture. @@ -145,7 +147,13 @@ static DRWShadingGroup *drw_volume_object_grids_init(Object *ob, grid_default_texture(attr->default_value); DRW_shgroup_uniform_texture(grp, attr->input_name, grid_tex); - copy_m4_m4(volume_infos.grids_xform[grid_id++].ptr(), drw_grid->object_to_texture); + copy_m4_m4(volume_infos.grids_xform[grid_id++].ptr(), + (drw_grid) ? drw_grid->object_to_texture : g_data.dummy_grid_mat); + } + /* Render nothing if there is no attribute for the shader to render. + * This also avoids an assert caused by the bounding box being zero in size. */ + if (grids_len == 0) { + return nullptr; } volume_infos.push_update(); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_camera.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_camera.glsl index ff84a0a334c..b1a29833d77 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_camera.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_camera.glsl @@ -1,6 +1,8 @@ void camera(out vec3 outview, out float outdepth, out float outdist) { - outdepth = abs(transform_point(ViewMatrix, g_data.P).z); - outdist = distance(g_data.P, cameraPos); - outview = normalize(g_data.P - cameraPos); + vec3 vP = transform_point(ViewMatrix, g_data.P); + vP.z = -vP.z; + outdepth = abs(vP.z); + outdist = length(vP); + outview = normalize(vP); } |