From f88d9a02dfe4e263aa8122b1e9f5f685e2b4621d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 6 Jan 2018 05:11:12 +0100 Subject: [PATCH 1/5] Remove bloom effect on psprites --- src/gl/renderer/gl_postprocess.cpp | 3 ++- src/gl/renderer/gl_renderer.h | 4 +++- src/gl/scene/gl_scene.cpp | 28 +++++++++++++++++++++++----- src/gl/scene/gl_scenedrawer.h | 1 + 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 142358af68..463895e8ca 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -161,12 +161,13 @@ void FGLRenderer::RenderScreenQuad() GLRenderer->mVBO->RenderArray(GL_TRIANGLE_STRIP, FFlatVertexBuffer::PRESENT_INDEX, 4); } -void FGLRenderer::PostProcessScene(int fixedcm) +void FGLRenderer::PostProcessScene(int fixedcm, const std::function &afterBloomDrawEndScene2D) { mBuffers->BlitSceneToTexture(); UpdateCameraExposure(); mCustomPostProcessShaders->Run("beforebloom"); BloomScene(fixedcm); + afterBloomDrawEndScene2D(); TonemapScene(); ColormapScene(fixedcm); LensDistortScene(); diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index 8b6ba46df5..eb71cd4bed 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -7,6 +7,7 @@ #include "r_renderer.h" #include "r_data/matrix.h" #include "gl/dynlights/gl_shadowmap.h" +#include struct particle_t; class FCanvasTexture; @@ -43,6 +44,7 @@ class F2DDrawer; class FHardwareTexture; class FShadowMapShader; class FCustomPostProcessShaders; +class GLSceneDrawer; inline float DEG2RAD(float deg) { @@ -174,7 +176,7 @@ public: void RenderView(player_t* player); void RenderScreenQuad(); - void PostProcessScene(int fixedcm); + void PostProcessScene(int fixedcm, const std::function &afterBloomDrawEndScene2D); void AmbientOccludeScene(); void UpdateCameraExposure(); void BloomScene(int fixedcm); diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index bbead77371..1ce74404ca 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -681,10 +681,29 @@ void GLSceneDrawer::EndDrawScene(sector_t * viewsector) Reset3DViewport(); - // [BB] Only draw the sprites if we didn't render a HUD model before. - if ( renderHUDModel == false ) + // Delay drawing psprites until after bloom has been applied, if enabled. + if (!FGLRenderBuffers::IsEnabled() || !gl_bloom) { - DrawPlayerSprites (viewsector, false); + DrawEndScene2D(viewsector); + } + else + { + // Restore standard rendering state + gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + gl_RenderState.ResetColor(); + gl_RenderState.EnableTexture(true); + glDisable(GL_SCISSOR_TEST); + } +} + +void GLSceneDrawer::DrawEndScene2D(sector_t * viewsector) +{ + const bool renderHUDModel = gl_IsHUDModelForPlayerAvailable(players[consoleplayer].camera->player); + + // [BB] Only draw the sprites if we didn't render a HUD model before. + if (renderHUDModel == false) + { + DrawPlayerSprites(viewsector, false); } if (gl.legacyMode) { @@ -706,7 +725,6 @@ void GLSceneDrawer::EndDrawScene(sector_t * viewsector) glDisable(GL_SCISSOR_TEST); } - //----------------------------------------------------------------------------- // // R_RenderView - renders one view - either the screen or a camera texture @@ -846,7 +864,7 @@ sector_t * GLSceneDrawer::RenderViewpoint (AActor * camera, GL_IRECT * bounds, f if (mainview && toscreen) EndDrawScene(lviewsector); // do not call this for camera textures. if (mainview && FGLRenderBuffers::IsEnabled()) { - GLRenderer->PostProcessScene(FixedColormap); + GLRenderer->PostProcessScene(FixedColormap, [&]() { if (gl_bloom) DrawEndScene2D(lviewsector); }); // This should be done after postprocessing, not before. GLRenderer->mBuffers->BindCurrentFB(); diff --git a/src/gl/scene/gl_scenedrawer.h b/src/gl/scene/gl_scenedrawer.h index 9209e6dad9..9ade64b739 100644 --- a/src/gl/scene/gl_scenedrawer.h +++ b/src/gl/scene/gl_scenedrawer.h @@ -55,6 +55,7 @@ public: void ProcessScene(bool toscreen = false); void DrawBlend(sector_t * viewsector); void EndDrawScene(sector_t * viewsector); + void DrawEndScene2D(sector_t * viewsector); void RenderActorsInPortal(FGLLinePortal *glport); void CheckViewArea(vertex_t *v1, vertex_t *v2, sector_t *frontsector, sector_t *backsector); From 56db2b02ccdad3de4a5ca69230a3b3cc2a29317a Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 6 Jan 2018 17:21:02 +0100 Subject: [PATCH 2/5] - Fix psprite not appearing when invulnerability effect is active with bloom turned on --- src/gl/scene/gl_scene.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index 1ce74404ca..a0bcb48821 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -682,7 +682,7 @@ void GLSceneDrawer::EndDrawScene(sector_t * viewsector) Reset3DViewport(); // Delay drawing psprites until after bloom has been applied, if enabled. - if (!FGLRenderBuffers::IsEnabled() || !gl_bloom) + if (!FGLRenderBuffers::IsEnabled() || !gl_bloom || FixedColormap != CM_DEFAULT) { DrawEndScene2D(viewsector); } @@ -864,7 +864,7 @@ sector_t * GLSceneDrawer::RenderViewpoint (AActor * camera, GL_IRECT * bounds, f if (mainview && toscreen) EndDrawScene(lviewsector); // do not call this for camera textures. if (mainview && FGLRenderBuffers::IsEnabled()) { - GLRenderer->PostProcessScene(FixedColormap, [&]() { if (gl_bloom) DrawEndScene2D(lviewsector); }); + GLRenderer->PostProcessScene(FixedColormap, [&]() { if (gl_bloom && FixedColormap == CM_DEFAULT) DrawEndScene2D(lviewsector); }); // This should be done after postprocessing, not before. GLRenderer->mBuffers->BindCurrentFB(); From a23e5f49f6f8840c8ce41077f897ab33b9c3debe Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 7 Jan 2018 02:29:55 +0100 Subject: [PATCH 3/5] - Add "fuzz software" to GL that renders fuzz like the scaled fuzz mode in the software renderer --- src/gl/renderer/gl_renderstate.cpp | 1 + src/gl/scene/gl_sprite.cpp | 2 +- src/gl/shaders/gl_shader.cpp | 2 + src/gl/shaders/gl_shader.h | 3 +- wadsrc/static/menudef.txt | 1 + wadsrc/static/shaders/glsl/fuzz_software.fp | 52 +++++++++++++++++++++ wadsrc/static/shaders/glsl/shaderdefs.i | 3 ++ 7 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 wadsrc/static/shaders/glsl/fuzz_software.fp diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index 2405aff095..119444af6e 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -177,6 +177,7 @@ bool FRenderState::ApplyShader() activeShader->muAlphaThreshold.Set(mAlphaThreshold); activeShader->muLightIndex.Set(mLightIndex); // will always be -1 for now activeShader->muClipSplit.Set(mClipSplit); + activeShader->muViewHeight.Set(viewheight); if (mGlowEnabled) { diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index edd0da1d98..e287c7215e 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -73,7 +73,7 @@ CVAR(Bool, gl_billboard_particles, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Int, gl_enhanced_nv_stealth, 3, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, gl_fuzztype, 0, CVAR_ARCHIVE) { - if (self < 0 || self > 7) self = 0; + if (self < 0 || self > 8) self = 0; } EXTERN_CVAR (Float, transsouls) diff --git a/src/gl/shaders/gl_shader.cpp b/src/gl/shaders/gl_shader.cpp index d551106a45..4af1ef5a17 100644 --- a/src/gl/shaders/gl_shader.cpp +++ b/src/gl/shaders/gl_shader.cpp @@ -254,6 +254,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * muClipHeight.Init(hShader, "uClipHeight"); muClipHeightDirection.Init(hShader, "uClipHeightDirection"); muAlphaThreshold.Init(hShader, "uAlphaThreshold"); + muViewHeight.Init(hShader, "uViewHeight"); muTimer.Init(hShader, "timer"); lights_index = glGetUniformLocation(hShader, "lights"); @@ -392,6 +393,7 @@ static const FDefaultShader defaultshaders[]= {"Jagged Fuzz", "shaders/glsl/fuzz_jagged.fp"}, {"Noise Fuzz", "shaders/glsl/fuzz_noise.fp"}, {"Smooth Noise Fuzz", "shaders/glsl/fuzz_smoothnoise.fp"}, + {"Software Fuzz", "shaders/glsl/fuzz_software.fp"}, {NULL,NULL} }; diff --git a/src/gl/shaders/gl_shader.h b/src/gl/shaders/gl_shader.h index f41f7467bc..6265d62a95 100644 --- a/src/gl/shaders/gl_shader.h +++ b/src/gl/shaders/gl_shader.h @@ -284,6 +284,7 @@ class FShader FBufferedUniform1f muClipHeight; FBufferedUniform1f muClipHeightDirection; FBufferedUniform1f muAlphaThreshold; + FBufferedUniform1i muViewHeight; FBufferedUniform1f muTimer; int lights_index; @@ -397,7 +398,7 @@ public: } }; -#define FIRST_USER_SHADER 12 +#define FIRST_USER_SHADER 13 enum { diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 43c86b7124..c4ecd28777 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2111,6 +2111,7 @@ OptionValue "FuzzStyle" 4, "$OPTVAL_TRANSLUCENTFUZZ" 6, "$OPTVAL_NOISE" 7, "$OPTVAL_SMOOTHNOISE" + 8, "$OPTVAL_SOFTWARE" //5, "$OPTVAL_JAGGEDFUZZ" I can't see any difference between this and 4 so it's disabled for now. } diff --git a/wadsrc/static/shaders/glsl/fuzz_software.fp b/wadsrc/static/shaders/glsl/fuzz_software.fp new file mode 100644 index 0000000000..cf905bb6ee --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_software.fp @@ -0,0 +1,52 @@ +// Fuzz effect as rendered by the software renderer +uniform float timer; + +#define FUZZTABLE 50 +#define FUZZ_RANDOM_X_SIZE 100 +#define FRACBITS 16 +#define fixed_t int + +int fuzz_random_x_offset[FUZZ_RANDOM_X_SIZE] = +{ + 75, 76, 21, 91, 56, 33, 62, 99, 61, 79, + 95, 54, 41, 18, 69, 43, 49, 59, 10, 84, + 94, 17, 57, 46, 9, 39, 55, 34,100, 81, + 73, 88, 92, 3, 63, 36, 7, 28, 13, 80, + 16, 96, 78, 29, 71, 58, 89, 24, 1, 35, + 52, 82, 4, 14, 22, 53, 38, 66, 12, 72, + 90, 44, 77, 83, 6, 27, 48, 30, 42, 32, + 65, 15, 97, 20, 67, 74, 98, 85, 60, 68, + 19, 26, 8, 87, 86, 64, 11, 37, 31, 47, + 25, 5, 50, 51, 23, 2, 93, 70, 40, 45 +}; + +int fuzzoffset[FUZZTABLE] = +{ + 6, 11, 6, 11, 6, 6, 11, 6, 6, 11, + 6, 6, 6, 11, 6, 6, 6, 11, 15, 18, + 21, 6, 11, 15, 6, 6, 6, 6, 11, 6, + 11, 6, 6, 11, 15, 6, 6, 11, 15, 18, + 21, 6, 6, 6, 6, 11, 6, 6, 11, 6 +}; + +vec4 ProcessTexel() +{ + vec2 texCoord = vTexCoord.st; + vec4 basicColor = getTexel(texCoord); + + // Ideally fuzzpos would be an uniform and differ from each sprite so that overlapping demons won't get the same shade for the same pixel + int next_random = int(abs(mod(timer * 35.0, float(FUZZ_RANDOM_X_SIZE)))); + int fuzzpos = (/*fuzzpos +*/ fuzz_random_x_offset[next_random] * FUZZTABLE / 100) % FUZZTABLE; + + int x = int(gl_FragCoord.x); + int y = int(gl_FragCoord.y); + + fixed_t fuzzscale = (200 << FRACBITS) / uViewHeight; + int scaled_x = (x * fuzzscale) >> FRACBITS; + int fuzz_x = fuzz_random_x_offset[scaled_x % FUZZ_RANDOM_X_SIZE] + fuzzpos; + fixed_t fuzzcount = FUZZTABLE << FRACBITS; + fixed_t fuzz = ((fuzz_x << FRACBITS) + y * fuzzscale) % fuzzcount; + float alpha = float(fuzzoffset[fuzz >> FRACBITS]) / 32.0; + + return vec4(0.0, 0.0, 0.0, basicColor.a * alpha); +} diff --git a/wadsrc/static/shaders/glsl/shaderdefs.i b/wadsrc/static/shaders/glsl/shaderdefs.i index c8fcf7b6b3..15d68428e8 100644 --- a/wadsrc/static/shaders/glsl/shaderdefs.i +++ b/wadsrc/static/shaders/glsl/shaderdefs.i @@ -48,6 +48,9 @@ uniform float uGlobVis; // uGlobVis = R_GetGlobVis(r_visibility) / 32.0 // dynamic lights uniform int uLightIndex; +// Software fuzz scaling +uniform int uViewHeight; + // quad drawer stuff #ifdef USE_QUAD_DRAWER uniform mat4 uQuadVertices; From e7286344975fc51379e34a1f4e6016dd94bb7de5 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 25 Jan 2018 13:23:12 +0200 Subject: [PATCH 4/5] Use dummy Get...() functions for all Intel targets 64-bit Intel targets built with GCC/Clang were using strict memory alignment versions of GetShort(), GetInt(), GetBigInt() functions --- src/m_swap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_swap.h b/src/m_swap.h index 982aa5ca1b..1ab82d3b18 100644 --- a/src/m_swap.h +++ b/src/m_swap.h @@ -177,7 +177,7 @@ inline int BigLong (int x) // Data accessors, since some data is highly likely to be unaligned. -#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__x86_64__) inline int GetShort(const unsigned char *foo) { return *(const short *)foo; From 1b4e3d3f9447571da680a977c0142e475b6efbb4 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 25 Jan 2018 13:35:34 +0200 Subject: [PATCH 5/5] Added overloaded Little...() functions for big endian targets https://forum.zdoom.org/viewtopic.php?t=59197 --- src/m_swap.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/m_swap.h b/src/m_swap.h index 1ab82d3b18..a68a0837b7 100644 --- a/src/m_swap.h +++ b/src/m_swap.h @@ -91,6 +91,16 @@ inline unsigned short LittleShort (unsigned short x) return (unsigned short)((x>>8) | (x<<8)); } +inline short LittleShort (int x) +{ + return LittleShort((short)x); +} + +inline unsigned short LittleShort (unsigned int x) +{ + return LittleShort((unsigned short)x); +} + // Swapping 32bit. inline unsigned int LittleLong (unsigned int x) { @@ -110,6 +120,16 @@ inline int LittleLong (int x) | (((unsigned int)x)<<24)); } +inline unsigned int LittleLong(unsigned long x) +{ + return LittleLong((unsigned int)x); +} + +inline int LittleLong(long x) +{ + return LittleLong((int)x); +} + #define BigShort(x) (x) #define BigLong(x) (x)