mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-05 19:19:39 -06:00
Changes in framebuffer and atm code fixing wrong merge (still need clean up).
This commit is contained in:
@@ -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<glm::dquat>(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");
|
||||
|
||||
@@ -137,7 +137,7 @@ private:
|
||||
UniformCache(dInverseModelTransformMatrix, dModelTransformMatrix,
|
||||
dInverseSgctProjectionToModelTransformMatrix,
|
||||
dInverseSGCTEyeToTmpRotTransformMatrix,
|
||||
dCampos, dCamPosObj, sunDirectionObj,
|
||||
dCamRigPos, dCamPosObj, sunDirectionObj,
|
||||
hardShadows, transmittanceTexture, irradianceTexture,
|
||||
inscatterTexture) _uniformCache2;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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<performance::PerformanceMeasurement> perfInternal;
|
||||
if (doPerformanceMeasurements) {
|
||||
perfInternal = std::make_unique<performance::PerformanceMeasurement>(
|
||||
"FramebufferRenderer::render::background",
|
||||
OsEng.renderEngine().performanceManager()
|
||||
);
|
||||
}
|
||||
Time time = OsEng.timeManager().time();
|
||||
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Background);
|
||||
_scene->render(data, tasks);
|
||||
}
|
||||
{
|
||||
std::unique_ptr<performance::PerformanceMeasurement> perfInternal;
|
||||
if (doPerformanceMeasurements) {
|
||||
perfInternal = std::make_unique<performance::PerformanceMeasurement>(
|
||||
"FramebufferRenderer::render::opaque",
|
||||
OsEng.renderEngine().performanceManager()
|
||||
);
|
||||
}
|
||||
RenderData data = { *_camera, psc(), time, doPerformanceMeasurements, 0,{} };
|
||||
RendererTasks tasks;
|
||||
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Opaque);
|
||||
_scene->render(data, tasks);
|
||||
}
|
||||
{
|
||||
std::unique_ptr<performance::PerformanceMeasurement> perfInternal;
|
||||
if (doPerformanceMeasurements) {
|
||||
perfInternal = std::make_unique<performance::PerformanceMeasurement>(
|
||||
"FramebufferRenderer::render::transparent",
|
||||
OsEng.renderEngine().performanceManager()
|
||||
);
|
||||
}
|
||||
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Transparent);
|
||||
_scene->render(data, tasks);
|
||||
}
|
||||
{
|
||||
std::unique_ptr<performance::PerformanceMeasurement> perfInternal;
|
||||
if (doPerformanceMeasurements) {
|
||||
perfInternal = std::make_unique<performance::PerformanceMeasurement>(
|
||||
"FramebufferRenderer::render::overlay",
|
||||
OsEng.renderEngine().performanceManager()
|
||||
);
|
||||
}
|
||||
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Overlay);
|
||||
_scene->render(data, tasks);
|
||||
}
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Background);
|
||||
_scene->render(data, tasks);
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Opaque);
|
||||
_scene->render(data, tasks);
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Transparent);
|
||||
_scene->render(data, tasks);
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Overlay);
|
||||
_scene->render(data, tasks);
|
||||
|
||||
{
|
||||
std::unique_ptr<performance::PerformanceMeasurement> 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<performance::PerformanceMeasurement> perfInternal;
|
||||
if (doPerformanceMeasurements) {
|
||||
perfInternal = std::make_unique<performance::PerformanceMeasurement>(
|
||||
@@ -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<RaycasterTask>& 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<DeferredcasterTask>& 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;
|
||||
}
|
||||
|
||||
@@ -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<glm::dquat>(_rotation));
|
||||
glm::dmat4 invTranslationMatrix =
|
||||
glm::translate(Mat4(1.0), static_cast<Vec3>(_position));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user