From 99b26040c23474b8faa6f7c22e95866d6e9c173a Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Thu, 11 Jan 2018 09:44:46 +0100 Subject: [PATCH 01/12] Update sgct --- ext/sgct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/sgct b/ext/sgct index 7f56f724c1..0a72a676bd 160000 --- a/ext/sgct +++ b/ext/sgct @@ -1 +1 @@ -Subproject commit 7f56f724c1103effcec217dd66513c42eb1545e1 +Subproject commit 0a72a676bdf5e73c86d11abb3e0dc4846ea65cc1 From 521cb0f5ae32de9183c3565efcada1531da7e341 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Thu, 11 Jan 2018 14:40:16 +0100 Subject: [PATCH 02/12] Use framebuffer size to determine gui size --- modules/imgui/imguimodule.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/imgui/imguimodule.cpp b/modules/imgui/imguimodule.cpp index 2bebd14f48..9cefc7e437 100644 --- a/modules/imgui/imguimodule.cpp +++ b/modules/imgui/imguimodule.cpp @@ -169,8 +169,10 @@ ImGUIModule::ImGUIModule() : OpenSpaceModule(Name) { WindowWrapper& wrapper = OsEng.windowWrapper(); bool showGui = wrapper.hasGuiWindow() ? wrapper.isGuiWindow() : true; if (wrapper.isMaster() && showGui) { + const glm::ivec2 windowSize = wrapper.currentWindowSize(); + const glm::ivec2 resolution = wrapper.currentWindowResolution(); + glm::vec2 mousePosition = wrapper.mousePosition(); - glm::ivec2 windowSize = wrapper.currentWindowSize(); uint32_t mouseButtons = wrapper.mouseButtons(2); double dt = std::max(wrapper.averageDeltaTime(), 0.0); @@ -183,7 +185,7 @@ ImGUIModule::ImGUIModule() : OpenSpaceModule(Name) { gui.startFrame( static_cast(dt), glm::vec2(windowSize), - wrapper.dpiScaling(), + resolution / windowSize, mousePosition, mouseButtons ); From 499879c84e1a593c2c8ac6650d14692ebc65eb02 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Wed, 14 Feb 2018 15:05:52 +0100 Subject: [PATCH 03/12] Start to implement stereo support with adaptive stereoscopic depth --- .../openspace/interaction/orbitalnavigator.h | 12 ++ .../openspace/rendering/framebufferrenderer.h | 2 + include/openspace/util/camera.h | 9 +- .../rendering/atmospheredeferredcaster.cpp | 4 +- modules/base/rendering/renderablemodel.cpp | 2 +- .../globebrowsing/rendering/chunkrenderer.cpp | 4 +- .../rendering/renderableplanetprojection.cpp | 2 +- src/engine/wrapper/sgctwindowwrapper.cpp | 2 +- src/interaction/orbitalnavigator.cpp | 62 +++++++++++ src/rendering/framebufferrenderer.cpp | 104 +++++++++--------- src/rendering/renderable.cpp | 2 +- src/util/camera.cpp | 26 +++-- 12 files changed, 160 insertions(+), 71 deletions(-) diff --git a/include/openspace/interaction/orbitalnavigator.h b/include/openspace/interaction/orbitalnavigator.h index 38c569b34b..47f0614412 100644 --- a/include/openspace/interaction/orbitalnavigator.h +++ b/include/openspace/interaction/orbitalnavigator.h @@ -84,6 +84,10 @@ private: properties::FloatProperty _minimumAllowedDistance; properties::FloatProperty _sensitivity; + properties::BoolProperty _useAdaptiveStereoscopicDepth; + properties::FloatProperty _stereoscopicDepthOfFocusSurface; + properties::FloatProperty _staticViewScaleExponent; + MouseStates _mouseStates; SceneGraphNode* _focusNode = nullptr; @@ -193,6 +197,14 @@ private: const glm::dvec3& cameraPosition, const SurfacePositionHandle& positionHandle); + /** + * Get the vector from the camera to the surface of the focus object in world space. + */ + glm::dvec3 cameraToSurfaceVector( + const glm::dvec3& cameraPos, + const glm::dvec3& centerPos, + const SurfacePositionHandle& posHandle); + /** * Calculates a SurfacePositionHandle given a camera position in world space. */ diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 6f61cd2238..f8f43ae9e2 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -82,6 +82,8 @@ public: void update() override; void render(float blackoutFactor, bool doPerformanceMeasurements) override; + void performRaycasterTasks(const std::vector& tasks); + void performDeferredTasks(const std::vector& tasks); /** * Update render data diff --git a/include/openspace/util/camera.h b/include/openspace/util/camera.h index 71dd85a0bc..70e7ea88f8 100644 --- a/include/openspace/util/camera.h +++ b/include/openspace/util/camera.h @@ -91,7 +91,7 @@ public: void setPositionVec3(Vec3 pos); void setFocusPositionVec3(Vec3 pos); void setRotation(Quat rotation); - void setScaling(glm::vec2 scaling); + void setScaling(float scaling); void setMaxFov(float fov); void setParent(SceneGraphNode* parent); @@ -106,12 +106,13 @@ public: const Vec3& viewDirectionWorldSpace() const; const Vec3& lookUpVectorCameraSpace() const; const Vec3& lookUpVectorWorldSpace() const; - const glm::vec2& scaling() const; const Mat4& viewRotationMatrix() const; + const Mat4& viewScaleMatrix() const; const Quat& rotationQuaternion() const; float maxFov() const; float sinMaxFov() const; SceneGraphNode* parent() const; + float scaling() const; // @TODO this should simply be called viewMatrix! // Or it needs to be changed so that it actually is combined. Right now it is @@ -186,10 +187,9 @@ private: SyncData _position; SyncData _rotation; - SyncData _scaling; + SyncData _scaling; SceneGraphNode* _parent; - // _focusPosition to be removed Vec3 _focusPosition; float _maxFov; @@ -198,6 +198,7 @@ private: mutable Cached _cachedViewDirection; mutable Cached _cachedLookupVector; mutable Cached _cachedViewRotationMatrix; + mutable Cached _cachedViewScaleMatrix; mutable Cached _cachedCombinedViewMatrix; mutable Cached _cachedSinMaxFov; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index c2842a3a33..52a7594e9c 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -248,9 +248,7 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, program.setUniform("dModelTransformMatrix", _modelTransform); // The following scale comes from PSC transformations. - float fScaleFactor = renderData.camera.scaling().x * - pow(10.0, renderData.camera.scaling().y); - glm::dmat4 dfScaleCamTransf = glm::scale(glm::dvec3(fScaleFactor)); + glm::dmat4 dfScaleCamTransf = glm::scale(glm::dvec3(1.0)); program.setUniform( "dInverseScaleTransformMatrix", glm::inverse(dfScaleCamTransf) diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index 9f94d6a74f..6ddf023ca9 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -208,7 +208,7 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { glm::vec3 directionToSun = glm::normalize(_sunPos - data.modelTransform.translation); glm::vec3 directionToSunViewSpace = - glm::mat3(data.camera.combinedViewMatrix()) * directionToSun; + glm::normalize(glm::mat3(data.camera.combinedViewMatrix()) * directionToSun); _programObject->setUniform( _uniformCache.directionToSunViewSpace, diff --git a/modules/globebrowsing/rendering/chunkrenderer.cpp b/modules/globebrowsing/rendering/chunkrenderer.cpp index 20c0e3d376..e3b370fc3d 100644 --- a/modules/globebrowsing/rendering/chunkrenderer.cpp +++ b/modules/globebrowsing/rendering/chunkrenderer.cpp @@ -263,7 +263,7 @@ void ChunkRenderer::setCommonUniforms(ghoul::opengl::ProgramObject& programObjec glm::vec3 directionToSunCameraSpace = glm::vec3(viewTransform * glm::dvec4(directionToSunWorldSpace, 0)); programObject.setUniform( - "lightDirectionCameraSpace", -directionToSunCameraSpace); + "lightDirectionCameraSpace", -glm::normalize(directionToSunCameraSpace)); } if (chunk.owner().generalProperties().performShading) { @@ -469,7 +469,7 @@ void ChunkRenderer::renderChunkLocally(const Chunk& chunk, const RenderData& dat if (_layerManager->layerGroup(layergroupid::HeightLayers).activeLayers().size() > 0) { // Apply an extra scaling to the height if the object is scaled programObject->setUniform( - "heightScale", static_cast(data.modelTransform.scale)); + "heightScale", static_cast(data.modelTransform.scale * data.camera.scaling())); } setCommonUniforms(*programObject, chunk, data); diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp index 3430224be6..715c87c709 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp @@ -537,7 +537,7 @@ void RenderablePlanetProjection::render(const RenderData& data, RendererTasks&) _projectionComponent.generateMipMap(); } - _camScaling = data.camera.scaling(); + _camScaling = glm::vec2(1, 0); // Unit scaling _up = data.camera.lookUpVectorCameraSpace(); if (_capture && _projectionComponent.doesPerformProjection()) { diff --git a/src/engine/wrapper/sgctwindowwrapper.cpp b/src/engine/wrapper/sgctwindowwrapper.cpp index fef3b7b9ff..d9f2801978 100644 --- a/src/engine/wrapper/sgctwindowwrapper.cpp +++ b/src/engine/wrapper/sgctwindowwrapper.cpp @@ -51,7 +51,7 @@ namespace { namespace openspace { SGCTWindowWrapper::SGCTWindowWrapper() - : _eyeSeparation(EyeSeparationInfo, 0.f, 0.f, 10.f) + : _eyeSeparation(EyeSeparationInfo, 0.f, 0.f, 0.2f) , _showStatsGraph(ShowStatsGraphInfo, false) { _showStatsGraph.onChange([this](){ diff --git a/src/interaction/orbitalnavigator.cpp b/src/interaction/orbitalnavigator.cpp index 06ed097435..b5fbecd444 100644 --- a/src/interaction/orbitalnavigator.cpp +++ b/src/interaction/orbitalnavigator.cpp @@ -84,6 +84,33 @@ namespace { "Minimum allowed distance", "" // @TODO Missing documentation }; + + static const openspace::properties::Property::PropertyInfo + UseAdaptiveStereoscopicDepthInfo = { + "UseAdaptiveStereoscopicDepth", + "Adaptive Steroscopic Depth", + "Dynamically adjust the view scaling based on the distance to the surface of " + "the focus node. If enabled, view scale will be set to " + "StereoscopicDepthOfFocusSurface / distance. " + "If disabled, view scale will be set to 10^StaticViewScaleExponent." + }; + + static const openspace::properties::Property::PropertyInfo + StaticViewScaleExponentInfo = { + "StaticViewScaleExponent", + "Static View Scale Exponent", + "Statically scale the world by 10^StaticViewScaleExponent. " + "Only used if UseAdaptiveStereoscopicDepthInfo is set to false." + }; + + static const openspace::properties::Property::PropertyInfo + StereoscopicDepthOfFocusSurfaceInfo = { + "StereoscopicDepthOfFocusSurface", + "Stereoscopic depth of the surface in focus", + "Set the stereoscopically perceived distance (in meters) to the surface of " + "the focus node. " + "Only used if UseAdaptiveStereoscopicDepthInfo is set to true." + }; } // namespace namespace openspace::interaction { @@ -107,6 +134,9 @@ OrbitalNavigator::OrbitalNavigator() , _minimumAllowedDistance(MinimumDistanceInfo, 10.0f, 0.0f, 10000.f) , _sensitivity(SensitivityInfo, 20.0f, 1.0f, 50.f) , _mouseStates(_sensitivity * pow(10.0, -4), 1 / (_friction.friction + 0.0000001)) + , _useAdaptiveStereoscopicDepth(UseAdaptiveStereoscopicDepthInfo, true) + , _staticViewScaleExponent(StaticViewScaleExponentInfo, 0.f, -30, 10) + , _stereoscopicDepthOfFocusSurface(StereoscopicDepthOfFocusSurfaceInfo, 8, 0.25, 100) { auto smoothStep = [](double t) { @@ -158,6 +188,10 @@ OrbitalNavigator::OrbitalNavigator() addProperty(_followFocusNodeRotationDistance); addProperty(_minimumAllowedDistance); addProperty(_sensitivity); + + addProperty(_useAdaptiveStereoscopicDepth); + addProperty(_staticViewScaleExponent); + addProperty(_stereoscopicDepthOfFocusSurface); } OrbitalNavigator::~OrbitalNavigator() {} @@ -263,9 +297,37 @@ void OrbitalNavigator::updateCameraStateFromMouseStates(Camera& camera, double d // Update the camera state camera.setPositionVec3(camPos); camera.setRotation(camRot.globalRotation * camRot.localRotation); + + if (_useAdaptiveStereoscopicDepth) { + glm::vec3 surfaceToCamera = static_cast( + cameraToSurfaceVector(camPos, centerPos, posHandle) + ); + camera.setScaling( + _stereoscopicDepthOfFocusSurface / glm::length(surfaceToCamera) + ); + } else { + camera.setScaling(glm::pow(10.f, _staticViewScaleExponent)); + } } } +glm::dvec3 OrbitalNavigator::cameraToSurfaceVector( + const glm::dvec3& camPos, + const glm::dvec3& centerPos, + const SurfacePositionHandle& posHandle) +{ + glm::dmat4 modelTransform = _focusNode->modelTransform(); + glm::dvec3 posDiff = camPos - centerPos; + glm::dvec3 centerToActualSurfaceModelSpace = + posHandle.centerToReferenceSurface + + posHandle.referenceSurfaceOutDirection * posHandle.heightToSurface; + + glm::dvec3 centerToActualSurface = + glm::dmat3(modelTransform) * centerToActualSurfaceModelSpace; + + return centerToActualSurface - posDiff; +} + void OrbitalNavigator::setFocusNode(SceneGraphNode* focusNode) { _focusNode = focusNode; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 7b304eaabc..87ff1be165 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -925,19 +925,13 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure return; } - glEnable(GL_DEPTH_TEST); - - - Time time = OsEng.timeManager().time(); - - RenderData data = { *_camera, psc(), time, doPerformanceMeasurements, 0, {} }; - RendererTasks tasks; - // Capture standard fbo GLint defaultFbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo); glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); + glEnable(GL_DEPTH_TEST); + // deferred g-buffer GLenum textureBuffers[3] = { GL_COLOR_ATTACHMENT0, @@ -952,6 +946,11 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure glDisablei(GL_BLEND, 2); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + Time time = OsEng.timeManager().time(); + RenderData data = { *_camera, psc(), time, doPerformanceMeasurements, 0,{} }; + RendererTasks tasks; + data.renderBinMask = static_cast(Renderable::RenderBin::Background); _scene->render(data, tasks); data.renderBinMask = static_cast(Renderable::RenderBin::Opaque); @@ -961,7 +960,49 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); _scene->render(data, tasks); - for (const RaycasterTask& raycasterTask : tasks.raycasterTasks) { + + performRaycasterTasks(tasks.raycasterTasks); + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + GLenum dBuffer[1] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, dBuffer); + glClear(GL_COLOR_BUFFER_BIT); + + performDeferredTasks(tasks.deferredcasterTasks); + + if (!tasks.deferredcasterTasks.empty()) { + // JCC: Temporarily disabled. Need to test it on mac and linux before final + // merging. + /*glBindFramebuffer(GL_READ_FRAMEBUFFER, _deferredFramebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFbo); + GLenum dBuffer[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, dBuffer); + glReadBuffer(GL_COLOR_ATTACHMENT0); + glBlitFramebuffer(0, 0, GLsizei(_resolution.x), GLsizei(_resolution.y), + 0, 0, GLsizei(_resolution.x), GLsizei(_resolution.y), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + */ + //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + } else { + _resolveProgram->activate(); + + ghoul::opengl::TextureUnit mainColorTextureUnit; + mainColorTextureUnit.activate(); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); + _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); + _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); + _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + _resolveProgram->deactivate(); + } +} + +void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { + for (const RaycasterTask& raycasterTask : tasks) { VolumeRaycaster* raycaster = raycasterTask.raycaster; glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer); @@ -1041,18 +1082,15 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure LWARNING("Raycaster is not attached when trying to perform raycaster task"); } } +} +void FramebufferRenderer::performDeferredTasks(const std::vector& tasks) { // g-buffer - if (!tasks.deferredcasterTasks.empty()) { + if (!tasks.empty()) { //glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _deferredFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - GLenum dBuffer[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, dBuffer); - glClear(GL_COLOR_BUFFER_BIT); - bool firstPaint = true; - for (const DeferredcasterTask& deferredcasterTask : tasks.deferredcasterTasks) { + for (const DeferredcasterTask& deferredcasterTask : tasks) { Deferredcaster* deferredcaster = deferredcasterTask.deferredcaster; @@ -1125,45 +1163,13 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure if (firstPaint) { firstPaint = false; } - } - else { + } else { LWARNING( "Deferredcaster is not attached when trying to perform deferred task" ); } } } - - if (!tasks.deferredcasterTasks.empty()) { - // JCC: Temporarily disabled. Need to test it on mac and linux before final - // merging. - /*glBindFramebuffer(GL_READ_FRAMEBUFFER, _deferredFramebuffer); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFbo); - GLenum dBuffer[] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, dBuffer); - glReadBuffer(GL_COLOR_ATTACHMENT0); - glBlitFramebuffer(0, 0, GLsizei(_resolution.x), GLsizei(_resolution.y), - 0, 0, GLsizei(_resolution.x), GLsizei(_resolution.y), - GL_COLOR_BUFFER_BIT, GL_NEAREST); - */ - //glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - } else { - glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); - _resolveProgram->activate(); - - ghoul::opengl::TextureUnit mainColorTextureUnit; - mainColorTextureUnit.activate(); - - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); - _resolveProgram->setUniform(_uniformCache.mainColorTexture, mainColorTextureUnit); - _resolveProgram->setUniform(_uniformCache.blackoutFactor, blackoutFactor); - _resolveProgram->setUniform(_uniformCache.nAaSamples, _nAaSamples); - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - - _resolveProgram->deactivate(); - } } void FramebufferRenderer::setScene(Scene* scene) { diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index 6ab6e314c4..7b12f3552d 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -187,7 +187,7 @@ void Renderable::setPscUniforms(ghoul::opengl::ProgramObject& program, program.setUniform("campos", camera.position().vec4()); program.setUniform("objpos", position.vec4()); program.setUniform("camrot", glm::mat4(camera.viewRotationMatrix())); - program.setUniform("scaling", camera.scaling()); + program.setUniform("scaling", glm::vec2(1, 0)); } Renderable::RenderBin Renderable::renderBin() const { diff --git a/src/util/camera.cpp b/src/util/camera.cpp index b6483cc7cd..f8c5454c2a 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -49,8 +49,6 @@ namespace openspace { : _focusPosition() , _maxFov(0.f) { - - _scaling = glm::vec2(1.f, 0.f); _position = Vec3(1.0, 1.0, 1.0); Vec3 eulerAngles(1.0, 1.0, 1.0); _rotation = Quat(eulerAngles); @@ -60,7 +58,6 @@ namespace openspace { : sgctInternal(o.sgctInternal) , _position(o._position) , _rotation(o._rotation) - , _scaling(o._scaling) , _focusPosition(o._focusPosition) , _maxFov(o._maxFov) , _cachedViewDirection(o._cachedViewDirection) @@ -91,9 +88,11 @@ namespace openspace { _cachedCombinedViewMatrix.isDirty = true; } - void Camera::setScaling(glm::vec2 scaling) { + void Camera::setScaling(float scaling) { std::lock_guard _lock(_mutex); - _scaling = std::move(scaling); + _scaling = scaling; + _cachedViewScaleMatrix.isDirty = true; + _cachedCombinedViewMatrix.isDirty = true; } void Camera::setMaxFov(float fov) { @@ -154,10 +153,6 @@ namespace openspace { return _cachedLookupVector.datum; } - const glm::vec2& Camera::scaling() const { - return _scaling; - } - float Camera::maxFov() const { return _maxFov; } @@ -174,6 +169,10 @@ namespace openspace { return _parent; } + float Camera::scaling() const { + return _scaling; + } + const Camera::Mat4& Camera::viewRotationMatrix() const { if (_cachedViewRotationMatrix.isDirty) { _cachedViewRotationMatrix.datum = glm::mat4_cast( @@ -183,6 +182,14 @@ namespace openspace { return _cachedViewRotationMatrix.datum; } + const Camera::Mat4& Camera::viewScaleMatrix() const + { + if (_cachedViewScaleMatrix.isDirty) { + _cachedViewScaleMatrix.datum = glm::scale(glm::vec3(_scaling)); + } + return _cachedViewScaleMatrix.datum; + } + const Camera::Quat& Camera::rotationQuaternion() const { return _rotation; } @@ -193,6 +200,7 @@ namespace openspace { glm::inverse(glm::translate(Mat4(1.0), static_cast(_position))); _cachedCombinedViewMatrix.datum = Mat4(sgctInternal.viewMatrix()) * + Mat4(viewScaleMatrix()) * Mat4(viewRotationMatrix()) * cameraTranslation; _cachedCombinedViewMatrix.isDirty = true; From 4b3a11c4aa0cae6897c945b43e9cd8b1d43fa4d6 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 14 Feb 2018 11:35:58 -0500 Subject: [PATCH 04/12] Initial fixes in ATM for stereo rendering. --- include/openspace/util/camera.h | 1 + .../rendering/atmospheredeferredcaster.cpp | 5 +++++ .../atmosphere/shaders/atmosphere_deferred_fs.glsl | 13 ++++++++----- src/util/camera.cpp | 4 ++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/openspace/util/camera.h b/include/openspace/util/camera.h index 70e7ea88f8..b3b2e28d03 100644 --- a/include/openspace/util/camera.h +++ b/include/openspace/util/camera.h @@ -171,6 +171,7 @@ public: psc unsynchedPosition() const; // [[deprecated("Replaced by Camera::focusPositionVec3()")]] psc focusPosition() const; + const glm::mat4& sceneMatrix() const; // @TODO use Camera::SgctInternal interface instead // [[deprecated("Replaced by Camera::SgctInternal::viewMatrix()")]] const glm::mat4& viewMatrix() const; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 52a7594e9c..23bec4878f 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -255,6 +255,11 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, ); // World to Eye Space in OS + program.setUniform( + "dInverseCamScaleTransform", + glm::inverse(renderData.camera.viewScaleMatrix()) + ); + program.setUniform( "dInverseCamRotTransform", glm::mat4_cast( diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index e924730ecd..a4c434f2b4 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -88,6 +88,7 @@ uniform sampler2DMS mainColorTexture; uniform dmat4 dInverseSgctEyeToWorldTranform; // SGCT Eye to OS World uniform dmat4 dSgctEyeToOSEyeTranform; // SGCT Eye to OS Eye * uniform dmat4 dInverseSgctProjectionMatrix; // Clip to SGCT Eye * +uniform dmat4 dInverseCamScaleTransform; uniform dmat4 dInverseCamRotTransform; uniform dmat4 dInverseModelTransformMatrix; uniform dmat4 dModelTransformMatrix; @@ -260,13 +261,14 @@ void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray, // Clip to SGCT Eye dvec4 sgctEyeCoords = dInverseSgctProjectionMatrix * clipCoords; - sgctEyeCoords.w = 1.0; + sgctEyeCoords.w = clipCoords.z;//1.0; // SGCT Eye to OS Eye dvec4 tOSEyeCoordsInv = dSgctEyeToOSEyeTranform * sgctEyeCoords; // OS Eye to World coords - dvec4 tmpRInv = dInverseCamRotTransform * tOSEyeCoordsInv; + dvec4 tmpSInv = dInverseCamScaleTransform * tOSEyeCoordsInv; + dvec4 tmpRInv = dInverseCamRotTransform * tmpSInv;//tOSEyeCoordsInv; dvec4 worldCoords = dvec4(dvec3(tmpRInv) + dCampos, 1.0); // World to Object @@ -634,8 +636,9 @@ void main() { // Fragments positions into G-Buffer are written in OS Eye Space (Camera Rig Coords) // when using their positions later, one must convert them to the planet's coords - // OS Eye to World coords - dvec4 tmpRInvPos = dInverseCamRotTransform * dSgctEyeToOSEyeTranform * position; + // OS Eye to World coords + dvec4 tmpSInvPos = dInverseCamScaleTransform * dSgctEyeToOSEyeTranform * position; + dvec4 tmpRInvPos = dInverseCamRotTransform * tmpSInvPos;//dSgctEyeToOSEyeTranform * position; dvec4 fragWorldCoords = dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); // World to Object (Normal and Position in meters) @@ -652,7 +655,7 @@ void main() { float dC = float(length(cameraPositionInObject.xyz)); float x1 = 1e8; if (dC > x1) { - pixelDepth += 1000.0; + pixelDepth += 1000.0; float alpha = 1000.0; float beta = 1000000.0; float x2 = 1e9; diff --git a/src/util/camera.cpp b/src/util/camera.cpp index f8c5454c2a..3da20a3f69 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -306,6 +306,10 @@ namespace openspace { return psc(_focusPosition); } + const glm::mat4& Camera::sceneMatrix() const { + return sgctInternal.sceneMatrix(); + } + const glm::mat4& Camera::viewMatrix() const { return sgctInternal.viewMatrix(); } From cb77e2839cd68d3367ec8263cd481c2104f55c13 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Wed, 14 Feb 2018 18:17:59 +0100 Subject: [PATCH 05/12] Fix bug with accurate normal rendering in stereo --- modules/globebrowsing/rendering/chunkrenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/globebrowsing/rendering/chunkrenderer.cpp b/modules/globebrowsing/rendering/chunkrenderer.cpp index e3b370fc3d..6f5c977397 100644 --- a/modules/globebrowsing/rendering/chunkrenderer.cpp +++ b/modules/globebrowsing/rendering/chunkrenderer.cpp @@ -374,7 +374,7 @@ void ChunkRenderer::renderChunkGlobally(const Chunk& chunk, const RenderData& da { // Apply an extra scaling to the height if the object is scaled programObject->setUniform( - "heightScale", static_cast(data.modelTransform.scale)); + "heightScale", static_cast(data.modelTransform.scale * data.camera.scaling())); } setCommonUniforms(*programObject, chunk, data); From 656bd0e89e5d896bbcd857774ba6f238bc908145 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Thu, 15 Feb 2018 19:04:50 +0100 Subject: [PATCH 06/12] Star rendering: stereo support + remove psc --- modules/space/rendering/renderablestars.cpp | 163 +++++++++----------- modules/space/rendering/renderablestars.h | 10 +- modules/space/shaders/star_fs.glsl | 28 ++-- modules/space/shaders/star_ge.glsl | 49 ++---- modules/space/shaders/star_vs.glsl | 20 +-- 5 files changed, 102 insertions(+), 168 deletions(-) diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 5823510146..edbeaf29bd 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -99,25 +100,24 @@ namespace { "stars." }; - static const openspace::properties::Property::PropertyInfo TransparencyInfo = { - "Transparency", - "Transparency", - "This value is a multiplicative factor that is applied to the transparency of " - "all stars." + static const openspace::properties::Property::PropertyInfo MagnitudeExponentInfo = { + "MagnitudeExponent", + "MagnitudeExponent", + "Adjust star magnitude by 10^MagnitudeExponent. " + "Stars closer than this distance are given full opacity. " + "Farther away, stars dim proportionally to the logarithm of their distance." }; - static const openspace::properties::Property::PropertyInfo ScaleFactorInfo = { - "ScaleFactor", - "Scale Factor", - "This value is used as a multiplicative factor that is applied to the apparent " - "size of each star." + static const openspace::properties::Property::PropertyInfo SharpnessInfo = { + "Sharpness", + "Sharpness", + "Adjust star sharpness" }; - static const openspace::properties::Property::PropertyInfo MinBillboardSizeInfo = { - "MinBillboardSize", - "Min Billboard Size", - "This value is used as a lower limit on the size of stars that are rendered. Any " - "stars that have a smaller apparent size will be discarded entirely." + static const openspace::properties::Property::PropertyInfo BillboardSizeInfo = { + "BillboardSize", + "Billboard Size", + "Set the billboard size of all stars" }; } // namespace @@ -162,22 +162,22 @@ documentation::Documentation RenderableStars::Documentation() { ColorOptionInfo.description }, { - TransparencyInfo.identifier, + MagnitudeExponentInfo.identifier, new DoubleVerifier, Optional::Yes, - TransparencyInfo.description + MagnitudeExponentInfo.description }, { - ScaleFactorInfo.identifier, + SharpnessInfo.identifier, new DoubleVerifier, Optional::Yes, - ScaleFactorInfo.description + SharpnessInfo.description }, { - MinBillboardSizeInfo.identifier, + BillboardSizeInfo.identifier, new DoubleVerifier, Optional::Yes, - MinBillboardSizeInfo.description + BillboardSizeInfo.description } } }; @@ -193,9 +193,9 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) , _colorTextureIsDirty(true) , _colorOption(ColorOptionInfo, properties::OptionProperty::DisplayType::Dropdown) , _dataIsDirty(true) - , _alphaValue(TransparencyInfo, 1.f, 0.f, 1.f) - , _scaleFactor(ScaleFactorInfo, 1.f, 0.f, 10.f) - , _minBillboardSize(MinBillboardSizeInfo, 1.f, 1.f, 100.f) + , _magnitudeExponent(MagnitudeExponentInfo, 19.f, 0.f, 30.f) + , _sharpness(SharpnessInfo, 1.f, 0.f, 5.f) + , _billboardSize(BillboardSizeInfo, 30.f, 1.f, 100.f) , _program(nullptr) , _speckFile("") , _nValuesPerStar(0) @@ -258,26 +258,26 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) ); addProperty(_colorTexturePath); - if (dictionary.hasKey(TransparencyInfo.identifier)) { - _alphaValue = static_cast( - dictionary.value(TransparencyInfo.identifier) + if (dictionary.hasKey(MagnitudeExponentInfo.identifier)) { + _magnitudeExponent = static_cast( + dictionary.value(MagnitudeExponentInfo.identifier) ); } - addProperty(_alphaValue); + addProperty(_magnitudeExponent); - if (dictionary.hasKey(ScaleFactorInfo.identifier)) { - _scaleFactor = static_cast( - dictionary.value(ScaleFactorInfo.identifier) - ); + if (dictionary.hasKey(SharpnessInfo.identifier)) { + _sharpness = static_cast( + dictionary.value(SharpnessInfo.identifier) + ); } - addProperty(_scaleFactor); + addProperty(_sharpness); - if (dictionary.hasKey(MinBillboardSizeInfo.identifier)) { - _minBillboardSize = static_cast( - dictionary.value(MinBillboardSizeInfo.identifier) + if (dictionary.hasKey(BillboardSizeInfo.identifier)) { + _billboardSize = static_cast( + dictionary.value(BillboardSizeInfo.identifier) ); } - addProperty(_minBillboardSize); + addProperty(_billboardSize); } RenderableStars::~RenderableStars() {} @@ -294,14 +294,15 @@ void RenderableStars::initializeGL() { absPath("${MODULE_SPACE}/shaders/star_ge.glsl") ); + _uniformCache.model = _program->uniformLocation("model"); _uniformCache.view = _program->uniformLocation("view"); + _uniformCache.viewScaling = _program->uniformLocation("viewScaling"); _uniformCache.projection = _program->uniformLocation("projection"); _uniformCache.colorOption = _program->uniformLocation("colorOption"); - _uniformCache.alphaValue = _program->uniformLocation("alphaValue"); - _uniformCache.scaleFactor = _program->uniformLocation("scaleFactor"); - _uniformCache.minBillboardSize = _program->uniformLocation("minBillboardSize"); + _uniformCache.magnitudeExponent = _program->uniformLocation("magnitudeExponent"); + _uniformCache.sharpness = _program->uniformLocation("sharpness"); + _uniformCache.billboardSize = _program->uniformLocation("billboardSize"); _uniformCache.screenSize = _program->uniformLocation("screenSize"); - _uniformCache.scaling = _program->uniformLocation("scaling"); _uniformCache.psfTexture = _program->uniformLocation("psfTexture"); _uniformCache.colorTexture = _program->uniformLocation("colorTexture"); @@ -331,25 +332,29 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { glDepthMask(false); _program->activate(); - // @Check overwriting the scaling from the camera; error as parsec->meter conversion - // is done twice? ---abock - glm::vec2 scaling = glm::vec2(1, -19); + glm::mat4 model = + glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * + glm::dmat4(data.modelTransform.rotation) * + glm::dmat4(glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale))); - _program->setUniform(_uniformCache.view, data.camera.viewMatrix()); - _program->setUniform(_uniformCache.projection, data.camera.projectionMatrix()); + glm::mat4 view = data.camera.combinedViewMatrix(); + glm::mat4 projection = data.camera.projectionMatrix(); + float viewScaling = data.camera.scaling(); + + _program->setUniform(_uniformCache.model, model); + _program->setUniform(_uniformCache.view, view); + _program->setUniform(_uniformCache.projection, projection); + _program->setUniform(_uniformCache.viewScaling, viewScaling); _program->setUniform(_uniformCache.colorOption, _colorOption); - _program->setUniform(_uniformCache.alphaValue, _alphaValue); - _program->setUniform(_uniformCache.scaleFactor, _scaleFactor); - _program->setUniform(_uniformCache.minBillboardSize, _minBillboardSize); + _program->setUniform(_uniformCache.magnitudeExponent, _magnitudeExponent); + _program->setUniform(_uniformCache.sharpness, _sharpness); + _program->setUniform(_uniformCache.billboardSize, _billboardSize); _program->setUniform( _uniformCache.screenSize, glm::vec2(OsEng.renderEngine().renderingResolution()) ); - setPscUniforms(*_program.get(), data.camera, data.position); - _program->setUniform(_uniformCache.scaling, scaling); - ghoul::opengl::TextureUnit psfUnit; psfUnit.activate(); _pointSpreadFunctionTexture->bind(); @@ -552,14 +557,15 @@ void RenderableStars::update(const UpdateData&) { if (_program->isDirty()) { _program->rebuildFromFile(); + _uniformCache.model = _program->uniformLocation("model"); _uniformCache.view = _program->uniformLocation("view"); + _uniformCache.viewScaling = _program->uniformLocation("viewScaling"); _uniformCache.projection = _program->uniformLocation("projection"); _uniformCache.colorOption = _program->uniformLocation("colorOption"); - _uniformCache.alphaValue = _program->uniformLocation("alphaValue"); - _uniformCache.scaleFactor = _program->uniformLocation("scaleFactor"); - _uniformCache.minBillboardSize = _program->uniformLocation("minBillboardSize"); + _uniformCache.magnitudeExponent = _program->uniformLocation("magnitudeExponent"); + _uniformCache.sharpness = _program->uniformLocation("sharpness"); + _uniformCache.billboardSize = _program->uniformLocation("billboardSize"); _uniformCache.screenSize = _program->uniformLocation("screenSize"); - _uniformCache.scaling = _program->uniformLocation("scaling"); _uniformCache.psfTexture = _program->uniformLocation("psfTexture"); _uniformCache.colorTexture = _program->uniformLocation("colorTexture"); } @@ -735,51 +741,20 @@ bool RenderableStars::saveCachedFile(const std::string& file) const { void RenderableStars::createDataSlice(ColorOption option) { _slicedData.clear(); - // This is only temporary until the scalegraph is in place ---abock - float minDistance = std::numeric_limits::max(); - float maxDistance = -std::numeric_limits::max(); - - for (size_t i = 0; i < _fullData.size(); i+=_nValuesPerStar) { - float distLy = _fullData[i + 6]; - //if (distLy < 20.f) { - minDistance = std::min(minDistance, distLy); - maxDistance = std::max(maxDistance, distLy); - //} - } - for (size_t i = 0; i < _fullData.size(); i+=_nValuesPerStar) { glm::vec3 p = glm::vec3(_fullData[i + 0], _fullData[i + 1], _fullData[i + 2]); - - // This is only temporary until the scalegraph is in place. It places all stars - // on a sphere with a small variation in the distance to account for blending - // issues ---abock - //if (p != glm::vec3(0.f)) - // p = glm::normalize(p); - - //float distLy = _fullData[i + 6]; - //float normalizedDist = (distLy - minDistance) / (maxDistance - minDistance); - //float distance = 18.f - normalizedDist / 1.f ; - - - //psc position = psc(glm::vec4(p, distance)); - - // Convert parsecs -> meter - psc position = psc(glm::vec4(p * 0.308567756f, 17)); - - //position[1] *= parsecsToMetersFactor[0]; - //position[2] *= parsecsToMetersFactor[0]; - //position[3] += parsecsToMetersFactor[1]; + p *= openspace::distanceconstants::Parsec; switch (option) { case ColorOption::Color: { union { ColorVBOLayout value; - std::array data; + std::array data; } layout; layout.value.position = { { - position[0], position[1], position[2], position[3] + p[0], p[1], p[2], 1.0 } }; #ifdef USING_STELLAR_TEST_GRID @@ -802,11 +777,11 @@ void RenderableStars::createDataSlice(ColorOption option) { { union { VelocityVBOLayout value; - std::array data; + std::array data; } layout; layout.value.position = { { - position[0], position[1], position[2], position[3] + p[0], p[1], p[2], 1.0 } }; layout.value.bvColor = _fullData[i + 3]; @@ -826,11 +801,11 @@ void RenderableStars::createDataSlice(ColorOption option) { { union { SpeedVBOLayout value; - std::array data; + std::array data; } layout; layout.value.position = { { - position[0], position[1], position[2], position[3] + p[0], p[1], p[2], 1.0 } }; layout.value.bvColor = _fullData[i + 3]; diff --git a/modules/space/rendering/renderablestars.h b/modules/space/rendering/renderablestars.h index fd2cd92e5a..3e8ced2282 100644 --- a/modules/space/rendering/renderablestars.h +++ b/modules/space/rendering/renderablestars.h @@ -86,13 +86,13 @@ private: properties::OptionProperty _colorOption; bool _dataIsDirty; - properties::FloatProperty _alphaValue; - properties::FloatProperty _scaleFactor; - properties::FloatProperty _minBillboardSize; + properties::FloatProperty _magnitudeExponent; + properties::FloatProperty _sharpness; + properties::FloatProperty _billboardSize; std::unique_ptr _program; - UniformCache(view, projection, colorOption, alphaValue, scaleFactor, - minBillboardSize, screenSize, scaling, psfTexture, colorTexture) _uniformCache; + UniformCache(model, view, viewScaling, projection, colorOption, magnitudeExponent, sharpness, + billboardSize, screenSize, scaling, psfTexture, colorTexture) _uniformCache; std::string _speckFile; diff --git a/modules/space/shaders/star_fs.glsl b/modules/space/shaders/star_fs.glsl index 9ee5b90c4f..0c53b621b2 100644 --- a/modules/space/shaders/star_fs.glsl +++ b/modules/space/shaders/star_fs.glsl @@ -23,7 +23,7 @@ ****************************************************************************************/ #include "fragment.glsl" -#include "PowerScaling/powerScaling_fs.hglsl" +#include "floatoperations.glsl" // keep in sync with renderablestars.h:ColorOption enum const int COLOROPTION_COLOR = 0; @@ -32,9 +32,9 @@ const int COLOROPTION_SPEED = 2; uniform sampler2D psfTexture; uniform sampler1D colorTexture; -uniform float minBillboardSize; -uniform float alphaValue; +uniform float magnitudeExponent; +uniform float sharpness; uniform int colorOption; in vec4 vs_position; @@ -43,13 +43,7 @@ in vec3 ge_brightness; in vec3 ge_velocity; in float ge_speed; in vec2 texCoord; -in float billboardSize; - -#include "fragment.glsl" -//#include "PowerScaling/powerScaling_fs.hglsl" - -uniform vec2 magnitudeClamp; - +in float ge_observationDistance; vec4 bv2rgb(float bv) { // BV is [-0.4,2.0] @@ -60,7 +54,7 @@ vec4 bv2rgb(float bv) { Fragment getFragment() { // Something in the color calculations need to be changed because before it was dependent // on the gl blend functions since the abuffer was not involved - + vec4 color = vec4(0.0); switch (colorOption) { case COLOROPTION_COLOR: @@ -77,19 +71,15 @@ Fragment getFragment() { vec4 textureColor = texture(psfTexture, texCoord); vec4 fullColor = vec4(color.rgb, textureColor.a); - fullColor.a *= alphaValue; + fullColor.a = pow(fullColor.a, sharpness); - vec4 position = vs_position; - // This has to be fixed when the scale graph is in place ---emiax - position.w = 15; + float d = magnitudeExponent - log(ge_observationDistance) / log(10.0); + fullColor.a *= clamp(d, 0.0, 1.0); Fragment frag; frag.color = fullColor; - frag.depth = pscDepth(position); - - // G-Buffer + frag.depth = safeLength(vs_position); frag.gPosition = ge_gPosition; - // There is no normal here frag.gNormal = vec4(0.0, 0.0, 0.0, 1.0); if (fullColor.a == 0) { diff --git a/modules/space/shaders/star_ge.glsl b/modules/space/shaders/star_ge.glsl index b6fc81b941..3b2b95573c 100644 --- a/modules/space/shaders/star_ge.glsl +++ b/modules/space/shaders/star_ge.glsl @@ -24,15 +24,14 @@ #version __CONTEXT__ -#include "PowerScaling/powerScalingMath.hglsl" +#include "floatoperations.glsl" layout(points) in; -in vec4 psc_position[]; + in vec3 vs_brightness[]; in vec3 vs_velocity[]; in vec4 vs_gPosition[]; in float vs_speed[]; -in vec4 cam_position[]; layout(triangle_strip, max_vertices = 4) out; @@ -42,12 +41,11 @@ out vec3 ge_brightness; out vec3 ge_velocity; out float ge_speed; out vec2 texCoord; -out float billboardSize; - -uniform mat4 projection; +out float ge_observationDistance; +uniform float viewScaling; uniform float scaleFactor; -uniform float minBillboardSize; +uniform float billboardSize; uniform vec2 screenSize; const vec2 corners[4] = vec2[4]( @@ -57,50 +55,27 @@ const vec2 corners[4] = vec2[4]( vec2(1.0, 0.0) ); - void main() { - // JCC: We want to display the Sun. - // if ((psc_position[0].x == 0.0) && - // (psc_position[0].y == 0.0) && - // (psc_position[0].z == 0.0)) - // { - // return; - // } - ge_brightness = vs_brightness[0]; ge_velocity = vs_velocity[0]; ge_speed = vs_speed[0]; float absoluteMagnitude = vs_brightness[0].z; - float modifiedSpriteSize = - exp((-30.623 - absoluteMagnitude) * 0.462) * scaleFactor * 2000; - vec4 projPos[4]; - for (int i = 0; i < 4; ++i) { - vec4 p1 = gl_in[0].gl_Position; - p1.xy += vec2(modifiedSpriteSize * (corners[i] - vec2(0.5))); - projPos[i] = projection * p1; - } - - // Calculate the positions of the lower left and upper right corners of the - // billboard in screen-space - vec2 ll = (((projPos[1].xy / projPos[1].w) + 1.0) / 2.0) * screenSize; - vec2 ur = (((projPos[2].xy / projPos[2].w) + 1.0) / 2.0) * screenSize; - - // The billboard is smaller than one pixel, we can discard it - float sizeInPixels = length(ll - ur); - if (sizeInPixels < minBillboardSize) { - return; - } + vec4 projectedPoint = gl_in[0].gl_Position; + vec2 starSize = vec2(billboardSize) / screenSize * projectedPoint.w; for (int i = 0; i < 4; i++) { vs_position = gl_in[0].gl_Position; - gl_Position = projPos[i]; + gl_Position = projectedPoint + vec4(starSize * (corners[i] - 0.5), 0.0, 0.0); + gl_Position.z = 0.0; + texCoord = corners[i]; // G-Buffer ge_gPosition = vs_gPosition[0]; - billboardSize = sizeInPixels; + ge_observationDistance = safeLength(vs_gPosition[0] / viewScaling); + EmitVertex(); } diff --git a/modules/space/shaders/star_vs.glsl b/modules/space/shaders/star_vs.glsl index 7ff61c0f5e..594bcfbc5a 100644 --- a/modules/space/shaders/star_vs.glsl +++ b/modules/space/shaders/star_vs.glsl @@ -31,30 +31,24 @@ in vec3 in_brightness; in vec3 in_velocity; in float in_speed; -out vec4 psc_position; out vec3 vs_brightness; out vec3 vs_velocity; out float vs_speed; out vec4 vs_gPosition; +uniform mat4 model; uniform mat4 view; uniform mat4 projection; - void main() { - vec4 p = in_position; - psc_position = p; vs_brightness = in_brightness; vs_velocity = in_velocity; vs_speed = in_speed; - vec4 tmp = p; - vec4 position = pscTransform(tmp, mat4(1.0)); - - // G-Buffer - vs_gPosition = view * (vec4(1E19, 1E19, 1E19, 1.0) * position); - - position = view * position; - - gl_Position = position; + vec3 modelPosition = in_position.xyz; + + vec4 viewPosition = view * model * vec4(modelPosition, 1.0); + + vs_gPosition = viewPosition; + gl_Position = projection * vs_gPosition; } From 954e3a888d061b850979d5c70e185f8118dfb603 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Fri, 16 Feb 2018 13:52:42 +0100 Subject: [PATCH 07/12] Interpolate stereoscopic depth when changing focus node --- .../openspace/interaction/orbitalnavigator.h | 10 ++ src/interaction/orbitalnavigator.cpp | 91 +++++++++++++++---- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/include/openspace/interaction/orbitalnavigator.h b/include/openspace/interaction/orbitalnavigator.h index 47f0614412..b6ace82be8 100644 --- a/include/openspace/interaction/orbitalnavigator.h +++ b/include/openspace/interaction/orbitalnavigator.h @@ -88,13 +88,18 @@ private: properties::FloatProperty _stereoscopicDepthOfFocusSurface; properties::FloatProperty _staticViewScaleExponent; + properties::FloatProperty _rotateToFocusInterpolationTime; + properties::FloatProperty _stereoInterpolationTime; + MouseStates _mouseStates; SceneGraphNode* _focusNode = nullptr; glm::dvec3 _previousFocusNodePosition; glm::dquat _previousFocusNodeRotation; + double _currentCameraToSurfaceDistance; Interpolator _rotateToFocusNodeInterpolator; + Interpolator _cameraToSurfaceDistanceInterpolator; Interpolator _followRotationInterpolator; /** @@ -129,6 +134,11 @@ private: glm::dquat interpolateLocalRotation(double deltaTime, const glm::dquat& localCameraRotation); + + double interpolateCameraToSurfaceDistance(double deltaTime, + double currentDistance, + double targetDistance); + /** * Translates the horizontal direction. If far from the focus object, this will * result in an orbital rotation around the object. This function does not affect the diff --git a/src/interaction/orbitalnavigator.cpp b/src/interaction/orbitalnavigator.cpp index b5fbecd444..3f68f1b411 100644 --- a/src/interaction/orbitalnavigator.cpp +++ b/src/interaction/orbitalnavigator.cpp @@ -85,6 +85,22 @@ namespace { "" // @TODO Missing documentation }; + static const openspace::properties::Property::PropertyInfo + StereoInterpolationTimeInfo = { + "StereoInterpolationTime", + "Stereo interpolation time", + "The time to interpolate to a new stereoscopic depth " + "when the focus node is changed" + }; + + static const openspace::properties::Property::PropertyInfo + RotateToFocusInterpolationTimeInfo = { + "RotateToFocusInterpolationTime", + "Rotate to focus interpolation time", + "The time to interpolate the camera rotation " + "when the focus node is changed" + }; + static const openspace::properties::Property::PropertyInfo UseAdaptiveStereoscopicDepthInfo = { "UseAdaptiveStereoscopicDepth", @@ -137,6 +153,8 @@ OrbitalNavigator::OrbitalNavigator() , _useAdaptiveStereoscopicDepth(UseAdaptiveStereoscopicDepthInfo, true) , _staticViewScaleExponent(StaticViewScaleExponentInfo, 0.f, -30, 10) , _stereoscopicDepthOfFocusSurface(StereoscopicDepthOfFocusSurfaceInfo, 8, 0.25, 100) + , _rotateToFocusInterpolationTime(RotateToFocusInterpolationTimeInfo, 2.0, 0.0, 10.0) + , _stereoInterpolationTime(StereoInterpolationTimeInfo, 8.0, 0.0, 10.0) { auto smoothStep = [](double t) { @@ -164,6 +182,7 @@ OrbitalNavigator::OrbitalNavigator() return (6 * (t + t*t) / (1 - 3 * t*t + 2 * t*t*t)); }; _rotateToFocusNodeInterpolator.setTransferFunction(smoothStepDerivedTranferFunction); + _cameraToSurfaceDistanceInterpolator.setTransferFunction(smoothStepDerivedTranferFunction); // Define callback functions for changed properties _friction.roll.onChange([&]() { @@ -192,6 +211,9 @@ OrbitalNavigator::OrbitalNavigator() addProperty(_useAdaptiveStereoscopicDepth); addProperty(_staticViewScaleExponent); addProperty(_stereoscopicDepthOfFocusSurface); + + addProperty(_rotateToFocusInterpolationTime); + addProperty(_stereoInterpolationTime); } OrbitalNavigator::~OrbitalNavigator() {} @@ -299,11 +321,17 @@ void OrbitalNavigator::updateCameraStateFromMouseStates(Camera& camera, double d camera.setRotation(camRot.globalRotation * camRot.localRotation); if (_useAdaptiveStereoscopicDepth) { - glm::vec3 surfaceToCamera = static_cast( + double targetCameraToSurfaceDistance = glm::length( cameraToSurfaceVector(camPos, centerPos, posHandle) ); + _currentCameraToSurfaceDistance = interpolateCameraToSurfaceDistance( + deltaTime, + _currentCameraToSurfaceDistance, + targetCameraToSurfaceDistance); + camera.setScaling( - _stereoscopicDepthOfFocusSurface / glm::length(surfaceToCamera) + _stereoscopicDepthOfFocusSurface / + static_cast(_currentCameraToSurfaceDistance) ); } else { camera.setScaling(glm::pow(10.f, _staticViewScaleExponent)); @@ -349,9 +377,12 @@ void OrbitalNavigator::startInterpolateCameraDirection(const Camera& camera) { // Minimum is two second. Otherwise proportional to angle _rotateToFocusNodeInterpolator.setInterpolationTime(static_cast( - glm::max(angle * 2.0, 2.0) + glm::max(angle, 1.0) * _rotateToFocusInterpolationTime )); _rotateToFocusNodeInterpolator.start(); + + _cameraToSurfaceDistanceInterpolator.setInterpolationTime(_stereoInterpolationTime); + _cameraToSurfaceDistanceInterpolator.start(); } bool OrbitalNavigator::followingNodeRotation() const { @@ -429,24 +460,48 @@ glm::dquat OrbitalNavigator::rotateLocally(double deltaTime, } glm::dquat OrbitalNavigator::interpolateLocalRotation(double deltaTime, - const glm::dquat& localCameraRotation) + const glm::dquat& localCameraRotation) { - if (_rotateToFocusNodeInterpolator.isInterpolating()) { - double t = _rotateToFocusNodeInterpolator.value(); - _rotateToFocusNodeInterpolator.setDeltaTime(static_cast(deltaTime)); - _rotateToFocusNodeInterpolator.step(); - glm::dquat result = glm::slerp( - localCameraRotation, - glm::dquat(glm::dvec3(0.0)), - glm::min(t * _rotateToFocusNodeInterpolator.deltaTimeScaled(), 1.0)); - if (angle(result) < 0.01) { - _rotateToFocusNodeInterpolator.end(); - } - return result; - } - else { + if (!_rotateToFocusNodeInterpolator.isInterpolating()) { return localCameraRotation; } + double t = _rotateToFocusNodeInterpolator.value(); + _rotateToFocusNodeInterpolator.setDeltaTime(static_cast(deltaTime)); + _rotateToFocusNodeInterpolator.step(); + glm::dquat result = glm::slerp( + localCameraRotation, + glm::dquat(glm::dvec3(0.0)), + glm::min(t * _rotateToFocusNodeInterpolator.deltaTimeScaled(), 1.0)); + if (angle(result) < 0.01) { + _rotateToFocusNodeInterpolator.end(); + } + return result; +} + +double OrbitalNavigator::interpolateCameraToSurfaceDistance(double deltaTime, + double currentDistance, + double targetDistance +) { + if (!_cameraToSurfaceDistanceInterpolator.isInterpolating()) { + return targetDistance; + } + + double t = _cameraToSurfaceDistanceInterpolator.value(); + _cameraToSurfaceDistanceInterpolator.setDeltaTime(static_cast(deltaTime)); + _cameraToSurfaceDistanceInterpolator.step(); + + // Interpolate distance logarithmically. + double result = glm::exp(glm::mix( + glm::log(currentDistance), + glm::log(targetDistance), + glm::min(t * _cameraToSurfaceDistanceInterpolator.deltaTimeScaled(), 1.0))); + + double ratio = currentDistance / targetDistance; + if (glm::abs(ratio - 1.0) < 0.000001) { + _cameraToSurfaceDistanceInterpolator.end(); + } + + return result; } glm::dvec3 OrbitalNavigator::translateHorizontally(double deltaTime, From f129da56483335b57cb80817e85fd81aaaf5e8f9 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Fri, 16 Feb 2018 14:18:16 +0100 Subject: [PATCH 08/12] Additive blending for stars + add star parameters --- data/assets/scene/digitaluniverse/stars.asset | 5 ++++- modules/space/rendering/renderablestars.cpp | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/data/assets/scene/digitaluniverse/stars.asset b/data/assets/scene/digitaluniverse/stars.asset index 939667f169..72c4c14bb9 100644 --- a/data/assets/scene/digitaluniverse/stars.asset +++ b/data/assets/scene/digitaluniverse/stars.asset @@ -29,7 +29,10 @@ local object = { Type = "RenderableStars", File = speck .. "/stars.speck", Texture = textures .. "/halo.png", - ColorMap = colorLUT .. "/colorbv.cmap" + ColorMap = colorLUT .. "/colorbv.cmap", + MagnitudeExponent = 19, + BillboardSize = 30, + Sharpness = 1.3 }, GuiPath = "/Milky Way/Stars" } diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index edbeaf29bd..eb1919b995 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -329,7 +329,9 @@ void RenderableStars::deinitializeGL() { } void RenderableStars::render(const RenderData& data, RendererTasks&) { + glBlendFunc(GL_SRC_ALPHA, GL_ONE); glDepthMask(false); + _program->activate(); glm::mat4 model = @@ -373,6 +375,7 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { _program->deactivate(); glDepthMask(true); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void RenderableStars::update(const UpdateData&) { From 0f7ca1790fd1861cb27ca44bc1d50aae76b687b0 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Mon, 19 Feb 2018 14:22:57 +0100 Subject: [PATCH 09/12] Do not clear the default fbo in framebuffer renderer. Already handled by SGCT. --- src/rendering/framebufferrenderer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 87ff1be165..58c827d893 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -966,7 +966,6 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); GLenum dBuffer[1] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, dBuffer); - glClear(GL_COLOR_BUFFER_BIT); performDeferredTasks(tasks.deferredcasterTasks); From 5a23a3e93f2588346da4efe25131e1b391dac850 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Mon, 19 Feb 2018 22:11:12 +0100 Subject: [PATCH 10/12] Fix atmosphere stereo bugs --- include/openspace/util/camera.h | 1 + .../rendering/atmospheredeferredcaster.cpp | 15 ++++++++++---- .../shaders/atmosphere_deferred_fs.glsl | 3 ++- src/rendering/framebufferrenderer.cpp | 7 ++++++- src/util/camera.cpp | 20 +++++++++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/include/openspace/util/camera.h b/include/openspace/util/camera.h index b3b2e28d03..d691f1181f 100644 --- a/include/openspace/util/camera.h +++ b/include/openspace/util/camera.h @@ -101,6 +101,7 @@ public: // Accessors // Remove Vec3 from the name when psc is gone const Vec3& positionVec3() const; + const Vec3 eyePositionVec3() const; const Vec3& unsynchedPositionVec3() const; const Vec3& focusPositionVec3() const; const Vec3& viewDirectionWorldSpace() const; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 23bec4878f..5821803910 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -192,7 +192,7 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, _modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0) ); - double distance = glm::distance(tPlanetPosWorld, renderData.camera.positionVec3()); + double distance = glm::distance(tPlanetPosWorld, renderData.camera.eyePositionVec3()); if (distance > DISTANCE_CULLING) { program.setUniform("cullAtmosphere", 1); } @@ -254,11 +254,16 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, glm::inverse(dfScaleCamTransf) ); + program.setUniform( + "dCamScaleTransform", + renderData.camera.viewScaleMatrix() + ); + // World to Eye Space in OS program.setUniform( "dInverseCamScaleTransform", glm::inverse(renderData.camera.viewScaleMatrix()) - ); + ); program.setUniform( "dInverseCamRotTransform", @@ -284,7 +289,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, program.setUniform("dInverseSgctProjectionMatrix", dInverseProjection); program.setUniform("dObjpos", glm::dvec4(renderData.position.dvec3(), 1.0)); - program.setUniform("dCampos", renderData.camera.positionVec3()); + + glm::dvec3 campos = renderData.camera.eyePositionVec3(); + program.setUniform("dCampos", campos); double lt; glm::dvec3 sunPosWorld = SpiceManager::ref().targetPosition( @@ -300,7 +307,7 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, // Sun following camera position if (_sunFollowingCameraEnabled) { sunPosObj = inverseModelMatrix * glm::dvec4( - renderData.camera.positionVec3(), + renderData.camera.eyePositionVec3(), 1.0 ); } diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index a4c434f2b4..21a73bfc69 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -88,6 +88,7 @@ uniform sampler2DMS mainColorTexture; uniform dmat4 dInverseSgctEyeToWorldTranform; // SGCT Eye to OS World uniform dmat4 dSgctEyeToOSEyeTranform; // SGCT Eye to OS Eye * uniform dmat4 dInverseSgctProjectionMatrix; // Clip to SGCT Eye * +uniform dmat4 dCamScaleTransform; uniform dmat4 dInverseCamScaleTransform; uniform dmat4 dInverseCamRotTransform; uniform dmat4 dInverseModelTransformMatrix; @@ -639,7 +640,7 @@ void main() { // OS Eye to World coords dvec4 tmpSInvPos = dInverseCamScaleTransform * dSgctEyeToOSEyeTranform * position; dvec4 tmpRInvPos = dInverseCamRotTransform * tmpSInvPos;//dSgctEyeToOSEyeTranform * position; - dvec4 fragWorldCoords = dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); + dvec4 fragWorldCoords = dCamScaleTransform * dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); // World to Object (Normal and Position in meters) dvec4 fragObjectCoords = dInverseModelTransformMatrix * fragWorldCoords; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 58c827d893..5c142dd588 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -331,7 +331,12 @@ void FramebufferRenderer::update() { for (auto &program : _deferredcastPrograms) { if (program.second && program.second->isDirty()) { - program.second->rebuildFromFile(); + try { + program.second->rebuildFromFile(); + } + catch (const ghoul::RuntimeError& e) { + LERRORC(e.component, e.message); + } } } } diff --git a/src/util/camera.cpp b/src/util/camera.cpp index 3da20a3f69..bc59e4dc66 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -121,6 +121,26 @@ namespace openspace { return _position; } + const Camera::Vec3 Camera::eyePositionVec3() const { + glm::dvec4 eyeInEyeSpace(0.0, 0.0, 0.0, 1.0); + + glm::dmat4 invViewMatrix = glm::inverse(sgctInternal.viewMatrix()); + glm::dmat4 invRotationMatrix = glm::inverse(viewRotationMatrix()); + glm::dmat4 invTranslationMatrix = + glm::translate(Mat4(1.0), static_cast(_position)); + + glm::dmat4 invViewScale = glm::inverse(viewScaleMatrix()); + + glm::dvec4 eyeInWorldSpace = + invTranslationMatrix * + invRotationMatrix * + invViewScale * + invViewMatrix * + eyeInEyeSpace; + + return glm::dvec3(eyeInWorldSpace.x, eyeInWorldSpace.y, eyeInWorldSpace.z); + } + const Camera::Vec3& Camera::unsynchedPositionVec3() const { return _position; } From ab1543841ab6dbedf5c707ac4bd71e5e1b2910d9 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Wed, 21 Feb 2018 14:02:54 +0100 Subject: [PATCH 11/12] Fix atmosphere stereo bug: positions are stored in camera rig space --- .../atmosphere/shaders/atmosphere_deferred_fs.glsl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index 21a73bfc69..b48a085d31 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -265,12 +265,11 @@ void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray, sgctEyeCoords.w = clipCoords.z;//1.0; // SGCT Eye to OS Eye - dvec4 tOSEyeCoordsInv = dSgctEyeToOSEyeTranform * sgctEyeCoords; + dvec4 tOSEyeCoords = dSgctEyeToOSEyeTranform * sgctEyeCoords; // OS Eye to World coords - dvec4 tmpSInv = dInverseCamScaleTransform * tOSEyeCoordsInv; - dvec4 tmpRInv = dInverseCamRotTransform * tmpSInv;//tOSEyeCoordsInv; - dvec4 worldCoords = dvec4(dvec3(tmpRInv) + dCampos, 1.0); + dvec4 cameraOffsetWorldCoords = dInverseCamRotTransform * dInverseCamScaleTransform * tOSEyeCoords; + dvec4 worldCoords = dvec4(dvec3(cameraOffsetWorldCoords) + dCampos, 1.0); // World to Object dvec4 objectCoords = dInverseModelTransformMatrix * worldCoords; @@ -638,9 +637,8 @@ void main() { // when using their positions later, one must convert them to the planet's coords // OS Eye to World coords - dvec4 tmpSInvPos = dInverseCamScaleTransform * dSgctEyeToOSEyeTranform * position; - dvec4 tmpRInvPos = dInverseCamRotTransform * tmpSInvPos;//dSgctEyeToOSEyeTranform * position; - dvec4 fragWorldCoords = dCamScaleTransform * dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); + dvec4 fragWorldCoordsOffset = dInverseCamRotTransform * dInverseCamScaleTransform * position; + dvec4 fragWorldCoords = dvec4(dvec3(fragWorldCoordsOffset) + dCampos, 1.0); // World to Object (Normal and Position in meters) dvec4 fragObjectCoords = dInverseModelTransformMatrix * fragWorldCoords; From 7e5db07bd525fa9420f7e3e566306472581d7aa5 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Wed, 21 Feb 2018 21:40:21 +0100 Subject: [PATCH 12/12] Fix more atmosphere stereo bugs --- .../rendering/atmospheredeferredcaster.cpp | 8 +++--- .../shaders/atmosphere_deferred_fs.glsl | 25 +++++++++---------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 5821803910..eb6e7632b6 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -272,11 +272,6 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, ) ); - program.setUniform( - "dInverseSgctEyeToWorldTranform", - glm::inverse(renderData.camera.combinedViewMatrix()) - ); - // Eye Space in OS to Eye Space in SGCT glm::dmat4 dOsEye2SGCTEye = glm::dmat4(renderData.camera.viewMatrix()); glm::dmat4 dSgctEye2OSEye = glm::inverse(dOsEye2SGCTEye); @@ -293,6 +288,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, glm::dvec3 campos = renderData.camera.eyePositionVec3(); program.setUniform("dCampos", campos); + glm::dvec3 camRigPos = renderData.camera.positionVec3(); + program.setUniform("dCamRigPos", camRigPos); + double lt; glm::dvec3 sunPosWorld = SpiceManager::ref().targetPosition( "SUN", diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index b48a085d31..553051baf3 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -85,7 +85,6 @@ uniform sampler2DMS mainNormalTexture; uniform sampler2DMS mainColorTexture; // Model Transform Matrix Used for Globe Rendering -uniform dmat4 dInverseSgctEyeToWorldTranform; // SGCT Eye to OS World uniform dmat4 dSgctEyeToOSEyeTranform; // SGCT Eye to OS Eye * uniform dmat4 dInverseSgctProjectionMatrix; // Clip to SGCT Eye * uniform dmat4 dCamScaleTransform; @@ -96,6 +95,7 @@ uniform dmat4 dModelTransformMatrix; //uniform dmat4 dSGCTEyeToOSWorldTransformMatrix; uniform dvec4 dObjpos; +uniform dvec3 dCamRigPos; uniform dvec3 dCampos; uniform dvec3 sunDirectionObj; uniform dvec3 ellipsoidRadii; @@ -253,23 +253,20 @@ void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray, // ====================================== // ======= Avoiding Some Matrices ======= - // NDC to clip coordinates (gl_FragCoord.w = 1.0/w_clip) - // Using the interpolated coords: - // Assuming Red Book is right: z_ndc e [0, 1] and not [-1, 1] + // Compute positions and directions in world space. dvec2 samplePos = dvec2(msaaSamplePatter[mssaSample], msaaSamplePatter[mssaSample+1]); - dvec4 clipCoords = dvec4(interpolatedNDCPos.xy + samplePos, interpolatedNDCPos.z, 1.0) / gl_FragCoord.w; + dvec4 clipCoords = dvec4(interpolatedNDCPos.xy + samplePos, 1.0, 1.0); // Clip to SGCT Eye dvec4 sgctEyeCoords = dInverseSgctProjectionMatrix * clipCoords; - sgctEyeCoords.w = clipCoords.z;//1.0; // SGCT Eye to OS Eye dvec4 tOSEyeCoords = dSgctEyeToOSEyeTranform * sgctEyeCoords; - + // OS Eye to World coords - dvec4 cameraOffsetWorldCoords = dInverseCamRotTransform * dInverseCamScaleTransform * tOSEyeCoords; - dvec4 worldCoords = dvec4(dvec3(cameraOffsetWorldCoords) + dCampos, 1.0); + dvec4 offsetWorldCoords = dInverseCamRotTransform * dInverseCamScaleTransform * tOSEyeCoords; + dvec4 worldCoords = dvec4(dvec3(offsetWorldCoords) + dCampos, 1.0); // World to Object dvec4 objectCoords = dInverseModelTransformMatrix * worldCoords; @@ -313,6 +310,9 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor out vec3 attenuation, const vec3 fragPosObj, const double maxLength, const double pixelDepth, const vec4 spaceColor, const float sunIntensity) { + + const float INTERPOLATION_EPS = 0.004f; // precision const from Brunetton + vec3 radiance; r = length(x); @@ -344,7 +344,7 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor float mu0 = dot(x0, v) * invr0; bool groundHit = false; - if ((pixelDepth > 0.0) && (pixelDepth < maxLength)) { + if ((pixelDepth > INTERPOLATION_EPS) && (pixelDepth < maxLength)) { t = float(pixelDepth); groundHit = true; @@ -377,7 +377,6 @@ vec3 inscatterRadiance(inout vec3 x, inout float t, inout float irradianceFactor // In order to avoid imprecision problems near horizon, // we interpolate between two points: above and below horizon - const float INTERPOLATION_EPS = 0.004f; // precision const from Brunetton if (abs(mu - muHorizon) < INTERPOLATION_EPS) { // We want an interpolation value close to 1/2, so the // contribution of each radiance value is almost the same @@ -637,8 +636,8 @@ void main() { // when using their positions later, one must convert them to the planet's coords // OS Eye to World coords - dvec4 fragWorldCoordsOffset = dInverseCamRotTransform * dInverseCamScaleTransform * position; - dvec4 fragWorldCoords = dvec4(dvec3(fragWorldCoordsOffset) + dCampos, 1.0); + dvec4 fragWorldCoordsOffset = dInverseCamRotTransform * dInverseCamScaleTransform * dSgctEyeToOSEyeTranform * position; + dvec4 fragWorldCoords = dvec4(dvec3(fragWorldCoordsOffset) + dCamRigPos, 1.0); // World to Object (Normal and Position in meters) dvec4 fragObjectCoords = dInverseModelTransformMatrix * fragWorldCoords;