From 06dffabec4da177eea3d142ec9ca786b6b7e695f Mon Sep 17 00:00:00 2001 From: VReaperV Date: Sun, 12 Jan 2025 14:28:54 +0300 Subject: [PATCH 1/7] Add r_forceRendererTime When set to >= 0, the value of this cvar (in milliseconds) will be used for time-based shader effects. --- src/engine/renderer/tr_init.cpp | 2 ++ src/engine/renderer/tr_local.h | 2 ++ src/engine/renderer/tr_scene.cpp | 6 +++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/engine/renderer/tr_init.cpp b/src/engine/renderer/tr_init.cpp index 6f5b81ce73..64e3970b60 100644 --- a/src/engine/renderer/tr_init.cpp +++ b/src/engine/renderer/tr_init.cpp @@ -271,6 +271,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA "(-1 to profile all stages/materials, rendered in their usual order); " "for materials, material IDs start from opaque materials, depth pre-pass materials are ignored", Cvar::NONE, -1 ); + Cvar::Cvar r_forceRendererTime( "r_forceRendererTime", "Set a specific time (in ms, since the start of the map) for time-based shader effects; -1 to disable", Cvar::CHEAT, -1 ); + cvar_t *r_vboFaces; cvar_t *r_vboCurves; cvar_t *r_vboTriangles; diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 55a5da0669..0b234c2c07 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -3047,6 +3047,8 @@ enum class shaderProfilerRenderSubGroupsMode { extern Cvar::Cvar r_materialDebug; extern cvar_t *r_showParallelShadowSplits; + extern Cvar::Cvar r_forceRendererTime; + extern Cvar::Cvar r_profilerRenderSubGroups; extern Cvar::Range> r_profilerRenderSubGroupsMode; extern Cvar::Cvar r_profilerRenderSubGroupsStage; diff --git a/src/engine/renderer/tr_scene.cpp b/src/engine/renderer/tr_scene.cpp index 818835811f..2aa9d5cf6a 100644 --- a/src/engine/renderer/tr_scene.cpp +++ b/src/engine/renderer/tr_scene.cpp @@ -564,7 +564,11 @@ void RE_RenderScene( const refdef_t *fd ) } // derived info - tr.refdef.floatTime = float(double(tr.refdef.time) * 0.001); + if ( r_forceRendererTime.Get() >= 0 ) { + tr.refdef.floatTime = float( double( r_forceRendererTime.Get() ) * 0.001 ); + } else { + tr.refdef.floatTime = float( double( tr.refdef.time ) * 0.001 ); + } tr.refdef.numDrawSurfs = r_firstSceneDrawSurf; tr.refdef.drawSurfs = backEndData[ tr.smpFrame ]->drawSurfs; From 590a770d9e5e652367fec23fc0e1b42ab130958a Mon Sep 17 00:00:00 2001 From: VReaperV Date: Wed, 25 Dec 2024 15:05:44 +0300 Subject: [PATCH 2/7] Change u_Color to uint `u_Color` was a vec4 that was being set from a `Color` object, which only has 8-bit precision per colour, so using up 4 times more memory than that to transfer it was quite atrocious. Instead, pack it into a uint32_t, then use `unpackUnorm4x8()` to unpack in the shader. Also adds a macro for unpacking for hardware that doesn't support `GL_ARB_gpu_shader5`. --- src/engine/renderer/gl_shader.cpp | 4 ++++ src/engine/renderer/gl_shader.h | 6 +++--- src/engine/renderer/glsl_source/fogGlobal_fp.glsl | 4 ++-- src/engine/renderer/glsl_source/fogQuake3_vp.glsl | 4 ++-- src/engine/renderer/glsl_source/forwardLighting_vp.glsl | 4 ++-- src/engine/renderer/glsl_source/generic_vp.glsl | 4 ++-- src/engine/renderer/glsl_source/lightMapping_vp.glsl | 4 ++-- src/engine/renderer/glsl_source/shadowFill_vp.glsl | 4 ++-- src/engine/renderer/tr_local.h | 7 +++++++ 9 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 3a9121db41..13cf1adf25 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -502,6 +502,10 @@ static std::string GenCompatHeader() { str += "float smoothstep(float edge0, float edge1, float x) { float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); return t * t * (3.0 - 2.0 * t); }\n"; } + if ( !glConfig2.gpuShader5Available ) { + str += "#define unpackUnorm4x8( value ) ( ( vec4( value, value >> 8, value >> 16, value >> 24 ) & 0xFF ) / 255.0f )\n"; + } + return str; } diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index bdd8cf7102..92f9ca79d7 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -3099,17 +3099,17 @@ class u_CloudHeight : }; class u_Color : - GLUniform4f + GLUniform1ui { public: u_Color( GLShader *shader ) : - GLUniform4f( shader, "u_Color" ) + GLUniform1ui( shader, "u_Color" ) { } void SetUniform_Color( const Color::Color& color ) { - this->SetValue( color.ToArray() ); + this->SetValue( packUnorm4x8( color.ToArray() ) ); } }; diff --git a/src/engine/renderer/glsl_source/fogGlobal_fp.glsl b/src/engine/renderer/glsl_source/fogGlobal_fp.glsl index da3ac5299d..24076a159b 100644 --- a/src/engine/renderer/glsl_source/fogGlobal_fp.glsl +++ b/src/engine/renderer/glsl_source/fogGlobal_fp.glsl @@ -26,7 +26,7 @@ uniform sampler2D u_ColorMap; // fog texture uniform sampler2D u_DepthMap; uniform vec4 u_FogDistanceVector; -uniform vec4 u_Color; +uniform uint u_Color; uniform mat4 u_UnprojectMatrix; #if __VERSION__ > 120 @@ -52,5 +52,5 @@ void main() vec4 color = texture2D(u_ColorMap, st); - outputColor = u_Color * color; + outputColor = unpackUnorm4x8( u_Color ) * color; } diff --git a/src/engine/renderer/glsl_source/fogQuake3_vp.glsl b/src/engine/renderer/glsl_source/fogQuake3_vp.glsl index a8d798ed3b..77eba51fe1 100644 --- a/src/engine/renderer/glsl_source/fogQuake3_vp.glsl +++ b/src/engine/renderer/glsl_source/fogQuake3_vp.glsl @@ -29,7 +29,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA uniform float u_Time; uniform vec4 u_ColorModulate; -uniform vec4 u_Color; +uniform uint u_Color; uniform mat4 u_ModelMatrix; uniform mat4 u_ModelViewProjectionMatrix; @@ -58,7 +58,7 @@ void main() VertexFetch( position, LB, color, texCoord, lmCoord ); - color = /* color * u_ColorModulate + */ u_Color; + color = /* color * u_ColorModulate + */ unpackUnorm4x8( u_Color ); DeformVertex( position, LB.normal, diff --git a/src/engine/renderer/glsl_source/forwardLighting_vp.glsl b/src/engine/renderer/glsl_source/forwardLighting_vp.glsl index 221bebe10c..22d247c3c4 100644 --- a/src/engine/renderer/glsl_source/forwardLighting_vp.glsl +++ b/src/engine/renderer/glsl_source/forwardLighting_vp.glsl @@ -32,7 +32,7 @@ uniform mat4 u_ModelMatrix; uniform mat4 u_ModelViewProjectionMatrix; uniform vec4 u_ColorModulate; -uniform vec4 u_Color; +uniform uint u_Color; uniform float u_Time; @@ -63,7 +63,7 @@ void main() VertexFetch( position, LB, color, texCoord, lmCoord); // assign color - color = color * u_ColorModulate + u_Color; + color = color * u_ColorModulate + unpackUnorm4x8( u_Color ); DeformVertex( position, LB.normal, diff --git a/src/engine/renderer/glsl_source/generic_vp.glsl b/src/engine/renderer/glsl_source/generic_vp.glsl index d62630d649..e8bdce44fc 100644 --- a/src/engine/renderer/glsl_source/generic_vp.glsl +++ b/src/engine/renderer/glsl_source/generic_vp.glsl @@ -33,7 +33,7 @@ uniform vec3 u_ViewOrigin; uniform float u_Time; uniform vec4 u_ColorModulate; -uniform vec4 u_Color; +uniform uint u_Color; #if defined(USE_TCGEN_ENVIRONMENT) uniform mat4 u_ModelMatrix; #endif @@ -63,7 +63,7 @@ void main() vec2 texCoord, lmCoord; VertexFetch( position, LB, color, texCoord, lmCoord ); - color = color * u_ColorModulate + u_Color; + color = color * u_ColorModulate + unpackUnorm4x8( u_Color ); DeformVertex( position, LB.normal, diff --git a/src/engine/renderer/glsl_source/lightMapping_vp.glsl b/src/engine/renderer/glsl_source/lightMapping_vp.glsl index d69f9dc729..f78d86228c 100644 --- a/src/engine/renderer/glsl_source/lightMapping_vp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_vp.glsl @@ -46,7 +46,7 @@ uniform mat4 u_ModelViewProjectionMatrix; uniform float u_Time; uniform vec4 u_ColorModulate; -uniform vec4 u_Color; +uniform uint u_Color; OUT(smooth) vec3 var_Position; OUT(smooth) vec2 var_TexCoords; @@ -73,7 +73,7 @@ void main() VertexFetch(position, LB, color, texCoord, lmCoord); - color = color * u_ColorModulate + u_Color; + color = color * u_ColorModulate + unpackUnorm4x8( u_Color ); DeformVertex(position, LB.normal, texCoord, color, u_Time); diff --git a/src/engine/renderer/glsl_source/shadowFill_vp.glsl b/src/engine/renderer/glsl_source/shadowFill_vp.glsl index 4c0afd1e04..5becd198ff 100644 --- a/src/engine/renderer/glsl_source/shadowFill_vp.glsl +++ b/src/engine/renderer/glsl_source/shadowFill_vp.glsl @@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #insert vertexSkinning_vp #insert vertexAnimation_vp -uniform vec4 u_Color; +uniform uint u_Color; uniform mat4 u_TextureMatrix; uniform mat4 u_ModelMatrix; @@ -73,5 +73,5 @@ void main() var_TexCoords = (u_TextureMatrix * vec4(texCoord, 0.0, 1.0)).st; // assign color - var_Color = u_Color; + var_Color = unpackUnorm4x8( u_Color ); } diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 0b234c2c07..371781783b 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -124,6 +124,13 @@ static inline void snorm16ToFloat( const i16vec4_t in, vec4_t out ) out[ 3 ] = snorm16ToFloat( in[ 3 ] ); } +static inline uint32_t packUnorm4x8( const vec4_t in ) { + return uint32_t( floatToUnorm8( in[0] ) ) + | ( uint32_t( floatToUnorm8( in[1] ) ) << 8 ) + | ( uint32_t( floatToUnorm8( in[2] ) ) << 16 ) + | ( uint32_t( floatToUnorm8( in[3] ) ) << 24 ); +} + static inline f16_t floatToHalf( float in ) { static float scale = powf(2.0f, 15 - 127); From 7dde891e6607e89af4eed6ce03c00ee484e9b4ba Mon Sep 17 00:00:00 2001 From: VReaperV Date: Wed, 25 Dec 2024 16:32:48 +0300 Subject: [PATCH 3/7] Add a uint version of u_ColorModulate Add `u_ColorModulateColorGen` for use with shaders other than `cameraEffects`, since the latter can get an arbitrary vec4 for it. All other shaders only use 12 distinct states of `u_ColorModulateColorGen`, encoded as 5 bits. Also adds `u_ColorModulateLightFactor` as a global uniform, to be able to put the `genericMaterial` shader struct into 8 bytes. Fixes an issue with material shader post-processing that was removing global uniforms that had similar names to a non-global one. --- src.cmake | 1 + src/engine/renderer/Material.cpp | 5 +- src/engine/renderer/gl_shader.cpp | 25 +++-- src/engine/renderer/gl_shader.h | 93 ++++++++++++------- src/engine/renderer/glsl_source/common.glsl | 64 +++++++++++++ .../glsl_source/forwardLighting_vp.glsl | 7 +- .../renderer/glsl_source/generic_vp.glsl | 7 +- .../renderer/glsl_source/lightMapping_vp.glsl | 6 +- src/engine/renderer/shaders.cpp | 2 + src/engine/renderer/tr_backend.cpp | 28 +++--- src/engine/renderer/tr_shade.cpp | 14 +-- 11 files changed, 176 insertions(+), 76 deletions(-) create mode 100644 src/engine/renderer/glsl_source/common.glsl diff --git a/src.cmake b/src.cmake index 88721de118..7976806708 100644 --- a/src.cmake +++ b/src.cmake @@ -160,6 +160,7 @@ set(RENDERERLIST ) set(GLSLSOURCELIST + ${ENGINE_DIR}/renderer/glsl_source/common.glsl ${ENGINE_DIR}/renderer/glsl_source/common_cp.glsl ${ENGINE_DIR}/renderer/glsl_source/shaderProfiler_vp.glsl ${ENGINE_DIR}/renderer/glsl_source/shaderProfiler_fp.glsl diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index 7346b865f3..d33d0e90fe 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -223,7 +223,8 @@ void UpdateSurfaceDataGeneric3D( uint32_t* materials, Material& material, drawSu alphaGen_t alphaGen = SetAlphaGen( pStage ); bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && drawSurf->bspSurface; - gl_genericShaderMaterial->SetUniform_ColorModulate( rgbGen, alphaGen, mayUseVertexOverbright ); + gl_genericShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright ); + gl_genericShaderMaterial->SetUniform_ColorModulateLightFactor( tr.mapLightFactor ); Tess_ComputeColor( pStage ); gl_genericShaderMaterial->SetUniform_Color( tess.svars.color ); @@ -289,7 +290,7 @@ void UpdateSurfaceDataLightMapping( uint32_t* materials, Material& material, dra lightMode == lightMode_t::FULLBRIGHT ? 1.0f : tr.mapLightFactor ); // u_ColorModulate - gl_lightMappingShaderMaterial->SetUniform_ColorModulate( rgbGen, alphaGen ); + gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); // u_Color gl_lightMappingShaderMaterial->SetUniform_Color( tess.svars.color ); diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 13cf1adf25..727fbdc11b 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -1438,9 +1438,12 @@ std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::str bool skip = false; if ( line.find( "uniform" ) < line.find( "//" ) && line.find( ";" ) != std::string::npos ) { for ( GLUniform* uniform : shader->_uniforms ) { - if ( !uniform->IsGlobal() && ( line.find( uniform->GetName() ) != std::string::npos ) ) { - skip = true; - break; + if ( !uniform->IsGlobal() ) { + const size_t pos = line.find( uniform->GetName() ); + if ( pos != std::string::npos && !std::isalpha( line[pos + strlen( uniform->GetName() ) ]) ) { + skip = true; + break; + } } } } @@ -2191,7 +2194,8 @@ GLShader_generic::GLShader_generic( GLShaderManager *manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), + u_ColorModulateLightFactor( this ), u_Color( this ), u_Bones( this ), u_VertexInterpolation( this ), @@ -2223,7 +2227,8 @@ GLShader_genericMaterial::GLShader_genericMaterial( GLShaderManager* manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), + u_ColorModulateLightFactor( this ), u_Color( this ), u_DepthScale( this ), u_ShowTris( this ), @@ -2258,7 +2263,7 @@ GLShader_lightMapping::GLShader_lightMapping( GLShaderManager *manager ) : u_LightTiles( this ), u_TextureMatrix( this ), u_SpecularExponent( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_AlphaThreshold( this ), u_ViewOrigin( this ), @@ -2327,7 +2332,7 @@ GLShader_lightMappingMaterial::GLShader_lightMappingMaterial( GLShaderManager* m u_LightTiles( this ), u_TextureMatrix( this ), u_SpecularExponent( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_AlphaThreshold( this ), u_ViewOrigin( this ), @@ -2387,7 +2392,7 @@ GLShader_forwardLighting_omniXYZ::GLShader_forwardLighting_omniXYZ( GLShaderMana u_TextureMatrix( this ), u_SpecularExponent( this ), u_AlphaThreshold( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_ViewOrigin( this ), u_LightOrigin( this ), @@ -2440,7 +2445,7 @@ GLShader_forwardLighting_projXYZ::GLShader_forwardLighting_projXYZ( GLShaderMana u_TextureMatrix( this ), u_SpecularExponent( this ), u_AlphaThreshold( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_ViewOrigin( this ), u_LightOrigin( this ), @@ -2504,7 +2509,7 @@ GLShader_forwardLighting_directionalSun::GLShader_forwardLighting_directionalSun u_TextureMatrix( this ), u_SpecularExponent( this ), u_AlphaThreshold( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_ViewOrigin( this ), u_LightDir( this ), diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index 92f9ca79d7..00e04d434b 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -2151,6 +2151,19 @@ class u_LightFactor : } }; +// HACK: Light factor is set as a global uniform here so that genericMaterial struct can fit into 8 bytes +class u_ColorModulateLightFactor : + GLUniform1f { + public: + u_ColorModulateLightFactor( GLShader* shader ) : + GLUniform1f( shader, "u_ColorModulateLightFactor", true ) { + } + + void SetUniform_ColorModulateLightFactor( const float lightFactor ) { + this->SetValue( lightFactor / 4.0f ); // Multiplied by 4 in the shader to save on instructions + } +}; + class u_ColorMap : GLUniformSampler2D { public: @@ -3603,68 +3616,76 @@ class u_ColorModulate : { this->SetValue( v ); } - void SetUniform_ColorModulate( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false ) - { - vec4_t v; +}; + +enum class ColorModulate { + COLOR_ADD = BIT( 0 ), + COLOR_NEGATE = BIT( 1 ), + COLOR_LIGHTFACTOR = BIT( 2 ), + ALPHA_ADD = BIT( 3 ), + ALPHA_NEGATE = BIT( 4 ) +}; + +class u_ColorModulateColorGen : + GLUniform1ui { + public: + u_ColorModulateColorGen( GLShader* shader ) : + GLUniform1ui( shader, "u_ColorModulateColorGen" ) { + } + + void SetUniform_ColorModulateColorGen( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false ) { + uint32_t colorModulate = 0; bool needAttrib = false; - if ( r_logFile->integer ) - { - GLimp_LogComment( va( "--- u_ColorModulate::SetUniform_ColorModulate( program = %s, colorGen = %s, alphaGen = %s ) ---\n", _shader->GetName().c_str(), Util::enum_str(colorGen), Util::enum_str(alphaGen)) ); + if ( r_logFile->integer ) { + GLimp_LogComment( + va( "--- u_ColorModulate::SetUniform_ColorModulateColorGen( program = %s, colorGen = %s, alphaGen = %s ) ---\n", + _shader->GetName().c_str(), Util::enum_str( colorGen ), Util::enum_str( alphaGen ) ) + ); } - switch ( colorGen ) - { + switch ( colorGen ) { case colorGen_t::CGEN_VERTEX: needAttrib = true; - if ( vertexOverbright ) - { + if ( vertexOverbright ) { // vertexOverbright is only needed for non-lightmapped cases. When there is a // lightmap, this is done by multiplying with the overbright-scaled white image - VectorSet( v, tr.mapLightFactor, tr.mapLightFactor, tr.mapLightFactor ); - } - else - { - VectorSet( v, 1, 1, 1 ); + colorModulate |= Util::ordinal( ColorModulate::COLOR_LIGHTFACTOR ); + } else { + colorModulate |= Util::ordinal( ColorModulate::COLOR_ADD ); } break; case colorGen_t::CGEN_ONE_MINUS_VERTEX: needAttrib = true; - VectorSet( v, -1, -1, -1 ); + colorModulate |= Util::ordinal( ColorModulate::COLOR_ADD ) | Util::ordinal( ColorModulate::COLOR_NEGATE ); break; default: - VectorSet( v, 0, 0, 0 ); break; } - switch ( alphaGen ) - { + switch ( alphaGen ) { case alphaGen_t::AGEN_VERTEX: needAttrib = true; - v[ 3 ] = 1.0f; + colorModulate |= Util::ordinal( ColorModulate::ALPHA_ADD ); break; case alphaGen_t::AGEN_ONE_MINUS_VERTEX: needAttrib = true; - v[ 3 ] = -1.0f; + colorModulate |= Util::ordinal( ColorModulate::ALPHA_ADD ) | Util::ordinal( ColorModulate::ALPHA_NEGATE ); break; default: - v[ 3 ] = 0.0f; break; } - if ( needAttrib ) - { + if ( needAttrib ) { _shader->AddVertexAttribBit( ATTR_COLOR ); - } - else - { + } else { _shader->DelVertexAttribBit( ATTR_COLOR ); } - this->SetValue( v ); + this->SetValue( colorModulate ); } }; @@ -3929,7 +3950,8 @@ class GLShader_generic : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorModulate, + public u_ColorModulateColorGen, + public u_ColorModulateLightFactor, public u_Color, public u_Bones, public u_VertexInterpolation, @@ -3958,7 +3980,8 @@ class GLShader_genericMaterial : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorModulate, + public u_ColorModulateColorGen, + public u_ColorModulateLightFactor, public u_Color, public u_DepthScale, public u_ShowTris, @@ -3990,7 +4013,7 @@ class GLShader_lightMapping : public u_LightTiles, public u_TextureMatrix, public u_SpecularExponent, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_AlphaThreshold, public u_ViewOrigin, @@ -4042,7 +4065,7 @@ class GLShader_lightMappingMaterial : public u_LightTiles, public u_TextureMatrix, public u_SpecularExponent, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_AlphaThreshold, public u_ViewOrigin, @@ -4089,7 +4112,7 @@ class GLShader_forwardLighting_omniXYZ : public u_TextureMatrix, public u_SpecularExponent, public u_AlphaThreshold, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_ViewOrigin, public u_LightOrigin, @@ -4132,7 +4155,7 @@ class GLShader_forwardLighting_projXYZ : public u_TextureMatrix, public u_SpecularExponent, public u_AlphaThreshold, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_ViewOrigin, public u_LightOrigin, @@ -4182,7 +4205,7 @@ class GLShader_forwardLighting_directionalSun : public u_TextureMatrix, public u_SpecularExponent, public u_AlphaThreshold, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_ViewOrigin, public u_LightDir, diff --git a/src/engine/renderer/glsl_source/common.glsl b/src/engine/renderer/glsl_source/common.glsl new file mode 100644 index 0000000000..571e62edb2 --- /dev/null +++ b/src/engine/renderer/glsl_source/common.glsl @@ -0,0 +1,64 @@ +/* +=========================================================================== + +Daemon BSD Source Code +Copyright (c) 2024 Daemon Developers +All rights reserved. + +This file is part of the Daemon BSD Source Code (Daemon Source Code). + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Daemon developers nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL DAEMON DEVELOPERS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== +*/ + +/* common.glsl */ + +/* Common defines */ + +/* Allows accessing each element of a uvec4 array with a singular ID +Useful to avoid wasting memory due to alignment requirements +array must be in the form of uvec4 array[] */ + +#define UINT_FROM_UVEC4_ARRAY( array, id ) ( ( array )[( id ) / 4][( id ) % 4] ) +#define UVEC2_FROM_UVEC4_ARRAY( array, id ) ( ( id ) % 2 == 0 ? ( array )[( id ) / 2].xy : ( array )[( id ) / 2].zw ) + +/* Bit 0: color add +Bit 1: color negate +Bit 2: lightFactor add +Bit 3: alpha add +Bit 4: alpha negate */ + +float colorModArray[3] = float[3] ( 0.0f, 1.0f, -1.0f ); + +vec4 ColorModulateToColor( const in uint colorMod ) { + vec4 colorModulate = vec4( colorModArray[colorMod & 3] ); + colorModulate.a = ( colorModArray[( colorMod & 24 ) >> 3] ); + return colorModulate; +} + +vec4 ColorModulateToColor( const in uint colorMod, const in float lightFactor ) { + vec4 colorModulate = vec4( colorModArray[colorMod & 3] + ( colorMod & 4 ) * lightFactor ); + colorModulate.a = ( colorModArray[( colorMod & 24 ) >> 3] ); + return colorModulate; +} diff --git a/src/engine/renderer/glsl_source/forwardLighting_vp.glsl b/src/engine/renderer/glsl_source/forwardLighting_vp.glsl index 22d247c3c4..2263d926f3 100644 --- a/src/engine/renderer/glsl_source/forwardLighting_vp.glsl +++ b/src/engine/renderer/glsl_source/forwardLighting_vp.glsl @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* forwardLighting_vp.glsl */ +#insert common #insert vertexSimple_vp #insert vertexSkinning_vp #insert vertexAnimation_vp @@ -31,8 +32,8 @@ uniform mat4 u_LightAttenuationMatrix; uniform mat4 u_ModelMatrix; uniform mat4 u_ModelViewProjectionMatrix; -uniform vec4 u_ColorModulate; -uniform uint u_Color; +uniform uint u_ColorModulateColorGen; +uniform uint u_Color; uniform float u_Time; @@ -63,7 +64,7 @@ void main() VertexFetch( position, LB, color, texCoord, lmCoord); // assign color - color = color * u_ColorModulate + unpackUnorm4x8( u_Color ); + color = color * ColorModulateToColor( u_ColorModulateColorGen ) + unpackUnorm4x8( u_Color ); DeformVertex( position, LB.normal, diff --git a/src/engine/renderer/glsl_source/generic_vp.glsl b/src/engine/renderer/glsl_source/generic_vp.glsl index e8bdce44fc..742e881b1b 100644 --- a/src/engine/renderer/glsl_source/generic_vp.glsl +++ b/src/engine/renderer/glsl_source/generic_vp.glsl @@ -32,8 +32,9 @@ uniform vec3 u_ViewOrigin; uniform float u_Time; -uniform vec4 u_ColorModulate; -uniform uint u_Color; +uniform uint u_ColorModulateColorGen; +uniform uint u_Color; +uniform float u_ColorModulateLightFactor; #if defined(USE_TCGEN_ENVIRONMENT) uniform mat4 u_ModelMatrix; #endif @@ -63,7 +64,7 @@ void main() vec2 texCoord, lmCoord; VertexFetch( position, LB, color, texCoord, lmCoord ); - color = color * u_ColorModulate + unpackUnorm4x8( u_Color ); + color = color * ColorModulateToColor( u_ColorModulateColorGen, u_ColorModulateLightFactor ) + unpackUnorm4x8( u_Color ); DeformVertex( position, LB.normal, diff --git a/src/engine/renderer/glsl_source/lightMapping_vp.glsl b/src/engine/renderer/glsl_source/lightMapping_vp.glsl index f78d86228c..d261db5cbb 100644 --- a/src/engine/renderer/glsl_source/lightMapping_vp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_vp.glsl @@ -45,8 +45,8 @@ uniform mat4 u_ModelViewProjectionMatrix; uniform float u_Time; -uniform vec4 u_ColorModulate; -uniform uint u_Color; +uniform uint u_ColorModulateColorGen; +uniform uint u_Color; OUT(smooth) vec3 var_Position; OUT(smooth) vec2 var_TexCoords; @@ -73,7 +73,7 @@ void main() VertexFetch(position, LB, color, texCoord, lmCoord); - color = color * u_ColorModulate + unpackUnorm4x8( u_Color ); + color = color * ColorModulateToColor( u_ColorModulateColorGen ) + unpackUnorm4x8( u_Color ); DeformVertex(position, LB.normal, texCoord, color, u_Time); diff --git a/src/engine/renderer/shaders.cpp b/src/engine/renderer/shaders.cpp index c70d1b2ea0..01951f06c7 100644 --- a/src/engine/renderer/shaders.cpp +++ b/src/engine/renderer/shaders.cpp @@ -57,6 +57,7 @@ #include "skybox_fp.glsl.h" #include "material_vp.glsl.h" #include "material_fp.glsl.h" +#include "common.glsl.h" #include "common_cp.glsl.h" #include "shaderProfiler_vp.glsl.h" #include "shaderProfiler_fp.glsl.h" @@ -73,6 +74,7 @@ std::unordered_map shadermap({ { "computeLight_fp.glsl", std::string(reinterpret_cast(computeLight_fp_glsl), sizeof(computeLight_fp_glsl)) }, { "contrast_fp.glsl", std::string(reinterpret_cast(contrast_fp_glsl), sizeof(contrast_fp_glsl)) }, { "contrast_vp.glsl", std::string(reinterpret_cast(contrast_vp_glsl), sizeof(contrast_vp_glsl)) }, + { "common.glsl", std::string( reinterpret_cast< const char* >( common_glsl ), sizeof( common_glsl ) ) }, { "common_cp.glsl", std::string( reinterpret_cast< const char* >( common_cp_glsl ), sizeof( common_cp_glsl ) ) }, { "clearSurfaces_cp.glsl", std::string( reinterpret_cast< const char* >( clearSurfaces_cp_glsl ), sizeof( clearSurfaces_cp_glsl ) ) }, { "cull_cp.glsl", std::string( reinterpret_cast< const char* >( cull_cp_glsl ), sizeof( cull_cp_glsl ) ) }, diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index 3e1fb9cf66..cad421577e 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -1923,7 +1923,7 @@ static void RB_SetupLightForLighting( trRefLight_t *light ) // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); GL_State( GLS_POLYMODE_LINE | GLS_DEPTHTEST_DISABLE ); @@ -2779,7 +2779,7 @@ void RB_RunVisTests( ) gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_Color( Color::White ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -3383,7 +3383,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3524,7 +3524,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); // bind u_ColorMap @@ -3639,7 +3639,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); // bind u_ColorMap @@ -3704,7 +3704,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); // bind u_ColorMap @@ -3918,7 +3918,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -4051,7 +4051,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); GL_State( GLS_DEFAULT ); @@ -4133,7 +4133,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); GL_State( GLS_DEFAULT ); @@ -4224,7 +4224,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -4314,7 +4314,7 @@ static void RB_RenderDebugUtils() } // set uniforms - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); GL_State( GLS_POLYMODE_LINE | GLS_DEPTHTEST_DISABLE ); @@ -4367,7 +4367,7 @@ static void RB_RenderDebugUtils() Tess_End(); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); } } // i == 1 else @@ -4522,7 +4522,7 @@ void DebugDrawBegin( debugDrawMode_t mode, float size ) { // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( colorClear ); // bind u_ColorMap @@ -5642,7 +5642,7 @@ void RB_ShowImages() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_TextureMatrix( matrixIdentity ); GL_SelectTexture( 0 ); diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 778f083362..e62367c110 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -687,7 +687,8 @@ static void DrawTris() gl_genericShader->SetUniform_Color( Color::White ); } - gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); + gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); + gl_genericShader->SetUniform_ColorModulateLightFactor( tr.mapLightFactor ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -856,7 +857,8 @@ void Render_generic3D( shaderStage_t *pStage ) // since the `generic` fragment shader only takes a single input color. `lightMapping` on the // hand needs to know the real diffuse color, hence the separate u_LightFactor. bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && tess.bspSurface; - gl_genericShader->SetUniform_ColorModulate( rgbGen, alphaGen, mayUseVertexOverbright ); + gl_genericShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright ); + gl_genericShader->SetUniform_ColorModulateLightFactor( tr.mapLightFactor ); // u_Color gl_genericShader->SetUniform_Color( tess.svars.color ); @@ -1063,7 +1065,7 @@ void Render_lightMapping( shaderStage_t *pStage ) lightMode == lightMode_t::FULLBRIGHT ? 1.0f : tr.mapLightFactor ); // u_ColorModulate - gl_lightMappingShader->SetUniform_ColorModulate( rgbGen, alphaGen ); + gl_lightMappingShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); // u_Color gl_lightMappingShader->SetUniform_Color( tess.svars.color ); @@ -1340,7 +1342,7 @@ static void Render_forwardLighting_DBS_omni( shaderStage_t *pStage, colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_forwardLightingShader_omniXYZ->SetUniform_ColorModulate( rgbGen, alphaGen ); + gl_forwardLightingShader_omniXYZ->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); // u_Color gl_forwardLightingShader_omniXYZ->SetUniform_Color( tess.svars.color ); @@ -1515,7 +1517,7 @@ static void Render_forwardLighting_DBS_proj( shaderStage_t *pStage, colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_forwardLightingShader_projXYZ->SetUniform_ColorModulate( rgbGen, alphaGen ); + gl_forwardLightingShader_projXYZ->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); // u_Color gl_forwardLightingShader_projXYZ->SetUniform_Color( tess.svars.color ); @@ -1691,7 +1693,7 @@ static void Render_forwardLighting_DBS_directional( shaderStage_t *pStage, trRef colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_forwardLightingShader_directionalSun->SetUniform_ColorModulate( rgbGen, alphaGen ); + gl_forwardLightingShader_directionalSun->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); // u_Color gl_forwardLightingShader_directionalSun->SetUniform_Color( tess.svars.color ); From 2e2dab0c7d40eb39f8a7e13b308a9d6f4df74637 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Mon, 13 Jan 2025 05:46:53 +0300 Subject: [PATCH 4/7] Fix lightsyles with u_Color Move the multiplication by tr.mapLightFactor to the generic shader, store it in `u_ColorModulateColorGen`. --- src/engine/renderer/Material.cpp | 4 +-- src/engine/renderer/gl_shader.cpp | 2 -- src/engine/renderer/gl_shader.h | 26 +++++++------------ src/engine/renderer/glsl_source/common.glsl | 7 ++++- .../renderer/glsl_source/generic_vp.glsl | 6 +++-- .../renderer/glsl_source/lightMapping_vp.glsl | 1 + src/engine/renderer/tr_shade.cpp | 10 ++----- 7 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index d33d0e90fe..c5e292587f 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -223,8 +223,8 @@ void UpdateSurfaceDataGeneric3D( uint32_t* materials, Material& material, drawSu alphaGen_t alphaGen = SetAlphaGen( pStage ); bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && drawSurf->bspSurface; - gl_genericShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright ); - gl_genericShaderMaterial->SetUniform_ColorModulateLightFactor( tr.mapLightFactor ); + const bool styleLightMap = pStage->type == stageType_t::ST_STYLELIGHTMAP || pStage->type == stageType_t::ST_STYLECOLORMAP; + gl_genericShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright, styleLightMap ); Tess_ComputeColor( pStage ); gl_genericShaderMaterial->SetUniform_Color( tess.svars.color ); diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 727fbdc11b..084247b3b5 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -2195,7 +2195,6 @@ GLShader_generic::GLShader_generic( GLShaderManager *manager ) : u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), u_ColorModulateColorGen( this ), - u_ColorModulateLightFactor( this ), u_Color( this ), u_Bones( this ), u_VertexInterpolation( this ), @@ -2228,7 +2227,6 @@ GLShader_genericMaterial::GLShader_genericMaterial( GLShaderManager* manager ) : u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), u_ColorModulateColorGen( this ), - u_ColorModulateLightFactor( this ), u_Color( this ), u_DepthScale( this ), u_ShowTris( this ), diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index 00e04d434b..ed00345588 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -2151,19 +2151,6 @@ class u_LightFactor : } }; -// HACK: Light factor is set as a global uniform here so that genericMaterial struct can fit into 8 bytes -class u_ColorModulateLightFactor : - GLUniform1f { - public: - u_ColorModulateLightFactor( GLShader* shader ) : - GLUniform1f( shader, "u_ColorModulateLightFactor", true ) { - } - - void SetUniform_ColorModulateLightFactor( const float lightFactor ) { - this->SetValue( lightFactor / 4.0f ); // Multiplied by 4 in the shader to save on instructions - } -}; - class u_ColorMap : GLUniformSampler2D { public: @@ -3633,7 +3620,8 @@ class u_ColorModulateColorGen : GLUniform1ui( shader, "u_ColorModulateColorGen" ) { } - void SetUniform_ColorModulateColorGen( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false ) { + void SetUniform_ColorModulateColorGen( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false, + const bool styleLightMap = false ) { uint32_t colorModulate = 0; bool needAttrib = false; @@ -3651,6 +3639,7 @@ class u_ColorModulateColorGen : // vertexOverbright is only needed for non-lightmapped cases. When there is a // lightmap, this is done by multiplying with the overbright-scaled white image colorModulate |= Util::ordinal( ColorModulate::COLOR_LIGHTFACTOR ); + colorModulate |= uint32_t( tr.mapLightFactor / 4 ) << 5; } else { colorModulate |= Util::ordinal( ColorModulate::COLOR_ADD ); } @@ -3665,6 +3654,13 @@ class u_ColorModulateColorGen : break; } + if ( styleLightMap ) { + ASSERT_EQ( vertexOverbright, false ); + colorModulate |= uint32_t( tr.mapLightFactor ) << 5; + } else { + colorModulate |= 1 << 5; + } + switch ( alphaGen ) { case alphaGen_t::AGEN_VERTEX: needAttrib = true; @@ -3951,7 +3947,6 @@ class GLShader_generic : public u_ModelMatrix, public u_ModelViewProjectionMatrix, public u_ColorModulateColorGen, - public u_ColorModulateLightFactor, public u_Color, public u_Bones, public u_VertexInterpolation, @@ -3981,7 +3976,6 @@ class GLShader_genericMaterial : public u_ModelMatrix, public u_ModelViewProjectionMatrix, public u_ColorModulateColorGen, - public u_ColorModulateLightFactor, public u_Color, public u_DepthScale, public u_ShowTris, diff --git a/src/engine/renderer/glsl_source/common.glsl b/src/engine/renderer/glsl_source/common.glsl index 571e62edb2..cd548a5316 100644 --- a/src/engine/renderer/glsl_source/common.glsl +++ b/src/engine/renderer/glsl_source/common.glsl @@ -47,7 +47,8 @@ array must be in the form of uvec4 array[] */ Bit 1: color negate Bit 2: lightFactor add Bit 3: alpha add -Bit 4: alpha negate */ +Bit 4: alpha negate +Bit 5-12: lightFactor */ float colorModArray[3] = float[3] ( 0.0f, 1.0f, -1.0f ); @@ -62,3 +63,7 @@ vec4 ColorModulateToColor( const in uint colorMod, const in float lightFactor ) colorModulate.a = ( colorModArray[( colorMod & 24 ) >> 3] ); return colorModulate; } + +float ColorModulateToLightFactor( const in uint colorMod ) { + return ( colorMod >> 5 ) & 0xF; +} diff --git a/src/engine/renderer/glsl_source/generic_vp.glsl b/src/engine/renderer/glsl_source/generic_vp.glsl index 742e881b1b..6ea263733f 100644 --- a/src/engine/renderer/glsl_source/generic_vp.glsl +++ b/src/engine/renderer/glsl_source/generic_vp.glsl @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* generic_vp.glsl */ +#insert common #insert vertexSimple_vp #insert vertexSkinning_vp #insert vertexAnimation_vp @@ -34,7 +35,6 @@ uniform float u_Time; uniform uint u_ColorModulateColorGen; uniform uint u_Color; -uniform float u_ColorModulateLightFactor; #if defined(USE_TCGEN_ENVIRONMENT) uniform mat4 u_ModelMatrix; #endif @@ -64,7 +64,9 @@ void main() vec2 texCoord, lmCoord; VertexFetch( position, LB, color, texCoord, lmCoord ); - color = color * ColorModulateToColor( u_ColorModulateColorGen, u_ColorModulateLightFactor ) + unpackUnorm4x8( u_Color ); + float lightFactor = ColorModulateToLightFactor( u_ColorModulateColorGen ); + color = color * ColorModulateToColor( u_ColorModulateColorGen, lightFactor ) + + unpackUnorm4x8( u_Color ) * vec4( lightFactor, lightFactor, lightFactor, 1.0 ); DeformVertex( position, LB.normal, diff --git a/src/engine/renderer/glsl_source/lightMapping_vp.glsl b/src/engine/renderer/glsl_source/lightMapping_vp.glsl index d261db5cbb..6cdae695ed 100644 --- a/src/engine/renderer/glsl_source/lightMapping_vp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_vp.glsl @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* lightMapping_vp.glsl */ +#insert common #insert vertexSimple_vp #insert vertexSkinning_vp #insert vertexAnimation_vp diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index e62367c110..07a163825f 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -688,7 +688,6 @@ static void DrawTris() } gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); - gl_genericShader->SetUniform_ColorModulateLightFactor( tr.mapLightFactor ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -857,8 +856,8 @@ void Render_generic3D( shaderStage_t *pStage ) // since the `generic` fragment shader only takes a single input color. `lightMapping` on the // hand needs to know the real diffuse color, hence the separate u_LightFactor. bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && tess.bspSurface; - gl_genericShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright ); - gl_genericShader->SetUniform_ColorModulateLightFactor( tr.mapLightFactor ); + const bool styleLightMap = pStage->type == stageType_t::ST_STYLELIGHTMAP || pStage->type == stageType_t::ST_STYLECOLORMAP; + gl_genericShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright, styleLightMap ); // u_Color gl_genericShader->SetUniform_Color( tess.svars.color ); @@ -2503,11 +2502,6 @@ void Tess_ComputeColor( shaderStage_t *pStage ) } } - if ( pStage->type == stageType_t::ST_STYLELIGHTMAP || pStage->type == stageType_t::ST_STYLECOLORMAP ) - { - tess.svars.color *= tr.mapLightFactor; - } - // alphaGen switch ( pStage->alphaGen ) { From fe886fcd53afe538a5941430af03c2a636740d50 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Mon, 13 Jan 2025 06:02:55 +0300 Subject: [PATCH 5/7] Switch lightFactor to use u_ColorModulateColorGen `tr.mapLightFactor` is already in `u_ColorModulateColorGen` anyway, so there's no need for the extra uniform. --- src/engine/renderer/Material.cpp | 6 +----- src/engine/renderer/gl_shader.cpp | 2 -- src/engine/renderer/gl_shader.h | 21 ++----------------- src/engine/renderer/glsl_source/common.glsl | 2 +- .../renderer/glsl_source/computeLight_fp.glsl | 8 +++---- .../renderer/glsl_source/lightMapping_fp.glsl | 10 ++++++--- .../renderer/glsl_source/liquid_fp.glsl | 8 ++++++- src/engine/renderer/tr_shade.cpp | 6 +----- 8 files changed, 22 insertions(+), 41 deletions(-) diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index c5e292587f..1070522b60 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -285,12 +285,8 @@ void UpdateSurfaceDataLightMapping( uint32_t* materials, Material& material, dra bool enableGridLighting = ( lightMode == lightMode_t::GRID ); bool enableGridDeluxeMapping = ( deluxeMode == deluxeMode_t::GRID ); - // u_LightFactor - gl_lightMappingShaderMaterial->SetUniform_LightFactor( - lightMode == lightMode_t::FULLBRIGHT ? 1.0f : tr.mapLightFactor ); - // u_ColorModulate - gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); + gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, lightMode != lightMode_t::FULLBRIGHT ); // u_Color gl_lightMappingShaderMaterial->SetUniform_Color( tess.svars.color ); diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 084247b3b5..3ca0d19ca0 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -2267,7 +2267,6 @@ GLShader_lightMapping::GLShader_lightMapping( GLShaderManager *manager ) : u_ViewOrigin( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_LightFactor( this ), u_Bones( this ), u_VertexInterpolation( this ), u_ReliefDepthScale( this ), @@ -2336,7 +2335,6 @@ GLShader_lightMappingMaterial::GLShader_lightMappingMaterial( GLShaderManager* m u_ViewOrigin( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_LightFactor( this ), u_ReliefDepthScale( this ), u_ReliefOffsetBias( this ), u_NormalScale( this ), diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index ed00345588..e0f82ad03d 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -2136,21 +2136,6 @@ class GLCompileMacro_USE_PHYSICAL_MAPPING : } }; -class u_LightFactor : - GLUniform1f -{ -public: - u_LightFactor( GLShader *shader ) : - GLUniform1f( shader, "u_LightFactor" ) - { - } - - void SetUniform_LightFactor( const float lightFactor ) - { - this->SetValue( lightFactor ); - } -}; - class u_ColorMap : GLUniformSampler2D { public: @@ -3621,7 +3606,7 @@ class u_ColorModulateColorGen : } void SetUniform_ColorModulateColorGen( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false, - const bool styleLightMap = false ) { + const bool useMapLightFactor = false ) { uint32_t colorModulate = 0; bool needAttrib = false; @@ -3654,7 +3639,7 @@ class u_ColorModulateColorGen : break; } - if ( styleLightMap ) { + if ( useMapLightFactor ) { ASSERT_EQ( vertexOverbright, false ); colorModulate |= uint32_t( tr.mapLightFactor ) << 5; } else { @@ -4013,7 +3998,6 @@ class GLShader_lightMapping : public u_ViewOrigin, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_LightFactor, public u_Bones, public u_VertexInterpolation, public u_ReliefDepthScale, @@ -4065,7 +4049,6 @@ class GLShader_lightMappingMaterial : public u_ViewOrigin, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_LightFactor, public u_ReliefDepthScale, public u_ReliefOffsetBias, public u_NormalScale, diff --git a/src/engine/renderer/glsl_source/common.glsl b/src/engine/renderer/glsl_source/common.glsl index cd548a5316..32aa8a82eb 100644 --- a/src/engine/renderer/glsl_source/common.glsl +++ b/src/engine/renderer/glsl_source/common.glsl @@ -2,7 +2,7 @@ =========================================================================== Daemon BSD Source Code -Copyright (c) 2024 Daemon Developers +Copyright (c) 2024-2025 Daemon Developers All rights reserved. This file is part of the Daemon BSD Source Code (Daemon Source Code). diff --git a/src/engine/renderer/glsl_source/computeLight_fp.glsl b/src/engine/renderer/glsl_source/computeLight_fp.glsl index b36c132d39..64d405ecb6 100644 --- a/src/engine/renderer/glsl_source/computeLight_fp.glsl +++ b/src/engine/renderer/glsl_source/computeLight_fp.glsl @@ -23,8 +23,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define COMPUTELIGHT_GLSL -uniform float u_LightFactor; - #if !defined(USE_BSP_SURFACE) #define USE_MODEL_SURFACE #endif @@ -52,13 +50,13 @@ vec4 EnvironmentalSpecularFactor( vec3 viewDir, vec3 normal ) // lighting helper functions #if defined(USE_GRID_LIGHTING) || defined(USE_GRID_DELUXE_MAPPING) - void ReadLightGrid( in vec4 texel, out vec3 ambientColor, out vec3 lightColor ) { + void ReadLightGrid( in vec4 texel, in float lightFactor, out vec3 ambientColor, out vec3 lightColor ) { float ambientScale = 2.0 * texel.a; float directedScale = 2.0 - ambientScale; ambientColor = ambientScale * texel.rgb; lightColor = directedScale * texel.rgb; - ambientColor *= u_LightFactor; - lightColor *= u_LightFactor; + ambientColor *= lightFactor; + lightColor *= lightFactor; } #endif diff --git a/src/engine/renderer/glsl_source/lightMapping_fp.glsl b/src/engine/renderer/glsl_source/lightMapping_fp.glsl index bd9ce97f19..84af19f6ef 100644 --- a/src/engine/renderer/glsl_source/lightMapping_fp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_fp.glsl @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* lightMapping_fp.glsl */ +#insert common #insert computeLight_fp #insert reliefMapping_fp @@ -34,6 +35,8 @@ uniform sampler2D u_GlowMap; uniform float u_AlphaThreshold; uniform vec3 u_ViewOrigin; +uniform uint u_ColorModulateColorGen; + IN(smooth) vec3 var_Position; IN(smooth) vec2 var_TexCoords; IN(smooth) vec4 var_Color; @@ -140,19 +143,20 @@ void main() vec4 texel = texture3D(u_LightGrid2, lightGridPos); vec3 lightDir = normalize(texel.xyz - (128.0 / 255.0)); #endif - + + float lightFactor = ColorModulateToLightFactor( u_ColorModulateColorGen ); #if defined(USE_LIGHT_MAPPING) // Compute light color from world space lightmap. // When doing vertex lighting with full-range overbright, this reads out // 1<SetUniform_Time( backEnd.refdef.floatTime - backEnd.currentEntity->e.shaderTime ); - // u_LightFactor - gl_lightMappingShader->SetUniform_LightFactor( - lightMode == lightMode_t::FULLBRIGHT ? 1.0f : tr.mapLightFactor ); - // u_ColorModulate - gl_lightMappingShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); + gl_lightMappingShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, lightMode != lightMode_t::FULLBRIGHT ); // u_Color gl_lightMappingShader->SetUniform_Color( tess.svars.color ); From 2a37d2bf58db18d5f3787a7a4fa068043443f6e6 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Thu, 16 Jan 2025 05:10:16 +0300 Subject: [PATCH 6/7] Fix colorModulate for lightFactor < 4 Also fixes extra bits beng added to the `lightFactor` part `SetUniform_ColorModulateColorGen` in some cases. --- src/engine/renderer/gl_shader.h | 25 +++++++++++---------- src/engine/renderer/glsl_source/common.glsl | 16 ++++++------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index e0f82ad03d..7c49f7b9d8 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -3591,11 +3591,11 @@ class u_ColorModulate : }; enum class ColorModulate { - COLOR_ADD = BIT( 0 ), - COLOR_NEGATE = BIT( 1 ), + COLOR_ONE = BIT( 0 ), + COLOR_MINUS_ONE = BIT( 1 ), COLOR_LIGHTFACTOR = BIT( 2 ), - ALPHA_ADD = BIT( 3 ), - ALPHA_NEGATE = BIT( 4 ) + ALPHA_ONE = BIT( 3 ), + ALPHA_MINUS_ONE = BIT( 4 ) }; class u_ColorModulateColorGen : @@ -3617,6 +3617,7 @@ class u_ColorModulateColorGen : ); } + uint32_t lightFactor = 0; switch ( colorGen ) { case colorGen_t::CGEN_VERTEX: needAttrib = true; @@ -3624,15 +3625,15 @@ class u_ColorModulateColorGen : // vertexOverbright is only needed for non-lightmapped cases. When there is a // lightmap, this is done by multiplying with the overbright-scaled white image colorModulate |= Util::ordinal( ColorModulate::COLOR_LIGHTFACTOR ); - colorModulate |= uint32_t( tr.mapLightFactor / 4 ) << 5; + lightFactor = uint32_t( tr.mapLightFactor ) << 5; } else { - colorModulate |= Util::ordinal( ColorModulate::COLOR_ADD ); + colorModulate |= Util::ordinal( ColorModulate::COLOR_ONE ); } break; case colorGen_t::CGEN_ONE_MINUS_VERTEX: needAttrib = true; - colorModulate |= Util::ordinal( ColorModulate::COLOR_ADD ) | Util::ordinal( ColorModulate::COLOR_NEGATE ); + colorModulate |= Util::ordinal( ColorModulate::COLOR_MINUS_ONE ); break; default: @@ -3641,20 +3642,20 @@ class u_ColorModulateColorGen : if ( useMapLightFactor ) { ASSERT_EQ( vertexOverbright, false ); - colorModulate |= uint32_t( tr.mapLightFactor ) << 5; - } else { - colorModulate |= 1 << 5; + lightFactor = uint32_t( tr.mapLightFactor ) << 5; } + colorModulate |= lightFactor ? lightFactor : 1 << 5; + switch ( alphaGen ) { case alphaGen_t::AGEN_VERTEX: needAttrib = true; - colorModulate |= Util::ordinal( ColorModulate::ALPHA_ADD ); + colorModulate |= Util::ordinal( ColorModulate::ALPHA_ONE ); break; case alphaGen_t::AGEN_ONE_MINUS_VERTEX: needAttrib = true; - colorModulate |= Util::ordinal( ColorModulate::ALPHA_ADD ) | Util::ordinal( ColorModulate::ALPHA_NEGATE ); + colorModulate |= Util::ordinal( ColorModulate::ALPHA_MINUS_ONE ); break; default: diff --git a/src/engine/renderer/glsl_source/common.glsl b/src/engine/renderer/glsl_source/common.glsl index 32aa8a82eb..a539da8276 100644 --- a/src/engine/renderer/glsl_source/common.glsl +++ b/src/engine/renderer/glsl_source/common.glsl @@ -43,12 +43,12 @@ array must be in the form of uvec4 array[] */ #define UINT_FROM_UVEC4_ARRAY( array, id ) ( ( array )[( id ) / 4][( id ) % 4] ) #define UVEC2_FROM_UVEC4_ARRAY( array, id ) ( ( id ) % 2 == 0 ? ( array )[( id ) / 2].xy : ( array )[( id ) / 2].zw ) -/* Bit 0: color add -Bit 1: color negate -Bit 2: lightFactor add -Bit 3: alpha add -Bit 4: alpha negate -Bit 5-12: lightFactor */ +/* Bit 0: color * 1 +Bit 1: color * ( -1 ) +Bit 2: color += lightFactor +Bit 3: alpha * 1 +Bit 4: alpha * ( -1 ) +Bit 5-7: lightFactor */ float colorModArray[3] = float[3] ( 0.0f, 1.0f, -1.0f ); @@ -59,11 +59,11 @@ vec4 ColorModulateToColor( const in uint colorMod ) { } vec4 ColorModulateToColor( const in uint colorMod, const in float lightFactor ) { - vec4 colorModulate = vec4( colorModArray[colorMod & 3] + ( colorMod & 4 ) * lightFactor ); + vec4 colorModulate = vec4( colorModArray[colorMod & 3] + ( ( colorMod & 4 ) >> 2 ) * lightFactor ); colorModulate.a = ( colorModArray[( colorMod & 24 ) >> 3] ); return colorModulate; } float ColorModulateToLightFactor( const in uint colorMod ) { - return ( colorMod >> 5 ) & 0xF; + return ( colorMod >> 5 ) & 0x7; } From b00f38f3d2665200debfc98ab696dc552386ce8a Mon Sep 17 00:00:00 2001 From: VReaperV Date: Fri, 17 Jan 2025 03:49:23 +0300 Subject: [PATCH 7/7] std::iaslpha() -> Str::cisalpha() --- src/engine/renderer/gl_shader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 3ca0d19ca0..0c4b21bd45 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -1440,7 +1440,7 @@ std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::str for ( GLUniform* uniform : shader->_uniforms ) { if ( !uniform->IsGlobal() ) { const size_t pos = line.find( uniform->GetName() ); - if ( pos != std::string::npos && !std::isalpha( line[pos + strlen( uniform->GetName() ) ]) ) { + if ( pos != std::string::npos && !Str::cisalpha( line[pos + strlen( uniform->GetName() )] ) ) { skip = true; break; }