From 7a4b01471d7a07145f8c153e8ac1d20f3d997053 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 1 Mar 2017 04:05:54 +0100 Subject: [PATCH] Add class updating and managing the shadow map texture --- src/CMakeLists.txt | 1 + src/gl/dynlights/gl_shadowmap.cpp | 65 +++++++++++++++++++++++++ src/gl/dynlights/gl_shadowmap.h | 20 ++++++++ src/gl/renderer/gl_renderer.h | 4 +- src/gl/scene/gl_scene.cpp | 2 + wadsrc/static/shaders/glsl/shadowmap.fp | 2 +- 6 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/gl/dynlights/gl_shadowmap.cpp create mode 100644 src/gl/dynlights/gl_shadowmap.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e92cd0dd3..2cd811b67 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -940,6 +940,7 @@ set( FASTMATH_SOURCES gl/dynlights/gl_dynlight1.cpp gl/dynlights/gl_lightbuffer.cpp gl/dynlights/gl_lightbsp.cpp + gl/dynlights/gl_shadowmap.cpp gl/shaders/gl_shader.cpp gl/shaders/gl_texshader.cpp gl/shaders/gl_shaderprogram.cpp diff --git a/src/gl/dynlights/gl_shadowmap.cpp b/src/gl/dynlights/gl_shadowmap.cpp new file mode 100644 index 000000000..9de8e3697 --- /dev/null +++ b/src/gl/dynlights/gl_shadowmap.cpp @@ -0,0 +1,65 @@ +// +//--------------------------------------------------------------------------- +// 1D dynamic shadow maps +// Copyright(C) 2017 Magnus Norddahl +// All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see http://www.gnu.org/licenses/ +// +//-------------------------------------------------------------------------- +// + +#include "gl/system/gl_system.h" +#include "gl/shaders/gl_shader.h" +#include "gl/dynlights/gl_shadowmap.h" +#include "gl/dynlights/gl_dynlight.h" +#include "gl/system/gl_interface.h" +#include "gl/system/gl_debug.h" +#include "gl/renderer/gl_renderer.h" +#include "gl/renderer/gl_postprocessstate.h" +#include "gl/shaders/gl_shadowmapshader.h" +#include "r_state.h" + +void FShadowMap::Clear() +{ + mLightBSP.Clear(); +} + +void FShadowMap::Update() +{ + TThinkerIterator it(STAT_DLIGHT); + while (true) + { + ADynamicLight *light = it.Next(); + if (!light) break; + } + + FGLDebug::PushGroup("ShadowMap"); + FGLPostProcessState savedState; + + GLRenderer->mShadowMapShader->Bind(); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, mLightBSP.GetNodesBuffer()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, mLightBSP.GetSegsBuffer()); + + glViewport(0, 0, 1024, 1024); + GLRenderer->RenderScreenQuad(); + + const auto &viewport = GLRenderer->mScreenViewport; + glViewport(viewport.left, viewport.top, viewport.width, viewport.height); + + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, 0); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, 0); + + FGLDebug::PopGroup(); +} diff --git a/src/gl/dynlights/gl_shadowmap.h b/src/gl/dynlights/gl_shadowmap.h new file mode 100644 index 000000000..86a97dce5 --- /dev/null +++ b/src/gl/dynlights/gl_shadowmap.h @@ -0,0 +1,20 @@ + +#pragma once + +#include "gl/dynlights/gl_lightbsp.h" + +class FShadowMap +{ +public: + FShadowMap() { } + ~FShadowMap() { Clear(); } + + void Clear(); + void Update(); + +private: + FLightBSP mLightBSP; + + FShadowMap(const FShadowMap &) = delete; + FShadowMap &operator=(FShadowMap &) = delete; +}; diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index b655f6d60..bac7e6515 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -6,7 +6,7 @@ #include "vectors.h" #include "r_renderer.h" #include "gl/data/gl_matrix.h" -#include "gl/dynlights/gl_lightbsp.h" +#include "gl/dynlights/gl_shadowmap.h" struct particle_t; class FCanvasTexture; @@ -126,7 +126,7 @@ public: FPresent3DRowShader *mPresent3dRowShader; FShadowMapShader *mShadowMapShader; - FLightBSP mLightBSP; + FShadowMap mShadowMap; FTexture *gllight; FTexture *glpart2; diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index b852e1380..c7e602e0c 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -950,6 +950,8 @@ void FGLRenderer::RenderView (player_t* player) TThinkerIterator it(STAT_DLIGHT); GLRenderer->mLightCount = ((it.Next()) != NULL); + GLRenderer->mShadowMap.Update(); + sector_t * viewsector = RenderViewpoint(player->camera, NULL, FieldOfView.Degrees, ratio, fovratio, true, true); All.Unclock(); diff --git a/wadsrc/static/shaders/glsl/shadowmap.fp b/wadsrc/static/shaders/glsl/shadowmap.fp index d29108fff..72171244b 100644 --- a/wadsrc/static/shaders/glsl/shadowmap.fp +++ b/wadsrc/static/shaders/glsl/shadowmap.fp @@ -112,5 +112,5 @@ float rayTest(vec2 from, vec2 to) void main() { - FragColor = vec4(rayTest(vec2(0.0, 0.0), vec2(1.0, 1.0)); + FragColor = vec4(rayTest(vec2(0.0, 0.0), vec2(1.0, 1.0))); }