diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index b325ac3cb6..d424d386e5 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -233,38 +233,48 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, program.setUniform(_uniformCache2.dInverseModelTransformMatrix, inverseModelMatrix); program.setUniform(_uniformCache2.dModelTransformMatrix, _modelTransform); - // Eye Space in OS to Eye Space in SGCT + // Eye Space in SGCT to Eye Space in OS glm::dmat4 dSgctEye2OSEye = glm::inverse( - glm::dmat4(renderData.camera.viewMatrix())); - - // Eye Space in SGCT to Projection (Clip) Space in SGCT - glm::dmat4 dInverseProjection = glm::inverse( - glm::dmat4(renderData.camera.projectionMatrix())); + glm::dmat4(renderData.camera.viewMatrix())); glm::dmat4 dInverseSGCTEyeToTmpRotTransformMatrix = glm::mat4_cast( static_cast(renderData.camera.rotationQuaternion()) ) * glm::inverse(renderData.camera.viewScaleMatrix()) * dSgctEye2OSEye; + + // Eye Space in SGCT to OS Camera Before Rotation + program.setUniform(_uniformCache2.dInverseSGCTEyeToTmpRotTransformMatrix, + dInverseSGCTEyeToTmpRotTransformMatrix); - + // SGCT Projection to SGCT Eye Space + glm::dmat4 dInverseProjection = glm::inverse( + glm::dmat4(renderData.camera.projectionMatrix())); + + // SGCT Projection to OS Camera Before Rotation glm::dmat4 dInverseProjectionToTmpRotTransformMatrix = dInverseSGCTEyeToTmpRotTransformMatrix * dInverseProjection; - double *mSource = (double*)glm::value_ptr(dInverseProjectionToTmpRotTransformMatrix); - mSource[12] += renderData.camera.positionVec3().x; + // SGCT Projection to World Space + glm::dmat4 dInverseSgctProjectionToWorldTransformMatrix(dInverseProjectionToTmpRotTransformMatrix); + double *mSource = (double*)glm::value_ptr(dInverseSgctProjectionToWorldTransformMatrix); + mSource[12] += renderData.camera.eyePositionVec3().x; + mSource[13] += renderData.camera.eyePositionVec3().y; + mSource[14] += renderData.camera.eyePositionVec3().z; + /*mSource[12] += renderData.camera.positionVec3().x; mSource[13] += renderData.camera.positionVec3().y; - mSource[14] += renderData.camera.positionVec3().z; + mSource[14] += renderData.camera.positionVec3().z;*/ mSource[15] = 1.0; - + + // SGCT Projection to Object Space glm::dmat4 inverseWholeMatrixPipeline = inverseModelMatrix * - dInverseProjectionToTmpRotTransformMatrix; + dInverseSgctProjectionToWorldTransformMatrix; program.setUniform(_uniformCache2.dInverseSgctProjectionToModelTransformMatrix, inverseWholeMatrixPipeline); - program.setUniform(_uniformCache2.dInverseSGCTEyeToTmpRotTransformMatrix, - dInverseSGCTEyeToTmpRotTransformMatrix); - - program.setUniform(_uniformCache2.dCampos, renderData.camera.eyePositionVec3()); - + program.setUniform(_uniformCache2.dCamRigPos, renderData.camera.positionVec3()); + program.setUniform("dSGCTEyePosWorld", renderData.camera.eyePositionVec3()); + program.setUniform("dSGCTEyePosObj", inverseModelMatrix * glm::dvec4(renderData.camera.eyePositionVec3(), 1.0)); + + //glm::dvec4 camPosObjCoords = inverseModelMatrix * glm::dvec4(renderData.camera.eyePositionVec3(), 1.0); glm::dvec4 camPosObjCoords = inverseModelMatrix * glm::dvec4(renderData.camera.positionVec3(), 1.0); program.setUniform(_uniformCache2.dCamPosObj, camPosObjCoords); @@ -451,7 +461,7 @@ void AtmosphereDeferredcaster::initializeCachedVariables(ghoul::opengl::ProgramO _uniformCache2.dModelTransformMatrix = program.uniformLocation("dModelTransformMatrix"); _uniformCache2.dInverseSgctProjectionToModelTransformMatrix = program.uniformLocation("dInverseSgctProjectionToModelTransformMatrix"); _uniformCache2.dInverseSGCTEyeToTmpRotTransformMatrix = program.uniformLocation("dInverseSGCTEyeToTmpRotTransformMatrix"); - _uniformCache2.dCampos = program.uniformLocation("dCampos"); + _uniformCache2.dCamRigPos = program.uniformLocation("dCamRigPos"); _uniformCache2.dCamPosObj = program.uniformLocation("dCamPosObj"); _uniformCache2.sunDirectionObj = program.uniformLocation("sunDirectionObj"); _uniformCache2.hardShadows = program.uniformLocation("hardShadows"); diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.h b/modules/atmosphere/rendering/atmospheredeferredcaster.h index 2fa9dd6d96..aec647cef5 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.h +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.h @@ -137,7 +137,7 @@ private: UniformCache(dInverseModelTransformMatrix, dModelTransformMatrix, dInverseSgctProjectionToModelTransformMatrix, dInverseSGCTEyeToTmpRotTransformMatrix, - dCampos, dCamPosObj, sunDirectionObj, + dCamRigPos, dCamPosObj, sunDirectionObj, hardShadows, transmittanceTexture, irradianceTexture, inscatterTexture) _uniformCache2; diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index 46cb2bd321..7a2f74a7d0 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -89,7 +89,9 @@ uniform dmat4 dModelTransformMatrix; uniform dmat4 dInverseSGCTEyeToTmpRotTransformMatrix; uniform dmat4 dInverseSgctProjectionToModelTransformMatrix; -uniform dvec3 dCampos; +uniform dvec3 dSGCTEyePosWorld; +uniform dvec4 dSGCTEyePosObj; +uniform dvec3 dCamRigPos; uniform dvec4 dCamPosObj; uniform dvec3 sunDirectionObj; @@ -186,12 +188,12 @@ struct dRay { * intersection of the ray with atmosphere when the eye position * is inside atmosphere. */ -bool dAtmosphereIntersection(const dvec3 planetPosition, const dRay ray, const float atmRadius, - out bool inside, out float offset, out float maxLength ) { - vec3 l = vec3(planetPosition) - vec3(ray.origin.xyz); - float s = dot(l, vec3(ray.direction.xyz)); - float l2 = dot(l, l); - float r2 = atmRadius * atmRadius; // avoiding surface acne +bool dAtmosphereIntersection(const dvec3 planetPosition, const dRay ray, const double atmRadius, + out bool inside, out double offset, out double maxLength ) { + dvec3 l = planetPosition - ray.origin.xyz; + double s = dot(l, ray.direction.xyz); + double l2 = dot(l, l); + double r2 = atmRadius * atmRadius; // avoiding surface acne // Ray origin (eye position) is behind sphere if ((s < 0.0) && (l2 > r2)) { @@ -201,7 +203,7 @@ bool dAtmosphereIntersection(const dvec3 planetPosition, const dRay ray, const f return false; } - float m2 = l2 - s*s; + double m2 = l2 - s*s; // Ray misses atmospere if (m2 > r2) { @@ -214,7 +216,7 @@ bool dAtmosphereIntersection(const dvec3 planetPosition, const dRay ray, const f // We already now the ray hits the atmosphere // If q = 0.0f, there is only one intersection - float q = sqrt(r2 - m2); + double q = sqrt(r2 - m2); // If l2 < r2, the ray origin is inside the sphere if (l2 > r2) { @@ -249,7 +251,7 @@ void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray, // 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)/ gl_FragCoord.w, 0.0, 1.0); // Clip to Object Coords dvec4 objectCoords = dInverseSgctProjectionToModelTransformMatrix * clipCoords; @@ -260,7 +262,7 @@ void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray, planetPositionObjectCoords = dvec4(0.0, 0.0, 0.0, 1.0); // Camera Position in Object Space - cameraPositionInObject = dCamPosObj; + cameraPositionInObject = dSGCTEyePosObj;//dCamPosObj; // ============================ // ====== Building Ray ======== @@ -608,7 +610,7 @@ void main() { // OS Eye to World coords dvec4 tmpRInvPos = dInverseSGCTEyeToTmpRotTransformMatrix * position; - dvec4 fragWorldCoords = dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); + dvec4 fragWorldCoords = dvec4(dvec3(tmpRInvPos) + dCamRigPos, 1.0); // World to Object (Normal and Position in meters) dvec4 fragObjectCoords = dInverseModelTransformMatrix * fragWorldCoords; diff --git a/modules/globebrowsing/shaders/localchunkedlodpatch_vs.glsl b/modules/globebrowsing/shaders/localchunkedlodpatch_vs.glsl index de8651e9b6..188618e760 100644 --- a/modules/globebrowsing/shaders/localchunkedlodpatch_vs.glsl +++ b/modules/globebrowsing/shaders/localchunkedlodpatch_vs.glsl @@ -110,7 +110,7 @@ void main() { fs_normal = patchNormalModelSpace; positionCameraSpace = p; -#if USE_ECLIPSE_SHADOWS + #if USE_ECLIPSE_SHADOWS positionWorldSpace = vec3(inverseViewTransform * dvec4(p, 1.0)); -#endif + #endif } diff --git a/openspace.cfg b/openspace.cfg index f71fa86c58..17f49c373f 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -25,6 +25,7 @@ return { -- SGCTConfig = sgct.config.single{2560, 1440, shared=true, name="WV_OBS_SPOUT1"}, -- SGCTConfig = "${CONFIG}/spout_output.xml", + -- SGCTConfig = "${CONFIG}/stereo.xml", --SGCTConfig = "${CONFIG}/openvr_oculusRiftCv1.xml", --SGCTConfig = "${CONFIG}/openvr_htcVive.xml", diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index d8aaac64fa..6db7c4bc26 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -302,7 +302,7 @@ namespace openspace { if (program.second->isDirty()) { try { program.second->rebuildFromFile(); - } + } catch (const ghoul::RuntimeError& e) { LERRORC(e.component, e.message); } @@ -313,7 +313,7 @@ namespace openspace { if (program.second->isDirty()) { try { program.second->rebuildFromFile(); - } + } catch (const ghoul::RuntimeError& e) { LERRORC(e.component, e.message); } @@ -324,7 +324,7 @@ namespace openspace { if (program.second->isDirty()) { try { program.second->rebuildFromFile(); - } + } catch (const ghoul::RuntimeError& e) { LERRORC(e.component, e.message); } @@ -335,7 +335,7 @@ namespace openspace { if (program.second && program.second->isDirty()) { try { program.second->rebuildFromFile(); - } + } catch (const ghoul::RuntimeError& e) { LERRORC(e.component, e.message); } @@ -476,7 +476,7 @@ namespace openspace { ExitFragmentShaderPath, dict ); - } + } catch (ghoul::RuntimeError e) { LERROR(e.message); } @@ -489,7 +489,7 @@ namespace openspace { absPath(RaycastFragmentShaderPath), outsideDict ); - } + } catch (ghoul::RuntimeError e) { LERROR(e.message); } @@ -548,7 +548,6 @@ namespace openspace { absPath(vsPath), absPath(deferredShaderPath), deferredDict); - using IgnoreError = ghoul::opengl::ProgramObject::IgnoreError; _deferredcastPrograms[caster]->setIgnoreSubroutineUniformLocationError( IgnoreError::Yes @@ -937,19 +936,13 @@ namespace openspace { 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, @@ -964,54 +957,19 @@ namespace openspace { glDisablei(GL_BLEND, 2); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::background", - OsEng.renderEngine().performanceManager() - ); - } + Time time = OsEng.timeManager().time(); - data.renderBinMask = static_cast(Renderable::RenderBin::Background); - _scene->render(data, tasks); - } - { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::opaque", - OsEng.renderEngine().performanceManager() - ); - } + RenderData data = { *_camera, psc(), time, doPerformanceMeasurements, 0,{} }; + RendererTasks tasks; - data.renderBinMask = static_cast(Renderable::RenderBin::Opaque); - _scene->render(data, tasks); - } - { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::transparent", - OsEng.renderEngine().performanceManager() - ); - } - - data.renderBinMask = static_cast(Renderable::RenderBin::Transparent); - _scene->render(data, tasks); - } - { - std::unique_ptr perfInternal; - if (doPerformanceMeasurements) { - perfInternal = std::make_unique( - "FramebufferRenderer::render::overlay", - OsEng.renderEngine().performanceManager() - ); - } - - data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); - _scene->render(data, tasks); - } + data.renderBinMask = static_cast(Renderable::RenderBin::Background); + _scene->render(data, tasks); + data.renderBinMask = static_cast(Renderable::RenderBin::Opaque); + _scene->render(data, tasks); + data.renderBinMask = static_cast(Renderable::RenderBin::Transparent); + _scene->render(data, tasks); + data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); + _scene->render(data, tasks); { std::unique_ptr perfInternal; @@ -1021,102 +979,14 @@ namespace openspace { OsEng.renderEngine().performanceManager() ); } - - - for (const RaycasterTask& raycasterTask : tasks.raycasterTasks) { - VolumeRaycaster* raycaster = raycasterTask.raycaster; - - glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - ghoul::opengl::ProgramObject* exitProgram = _exitPrograms[raycaster].get(); - if (exitProgram) { - exitProgram->activate(); - raycaster->renderExitPoints(raycasterTask.renderData, *exitProgram); - exitProgram->deactivate(); - } - - glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); - glm::vec3 cameraPosition; - bool cameraIsInside = raycaster->cameraIsInside( - raycasterTask.renderData, - cameraPosition - ); - ghoul::opengl::ProgramObject* raycastProgram = nullptr; - - if (cameraIsInside) { - raycastProgram = _insideRaycastPrograms[raycaster].get(); - if (raycastProgram) { - raycastProgram->activate(); - raycastProgram->setUniform("cameraPosInRaycaster", cameraPosition); - } - else { - raycastProgram = _insideRaycastPrograms[raycaster].get(); - raycastProgram->activate(); - raycastProgram->setUniform("cameraPosInRaycaster", cameraPosition); - } - } - else { - raycastProgram = _raycastPrograms[raycaster].get(); - if (raycastProgram) { - raycastProgram->activate(); - } - else { - raycastProgram = _raycastPrograms[raycaster].get(); - raycastProgram->activate(); - } - } - - if (raycastProgram) { - raycaster->preRaycast(_raycastData[raycaster], *raycastProgram); - - ghoul::opengl::TextureUnit exitColorTextureUnit; - exitColorTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _exitColorTexture); - raycastProgram->setUniform("exitColorTexture", exitColorTextureUnit); - - ghoul::opengl::TextureUnit exitDepthTextureUnit; - exitDepthTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D, _exitDepthTexture); - raycastProgram->setUniform("exitDepthTexture", exitDepthTextureUnit); - - ghoul::opengl::TextureUnit mainDepthTextureUnit; - mainDepthTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainDepthTexture); - raycastProgram->setUniform("mainDepthTexture", mainDepthTextureUnit); - - raycastProgram->setUniform("nAaSamples", _nAaSamples); - raycastProgram->setUniform("windowSize", _resolution); - - glDisable(GL_DEPTH_TEST); - glDepthMask(false); - if (cameraIsInside) { - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - } - else { - raycaster->renderEntryPoints( - raycasterTask.renderData, - *raycastProgram - ); - } - glDepthMask(true); - glEnable(GL_DEPTH_TEST); - - raycaster->postRaycast(_raycastData[raycaster], *raycastProgram); - raycastProgram->deactivate(); - } - else { - LWARNING( - "Raycaster is not attached when trying to perform raycaster task" - ); - } - } + performRaycasterTasks(tasks.raycasterTasks); } - // g-buffer - if (!tasks.deferredcasterTasks.empty()) { + glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); + GLenum dBuffer[1] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, dBuffer); + + { std::unique_ptr perfInternal; if (doPerformanceMeasurements) { perfInternal = std::make_unique( @@ -1124,97 +994,9 @@ namespace openspace { OsEng.renderEngine().performanceManager() ); } - - //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) { - - Deferredcaster* deferredcaster = deferredcasterTask.deferredcaster; - - ghoul::opengl::ProgramObject* deferredcastProgram = nullptr; - - if (deferredcastProgram != _deferredcastPrograms[deferredcaster].get() - || deferredcastProgram == nullptr) { - deferredcastProgram = _deferredcastPrograms[deferredcaster].get(); - } - - if (deferredcastProgram) { - - deferredcastProgram->activate(); - - // adding G-Buffer - ghoul::opengl::TextureUnit mainDColorTextureUnit; - mainDColorTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); - deferredcastProgram->setUniform( - "mainColorTexture", - mainDColorTextureUnit - ); - - ghoul::opengl::TextureUnit mainPositionTextureUnit; - mainPositionTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); - deferredcastProgram->setUniform( - "mainPositionTexture", - mainPositionTextureUnit - ); - - ghoul::opengl::TextureUnit mainNormalTextureUnit; - mainNormalTextureUnit.activate(); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainNormalTexture); - deferredcastProgram->setUniform( - "mainNormalTexture", - mainNormalTextureUnit - ); - - deferredcastProgram->setUniform("nAaSamples", _nAaSamples); - // 48 = 16 samples * 3 coords - deferredcastProgram->setUniform("msaaSamplePatter", &_mSAAPattern[0], 48); - - deferredcastProgram->setUniform("firstPaint", firstPaint); - deferredcastProgram->setUniform("atmExposure", _hdrExposure); - deferredcastProgram->setUniform("backgroundConstant", _hdrBackground); - - deferredcaster->preRaycast( - deferredcasterTask.renderData, - _deferredcastData[deferredcaster], - *deferredcastProgram - ); - - glDisable(GL_DEPTH_TEST); - glDepthMask(false); - - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - glBindVertexArray(0); - - glDepthMask(true); - glEnable(GL_DEPTH_TEST); - - deferredcaster->postRaycast(deferredcasterTask.renderData, - _deferredcastData[deferredcaster], - *deferredcastProgram); - - deferredcastProgram->deactivate(); - - if (firstPaint) { - firstPaint = false; - } - } - else { - LWARNING( - "Deferredcaster is not attached when trying to perform deferred task" - ); - } - } + performDeferredTasks(tasks.deferredcasterTasks); } - + if (tasks.deferredcasterTasks.empty()) { glBindFramebuffer(GL_FRAMEBUFFER, defaultFbo); _resolveProgram->activate(); @@ -1234,6 +1016,179 @@ namespace openspace { } } + void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { + for (const RaycasterTask& raycasterTask : tasks) { + VolumeRaycaster* raycaster = raycasterTask.raycaster; + + glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + ghoul::opengl::ProgramObject* exitProgram = _exitPrograms[raycaster].get(); + if (exitProgram) { + exitProgram->activate(); + raycaster->renderExitPoints(raycasterTask.renderData, *exitProgram); + exitProgram->deactivate(); + } + + glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer); + glm::vec3 cameraPosition; + bool cameraIsInside = raycaster->cameraIsInside( + raycasterTask.renderData, + cameraPosition + ); + ghoul::opengl::ProgramObject* raycastProgram = nullptr; + + if (cameraIsInside) { + raycastProgram = _insideRaycastPrograms[raycaster].get(); + if (raycastProgram) { + raycastProgram->activate(); + raycastProgram->setUniform("cameraPosInRaycaster", cameraPosition); + } + else { + raycastProgram = _insideRaycastPrograms[raycaster].get(); + raycastProgram->activate(); + raycastProgram->setUniform("cameraPosInRaycaster", cameraPosition); + } + } + else { + raycastProgram = _raycastPrograms[raycaster].get(); + if (raycastProgram) { + raycastProgram->activate(); + } + else { + raycastProgram = _raycastPrograms[raycaster].get(); + raycastProgram->activate(); + } + } + + if (raycastProgram) { + raycaster->preRaycast(_raycastData[raycaster], *raycastProgram); + + ghoul::opengl::TextureUnit exitColorTextureUnit; + exitColorTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _exitColorTexture); + raycastProgram->setUniform("exitColorTexture", exitColorTextureUnit); + + ghoul::opengl::TextureUnit exitDepthTextureUnit; + exitDepthTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D, _exitDepthTexture); + raycastProgram->setUniform("exitDepthTexture", exitDepthTextureUnit); + + ghoul::opengl::TextureUnit mainDepthTextureUnit; + mainDepthTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainDepthTexture); + raycastProgram->setUniform("mainDepthTexture", mainDepthTextureUnit); + + raycastProgram->setUniform("nAaSamples", _nAaSamples); + raycastProgram->setUniform("windowSize", _resolution); + + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + if (cameraIsInside) { + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + } + else { + raycaster->renderEntryPoints(raycasterTask.renderData, *raycastProgram); + } + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + + raycaster->postRaycast(_raycastData[raycaster], *raycastProgram); + raycastProgram->deactivate(); + } + else { + LWARNING("Raycaster is not attached when trying to perform raycaster task"); + } + } + } + + void FramebufferRenderer::performDeferredTasks(const std::vector& tasks) { + bool firstPaint = true; + + for (const DeferredcasterTask& deferredcasterTask : tasks) { + + Deferredcaster* deferredcaster = deferredcasterTask.deferredcaster; + + ghoul::opengl::ProgramObject* deferredcastProgram = nullptr; + + if (deferredcastProgram != _deferredcastPrograms[deferredcaster].get() + || deferredcastProgram == nullptr) { + deferredcastProgram = _deferredcastPrograms[deferredcaster].get(); + } + + if (deferredcastProgram) { + + deferredcastProgram->activate(); + + // adding G-Buffer + ghoul::opengl::TextureUnit mainDColorTextureUnit; + mainDColorTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture); + deferredcastProgram->setUniform( + "mainColorTexture", + mainDColorTextureUnit + ); + + ghoul::opengl::TextureUnit mainPositionTextureUnit; + mainPositionTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainPositionTexture); + deferredcastProgram->setUniform( + "mainPositionTexture", + mainPositionTextureUnit + ); + + ghoul::opengl::TextureUnit mainNormalTextureUnit; + mainNormalTextureUnit.activate(); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainNormalTexture); + deferredcastProgram->setUniform( + "mainNormalTexture", + mainNormalTextureUnit + ); + + deferredcastProgram->setUniform("nAaSamples", _nAaSamples); + // 48 = 16 samples * 3 coords + deferredcastProgram->setUniform("msaaSamplePatter", &_mSAAPattern[0], 48); + + deferredcastProgram->setUniform("firstPaint", firstPaint); + deferredcastProgram->setUniform("atmExposure", _hdrExposure); + deferredcastProgram->setUniform("backgroundConstant", _hdrBackground); + + deferredcaster->preRaycast( + deferredcasterTask.renderData, + _deferredcastData[deferredcaster], + *deferredcastProgram + ); + + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + + deferredcaster->postRaycast(deferredcasterTask.renderData, + _deferredcastData[deferredcaster], + *deferredcastProgram); + + deferredcastProgram->deactivate(); + + if (firstPaint) { + firstPaint = false; + } + } + else { + LWARNING( + "Deferredcaster is not attached when trying to perform deferred task" + ); + } + } + } + void FramebufferRenderer::setScene(Scene* scene) { _scene = scene; } diff --git a/src/util/camera.cpp b/src/util/camera.cpp index bc59e4dc66..5318e67e47 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -125,7 +125,8 @@ namespace openspace { 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 invRotationMatrix = + glm::mat4_cast(static_cast(_rotation)); glm::dmat4 invTranslationMatrix = glm::translate(Mat4(1.0), static_cast(_position));