From 89dd91a40a87fa65059052a7a9b143d15c82c740 Mon Sep 17 00:00:00 2001 From: ElonOlsson Date: Thu, 14 Apr 2022 16:11:38 -0400 Subject: [PATCH] fix opacity issue with volume rendering, opacity changed to brightness in raycaster --- .../bastille_day/density_volume.asset | 2 +- .../volume/rendering/basicvolumeraycaster.cpp | 10 ++++---- .../volume/rendering/basicvolumeraycaster.h | 9 ++++---- .../rendering/renderabletimevaryingvolume.cpp | 23 +++++++++---------- .../rendering/renderabletimevaryingvolume.h | 2 +- modules/volume/shaders/raycast.glsl | 9 ++++---- 6 files changed, 28 insertions(+), 27 deletions(-) diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset index 872be14c05..b3bd0a6a8b 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/density_volume.asset @@ -28,7 +28,7 @@ local densityVolume = { Renderable = { Type = "RenderableTimeVaryingVolume", StepSize = 0.004, - Opacity = 0.3, + Brightness = 0.3, TransferFunction = asset.localResource("transferfunctions/mas-mhd-r-squared-old.txt"), SourceDirectory = densityDirectory, GridType = "Spherical", diff --git a/modules/volume/rendering/basicvolumeraycaster.cpp b/modules/volume/rendering/basicvolumeraycaster.cpp index 3c3e2a2800..07ffb3af61 100644 --- a/modules/volume/rendering/basicvolumeraycaster.cpp +++ b/modules/volume/rendering/basicvolumeraycaster.cpp @@ -137,7 +137,7 @@ void BasicVolumeRaycaster::preRaycast(const RaycastData& data, program.setUniform("nClips_" + id, nClips); program.setUniform("clipNormals_" + id, clipNormals); program.setUniform("clipOffsets_" + id, clipOffsets); - program.setUniform("opacity_" + id, opacity()); + program.setUniform("brightness_" + id, brightness()); program.setUniform("rNormalization_" + id, _rNormalization); program.setUniform("rUpperBound_" + id, _rUpperBound); } @@ -197,12 +197,12 @@ void BasicVolumeRaycaster::setStepSize(float stepSize) { _stepSize = stepSize; } -void BasicVolumeRaycaster::setOpacity(float opacity) { - _opacity = opacity; +void BasicVolumeRaycaster::setBrightness(float brightness) { + _brightness = brightness; } -float BasicVolumeRaycaster::opacity() const { - return _opacity; +float BasicVolumeRaycaster::brightness() const { + return _brightness; } void BasicVolumeRaycaster::setRNormalization(float rNormalization) { diff --git a/modules/volume/rendering/basicvolumeraycaster.h b/modules/volume/rendering/basicvolumeraycaster.h index a4c30af952..38ba4d668f 100644 --- a/modules/volume/rendering/basicvolumeraycaster.h +++ b/modules/volume/rendering/basicvolumeraycaster.h @@ -76,11 +76,12 @@ public: void setVolumeTexture(std::shared_ptr texture); std::shared_ptr volumeTexture() const; - void setTransferFunction(std::shared_ptr transferFunction); + void setTransferFunction(std::shared_ptr + transferFunction); void setStepSize(float stepSize); - float opacity() const; - void setOpacity(float opacity); + float brightness() const; + void setBrightness(float brightness); float rNormalization() const; void setRNormalization(float rNormalization); float rUpperBound() const; @@ -98,7 +99,7 @@ private: BoxGeometry _boundingBox; VolumeGridType _gridType; glm::mat4 _modelTransform = glm::mat4(1.f); - float _opacity = 20.f; + float _brightness = 1.f; float _rNormalization = 0.f; float _rUpperBound = 1.f; diff --git a/modules/volume/rendering/renderabletimevaryingvolume.cpp b/modules/volume/rendering/renderabletimevaryingvolume.cpp index 43d6989015..761c1241b0 100644 --- a/modules/volume/rendering/renderabletimevaryingvolume.cpp +++ b/modules/volume/rendering/renderabletimevaryingvolume.cpp @@ -51,7 +51,6 @@ namespace { constexpr const char* _loggerCat = "RenderableTimeVaryingVolume"; const float SecondsInOneDay = 60 * 60 * 24; - constexpr const float VolumeMaxOpacity = 500; static const openspace::properties::Property::PropertyInfo StepSizeInfo = { "StepSize", @@ -104,10 +103,10 @@ namespace { "Lets you scrub through the sequence's time steps." }; - constexpr openspace::properties::Property::PropertyInfo OpacityInfo = { - "Opacity", - "Opacity", - "The volumes general opacity." + constexpr openspace::properties::Property::PropertyInfo BrightnessInfo = { + "Brightness", + "Brightness", + "The volumes general brightness." }; constexpr openspace::properties::Property::PropertyInfo rNormalizationInfo = { @@ -138,8 +137,8 @@ namespace { // Specifies if you want to invert the volume data at it z-axis. std::optional invertDataAtZ; - // [[codegen::verbatim(OpacityInfo.description)]] - std::optional opacity; + // [[codegen::verbatim(BrightnessInfo.description)]] + std::optional brightness; // [[codegen::verbatim(StepSizeInfo.description)]] std::optional stepSize; @@ -164,7 +163,7 @@ RenderableTimeVaryingVolume::RenderableTimeVaryingVolume( : Renderable(dictionary) , _gridType(GridTypeInfo, properties::OptionProperty::DisplayType::Dropdown) , _stepSize(StepSizeInfo, 0.02f, 0.001f, 0.1f) - , _opacity(OpacityInfo, 10.f, 0.f, VolumeMaxOpacity) + , _brightness(BrightnessInfo, 0.1f, 0.f, 1.f) , _rNormalization(rNormalizationInfo, 0.f, 0.f, 2.f) , _rUpperBound(rUpperBoundInfo, 1.f, 0.f, 2.f) , _secondsBefore(SecondsBeforeInfo, 0.f, 0.01f, SecondsInOneDay) @@ -194,8 +193,8 @@ RenderableTimeVaryingVolume::RenderableTimeVaryingVolume( _stepSize = p.stepSize.value_or(_stepSize); - if (p.opacity.has_value()) { - _opacity = *p.opacity * VolumeMaxOpacity; + if (p.brightness.has_value()) { + _brightness = *p.brightness; } _secondsBefore = p.secondsBefore.value_or(_secondsBefore); @@ -211,7 +210,7 @@ RenderableTimeVaryingVolume::RenderableTimeVaryingVolume( _gridType = static_cast>(gridType); } - addProperty(_opacity); + addProperty(_brightness); } RenderableTimeVaryingVolume::~RenderableTimeVaryingVolume() {} @@ -452,7 +451,7 @@ void RenderableTimeVaryingVolume::update(const UpdateData&) { _raycaster->setVolumeTexture(nullptr); } _raycaster->setStepSize(_stepSize); - _raycaster->setOpacity(opacity()); + _raycaster->setBrightness(_brightness); _raycaster->setRNormalization(_rNormalization); _raycaster->setRUpperBound(_rUpperBound); } diff --git a/modules/volume/rendering/renderabletimevaryingvolume.h b/modules/volume/rendering/renderabletimevaryingvolume.h index b2fd2c3663..7061ab0325 100644 --- a/modules/volume/rendering/renderabletimevaryingvolume.h +++ b/modules/volume/rendering/renderabletimevaryingvolume.h @@ -82,7 +82,7 @@ private: std::shared_ptr _clipPlanes; properties::FloatProperty _stepSize; - properties::FloatProperty _opacity; + properties::FloatProperty _brightness; properties::FloatProperty _rNormalization; properties::FloatProperty _rUpperBound; properties::FloatProperty _secondsBefore; diff --git a/modules/volume/shaders/raycast.glsl b/modules/volume/shaders/raycast.glsl index f8d5087a6a..78bf2c98ae 100644 --- a/modules/volume/shaders/raycast.glsl +++ b/modules/volume/shaders/raycast.glsl @@ -31,8 +31,9 @@ uniform int nClips_#{id}; uniform vec3 clipNormals_#{id}[8]; uniform vec2 clipOffsets_#{id}[8]; -uniform float opacity_#{id} = 10.0; - +uniform float brightness_#{id} = 1.0; +// unitless factor that multiplies with the brightness [0,1] to achieve desired visuals. +const float sampling_interval_reference_factor = 500; // Normalization factor x for radius r [0, 1]. // value *= 1/(r^x) @@ -78,8 +79,8 @@ void sample#{id}(vec3 samplePos, vec3 dir, inout vec3 accumulatedColor, vec3 backColor = color.rgb; vec3 backAlpha = color.aaa; - backColor *= stepSize*opacity_#{id} * clipAlpha; - backAlpha *= stepSize*opacity_#{id} * clipAlpha; + backColor *= stepSize * brightness_#{id} * sampling_interval_reference_factor * clipAlpha; + backAlpha *= stepSize * brightness_#{id} * sampling_interval_reference_factor * clipAlpha; backColor = clamp(backColor, 0.0, 1.0); backAlpha = clamp(backAlpha, 0.0, 1.0);