From 7537cad5761e4778da7aed02410c5811114c24e5 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 16 Mar 2020 14:42:56 +0100 Subject: Volumes: add render settings for volume datablock * Space: volume density and step size in object or world space * Step Size: override automatic step size * Clipping: values below this are ignored for tighter volume bounds The last two are Cycles only currently. Ref T73201 --- source/blender/draw/engines/eevee/eevee_volumes.c | 4 ++++ source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl | 7 +++++++ source/blender/draw/engines/workbench/workbench_volume.c | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 0e82ac237c0..e0008558135 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -451,6 +451,10 @@ static bool eevee_volume_object_grids_init(Object *ob, ListBase *gpu_grids, DRWS DRW_shgroup_uniform_vec3_copy(grp, "volumeOrcoLoc", (float[3]){0.5f, 0.5f, 0.5f}); DRW_shgroup_uniform_vec3_copy(grp, "volumeOrcoSize", (float[3]){0.5f, 0.5f, 0.5f}); + /* Set density scale. */ + const float density_scale = BKE_volume_density_scale(volume, ob->obmat); + DRW_shgroup_uniform_float_copy(grp, "volumeDensityScale", density_scale); + /* Bind volume grid textures. */ LISTBASE_FOREACH (GPUMaterialVolumeGrid *, gpu_grid, gpu_grids) { VolumeGrid *volume_grid = BKE_volume_grid_find(volume, gpu_grid->name); diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl index f5e92cd7495..312fc07054a 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl @@ -8,6 +8,7 @@ uniform vec3 volumeOrcoLoc; uniform vec3 volumeOrcoSize; uniform mat4 volumeObjectToTexture; +uniform float volumeDensityScale = 1.0; #endif flat in int slice; @@ -52,6 +53,12 @@ void main() Closure cl = nodetree_exec(); #endif +#ifdef MESH_SHADER + cl.scatter *= volumeDensityScale; + cl.absorption *= volumeDensityScale; + cl.emission *= volumeDensityScale; +#endif + volumeScattering = vec4(cl.scatter, 1.0); volumeExtinction = vec4(cl.absorption + cl.scatter, 1.0); volumeEmissive = vec4(cl.emission, 1.0); diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c index 1eccc99d9e9..b9ea61fd013 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.c +++ b/source/blender/draw/engines/workbench/workbench_volume.c @@ -229,7 +229,8 @@ static void workbench_volume_object_cache_populate(WORKBENCH_Data *vedata, step_length = len_v3(slice_ct); /* Compute density scale. */ - const float density_scale = volume->display.density; + const float density_scale = volume->display.density * + BKE_volume_density_scale(volume, ob->obmat); /* Set uniforms. */ DRWShadingGroup *grp = DRW_shgroup_create(sh, vedata->psl->volume_ps); -- cgit v1.2.3