Feature/side by side (#1613)

* Make atmosphere, raycasting, and trails work with side_by_side stereo
This commit is contained in:
Alexander Bock
2021-05-28 23:31:10 +02:00
committed by GitHub
parent ef35749952
commit 744ba0dc9b
12 changed files with 186 additions and 91 deletions

View File

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