diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-03-16 16:42:56 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-03-18 13:23:05 +0300 |
commit | 7537cad5761e4778da7aed02410c5811114c24e5 (patch) | |
tree | 94b0187257e08ecaeaad5cef9eaaa4ec49aa04fd /source | |
parent | 1162ba206dd7792414d3ae716877ba1383de8dab (diff) |
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
Diffstat (limited to 'source')
5 files changed, 32 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_volume_render.h b/source/blender/blenkernel/BKE_volume_render.h index 72360f316a0..53f683f0eaf 100644 --- a/source/blender/blenkernel/BKE_volume_render.h +++ b/source/blender/blenkernel/BKE_volume_render.h @@ -65,6 +65,10 @@ void BKE_volume_grid_wireframe(const struct Volume *volume, BKE_volume_wireframe_cb cb, void *cb_userdata); +/* Render */ + +float BKE_volume_density_scale(const struct Volume *volume, const float matrix[4][4]); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/volume_render.cc b/source/blender/blenkernel/intern/volume_render.cc index d8fbbce3bae..a4833f1ffa4 100644 --- a/source/blender/blenkernel/intern/volume_render.cc +++ b/source/blender/blenkernel/intern/volume_render.cc @@ -356,3 +356,18 @@ void BKE_volume_grid_wireframe(const Volume *volume, cb(cb_userdata, NULL, NULL, 0, 0); #endif } + +/* Render */ + +float BKE_volume_density_scale(const Volume *volume, const float matrix[4][4]) +{ + if (volume->render.space == VOLUME_SPACE_OBJECT) { + float unit[3] = {1.0f, 1.0f, 1.0f}; + normalize_v3(unit); + mul_mat3_m4_v3(matrix, unit); + return 1.0f / len_v3(unit); + } + else { + return 1.0f; + } +} 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); |