Changes in framebuffer and atm code fixing wrong merge (still need clean up).

This commit is contained in:
Jonathas Costa
2018-03-19 12:29:05 -04:00
parent 721bdfa752
commit 785d0ad294
7 changed files with 248 additions and 279 deletions

View File

@@ -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");

View File

@@ -137,7 +137,7 @@ private:
UniformCache(dInverseModelTransformMatrix, dModelTransformMatrix,
dInverseSgctProjectionToModelTransformMatrix,
dInverseSGCTEyeToTmpRotTransformMatrix,
dCampos, dCamPosObj, sunDirectionObj,
dCamRigPos, dCamPosObj, sunDirectionObj,
hardShadows, transmittanceTexture, irradianceTexture,
inscatterTexture) _uniformCache2;

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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",

View File

@@ -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;
}

View File

@@ -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));