mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-03-14 09:30:50 -05:00
Feature/side by side (#1613)
* Make atmosphere, raycasting, and trails work with side_by_side stereo
This commit is contained in:
@@ -43,6 +43,7 @@
|
||||
#include <ghoul/opengl/programobject.h>
|
||||
#include <ghoul/opengl/openglstatecache.h>
|
||||
#include <ghoul/opengl/textureunit.h>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -75,17 +76,18 @@ namespace {
|
||||
|
||||
constexpr const glm::vec4 PosBufferClearVal = { 1e32, 1e32, 1e32, 1.f };
|
||||
|
||||
constexpr const std::array<const char*, 7> HDRUniformNames = {
|
||||
constexpr const std::array<const char*, 9> HDRUniformNames = {
|
||||
"hdrFeedingTexture", "blackoutFactor", "hdrExposure", "gamma",
|
||||
"Hue", "Saturation", "Value"
|
||||
"Hue", "Saturation", "Value", "Viewport", "Resolution"
|
||||
};
|
||||
|
||||
constexpr const std::array<const char*, 2> FXAAUniformNames = {
|
||||
"renderedTexture", "inverseScreenSize"
|
||||
constexpr const std::array<const char*, 4> FXAAUniformNames = {
|
||||
"renderedTexture", "inverseScreenSize", "Viewport", "Resolution"
|
||||
};
|
||||
|
||||
constexpr const std::array<const char*, 2> DownscaledVolumeUniformNames = {
|
||||
"downscaledRenderedVolume", "downscaledRenderedVolumeDepth"
|
||||
constexpr const std::array<const char*, 4> DownscaledVolumeUniformNames = {
|
||||
"downscaledRenderedVolume", "downscaledRenderedVolumeDepth", "viewport",
|
||||
"resolution"
|
||||
};
|
||||
|
||||
constexpr const char* ExitFragmentShaderPath =
|
||||
@@ -447,7 +449,7 @@ void FramebufferRenderer::deferredcastersChanged(Deferredcaster&,
|
||||
_dirtyDeferredcastData = true;
|
||||
}
|
||||
|
||||
void FramebufferRenderer::applyTMO(float blackoutFactor) {
|
||||
void FramebufferRenderer::applyTMO(float blackoutFactor, const glm::ivec4& viewport) {
|
||||
ZoneScoped
|
||||
TracyGpuZone("applyTMO")
|
||||
|
||||
@@ -468,6 +470,8 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) {
|
||||
_hdrFilteringProgram->setUniform(_hdrUniformCache.Hue, _hue);
|
||||
_hdrFilteringProgram->setUniform(_hdrUniformCache.Saturation, _saturation);
|
||||
_hdrFilteringProgram->setUniform(_hdrUniformCache.Value, _value);
|
||||
_hdrFilteringProgram->setUniform(_hdrUniformCache.Viewport, glm::vec4(viewport));
|
||||
_hdrFilteringProgram->setUniform(_hdrUniformCache.Resolution, glm::vec2(_resolution));
|
||||
|
||||
glDepthMask(false);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
@@ -482,7 +486,7 @@ void FramebufferRenderer::applyTMO(float blackoutFactor) {
|
||||
_hdrFilteringProgram->deactivate();
|
||||
}
|
||||
|
||||
void FramebufferRenderer::applyFXAA() {
|
||||
void FramebufferRenderer::applyFXAA(const glm::ivec4& viewport) {
|
||||
_fxaaProgram->activate();
|
||||
|
||||
ghoul::opengl::TextureUnit renderedTextureUnit;
|
||||
@@ -497,8 +501,10 @@ void FramebufferRenderer::applyFXAA() {
|
||||
renderedTextureUnit
|
||||
);
|
||||
|
||||
glm::vec2 inverseScreenSize(1.f/_resolution.x, 1.f/_resolution.y);
|
||||
glm::vec2 inverseScreenSize = glm::vec2(1.f / _resolution.x, 1.f / _resolution.y);
|
||||
_fxaaProgram->setUniform(_fxaaUniformCache.inverseScreenSize, inverseScreenSize);
|
||||
_fxaaProgram->setUniform(_fxaaUniformCache.Viewport, glm::vec4(viewport));
|
||||
_fxaaProgram->setUniform(_fxaaUniformCache.Resolution, glm::vec2(_resolution));
|
||||
|
||||
glDepthMask(false);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
@@ -532,8 +538,8 @@ void FramebufferRenderer::updateDownscaleTextures() {
|
||||
);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
float volumeBorderColor[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, volumeBorderColor);
|
||||
constexpr const float VolumeBorderColor[] = { 0.f, 0.f, 0.f, 1.f };
|
||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, VolumeBorderColor);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, _downscaleVolumeRendering.depthbuffer);
|
||||
glTexImage2D(
|
||||
@@ -555,7 +561,7 @@ void FramebufferRenderer::updateDownscaleTextures() {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
}
|
||||
|
||||
void FramebufferRenderer::writeDownscaledVolume() {
|
||||
void FramebufferRenderer::writeDownscaledVolume(const glm::ivec4& viewport) {
|
||||
_downscaledVolumeProgram->activate();
|
||||
|
||||
ghoul::opengl::TextureUnit downscaledTextureUnit;
|
||||
@@ -582,6 +588,18 @@ void FramebufferRenderer::writeDownscaledVolume() {
|
||||
downscaledDepthUnit
|
||||
);
|
||||
|
||||
_downscaledVolumeProgram->setUniform(
|
||||
_writeDownscaledVolumeUniformCache.viewport,
|
||||
static_cast<float>(viewport[0]),
|
||||
static_cast<float>(viewport[1]),
|
||||
static_cast<float>(viewport[2]),
|
||||
static_cast<float>(viewport[3])
|
||||
);
|
||||
_downscaledVolumeProgram->setUniform(
|
||||
_writeDownscaledVolumeUniformCache.resolution,
|
||||
glm::vec2(_resolution)
|
||||
);
|
||||
|
||||
|
||||
glEnablei(GL_BLEND, 0);
|
||||
|
||||
@@ -1103,8 +1121,10 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO);
|
||||
global::renderEngine->openglStateCache().setDefaultFramebuffer(_defaultFBO);
|
||||
|
||||
GLint viewport[4] = { 0 };
|
||||
global::renderEngine->openglStateCache().viewport(viewport);
|
||||
GLint vp[4] = { 0 };
|
||||
glGetIntegerv(GL_VIEWPORT, vp);
|
||||
global::renderEngine->openglStateCache().setViewportState(vp);
|
||||
glm::ivec4 viewport = glm::ivec4(vp[0], vp[1], vp[2], vp[3]);
|
||||
|
||||
// Reset Render Pipeline State
|
||||
global::renderEngine->openglStateCache().resetCachedStates();
|
||||
@@ -1120,9 +1140,6 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac
|
||||
ZoneScopedN("Deferred G-Buffer")
|
||||
TracyGpuZone("Deferred G-Buffer")
|
||||
|
||||
GLint vp[4] = {viewport[0], viewport[1], _resolution.x, _resolution.y};
|
||||
global::renderEngine->openglStateCache().setViewportState(vp);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _gBuffers.framebuffer);
|
||||
glDrawBuffers(3, ColorAttachmentArray);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
@@ -1165,20 +1182,20 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac
|
||||
{
|
||||
TracyGpuZone("Raycaster Tasks")
|
||||
GLDebugGroup group("Raycaster Tasks");
|
||||
performRaycasterTasks(tasks.raycasterTasks);
|
||||
performRaycasterTasks(tasks.raycasterTasks, viewport);
|
||||
}
|
||||
|
||||
if (!tasks.deferredcasterTasks.empty()) {
|
||||
TracyGpuZone("Deferred Caster Tasks")
|
||||
GLDebugGroup group("Deferred Caster Tasks");
|
||||
|
||||
// We use ping pong rendering in order to be able to
|
||||
// render to the same final buffer, multiple
|
||||
// deferred tasks at same time (e.g. more than 1 ATM being seen at once)
|
||||
// We use ping pong rendering in order to be able to render multiple deferred
|
||||
// tasks at same time (e.g. more than 1 ATM being seen at once) to the same final
|
||||
// buffer
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer);
|
||||
glDrawBuffers(1, &ColorAttachmentArray[_pingPongIndex]);
|
||||
|
||||
performDeferredTasks(tasks.deferredcasterTasks);
|
||||
performDeferredTasks(tasks.deferredcasterTasks, viewport);
|
||||
}
|
||||
|
||||
glDrawBuffers(1, &ColorAttachmentArray[_pingPongIndex]);
|
||||
@@ -1222,18 +1239,20 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac
|
||||
TracyGpuZone("Apply TMO")
|
||||
GLDebugGroup group("Apply TMO");
|
||||
|
||||
applyTMO(blackoutFactor);
|
||||
applyTMO(blackoutFactor, glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3]));
|
||||
}
|
||||
|
||||
if (_enableFXAA) {
|
||||
TracyGpuZone("Apply FXAA")
|
||||
GLDebugGroup group("Apply FXAA");
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO);
|
||||
applyFXAA();
|
||||
applyFXAA(viewport);
|
||||
}
|
||||
}
|
||||
|
||||
void FramebufferRenderer::performRaycasterTasks(const std::vector<RaycasterTask>& tasks) {
|
||||
void FramebufferRenderer::performRaycasterTasks(const std::vector<RaycasterTask>& tasks,
|
||||
const glm::ivec4& viewport)
|
||||
{
|
||||
ZoneScoped
|
||||
|
||||
for (const RaycasterTask& raycasterTask : tasks) {
|
||||
@@ -1243,8 +1262,7 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector<RaycasterTask>
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _exitFramebuffer);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
GLint viewport[4] = { 0 };
|
||||
global::renderEngine->openglStateCache().viewport(viewport);
|
||||
//global::renderEngine->openglStateCache().viewport(glm::value_ptr(viewport));
|
||||
|
||||
ghoul::opengl::ProgramObject* exitProgram = _exitPrograms[raycaster].get();
|
||||
if (exitProgram) {
|
||||
@@ -1257,10 +1275,10 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector<RaycasterTask>
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _downscaleVolumeRendering.framebuffer);
|
||||
const float s = raycaster->downscaleRender();
|
||||
GLint newVP[4] = {
|
||||
viewport[0],
|
||||
viewport[1],
|
||||
static_cast<GLsizei>(viewport[2] * s),
|
||||
static_cast<GLsizei>(viewport[3] * s)
|
||||
static_cast<GLint>(viewport[0] * s),
|
||||
static_cast<GLint>(viewport[1] * s),
|
||||
static_cast<GLint>(viewport[2] * s),
|
||||
static_cast<GLint>(viewport[3] * s)
|
||||
};
|
||||
global::renderEngine->openglStateCache().setViewportState(newVP);
|
||||
|
||||
@@ -1359,15 +1377,18 @@ void FramebufferRenderer::performRaycasterTasks(const std::vector<RaycasterTask>
|
||||
}
|
||||
|
||||
if (raycaster->downscaleRender() < 1.f) {
|
||||
global::renderEngine->openglStateCache().setViewportState(viewport);
|
||||
global::renderEngine->openglStateCache().setViewportState(
|
||||
glm::value_ptr(viewport)
|
||||
);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _gBuffers.framebuffer);
|
||||
writeDownscaledVolume();
|
||||
writeDownscaledVolume(viewport);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FramebufferRenderer::performDeferredTasks(
|
||||
const std::vector<DeferredcasterTask>& tasks)
|
||||
const std::vector<DeferredcasterTask>& tasks,
|
||||
const glm::ivec4& viewport)
|
||||
{
|
||||
ZoneScoped
|
||||
|
||||
@@ -1400,6 +1421,16 @@ void FramebufferRenderer::performDeferredTasks(
|
||||
mainDColorTextureUnit
|
||||
);
|
||||
|
||||
deferredcastProgram->setUniform(
|
||||
"viewport",
|
||||
static_cast<float>(viewport[0]),
|
||||
static_cast<float>(viewport[1]),
|
||||
static_cast<float>(viewport[2]),
|
||||
static_cast<float>(viewport[3])
|
||||
);
|
||||
deferredcastProgram->setUniform("resolution", glm::vec2(_resolution));
|
||||
|
||||
|
||||
ghoul::opengl::TextureUnit mainPositionTextureUnit;
|
||||
mainPositionTextureUnit.activate();
|
||||
glBindTexture(GL_TEXTURE_2D, _gBuffers.positionTexture);
|
||||
|
||||
Reference in New Issue
Block a user