From e5a4cafd1be054c8c8297af67fe52b2a27d7f6b1 Mon Sep 17 00:00:00 2001 From: slipher Date: Tue, 5 Nov 2024 04:26:27 -0600 Subject: [PATCH 1/2] Use half float instead of int16 for color buffer This allows us to use values greater than 1 in the color buffer and as the color output of a fragment shader, so we don't have to worry so much about values getting clamped in multi-stage shaders. Co-authored-by: Thomas Debesse --- src/engine/renderer/tr_image.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 41bc26b0f9..7f7db93b3e 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2587,13 +2587,19 @@ static void R_CreateCurrentRenderImage() if ( r_highPrecisionRendering.Get() ) { - if ( !glConfig2.textureRGBA16BlendAvailable ) + if ( !glConfig2.textureFloatAvailable ) { - Log::Warn( "High-precision current render disabled because RGBA16 framebuffer blending is not available" ); + Log::Warn( "High-precision current render disabled because RGBA16F framebuffer is not available" ); } else { - imageParams.bits |= IF_RGBA16; + // Use float color buffer so that we can store intermediate results of a multi-stage + // shader which are greater than 1. For example, the sum of multiple lightmaps from + // a light style, or simply a single overbright-scaled lightmap which we did not + // manage to collapse with the diffuse. + // Besides preventing clamping of the color buffer itself, using a float color buffer + // also prevents the fragment shader's output color from being clamped before blending. + imageParams.bits |= IF_RGBA16F; } } From 344932f39ca3b0ad2aec047bbe10d03caf3d682b Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 30 Oct 2024 15:39:51 -0500 Subject: [PATCH 2/2] Simplify full-range overbright implementation Multiply lightmaps and light grid by the light factor right when they are used, instead of the elaborate canceling system. Vertex light multiplication in lightmapped stages is handled by the scaling of the white image lightmap (treated as 4.0). Various bugs will be fixed, since the canceling approach relied on detecting an enormous amount of special cases and not all of them were handled. In a few places there can be issues with intermediate color buffer values exceeding 1.0, but this is worked around (on reasonably good hardware) by the previous commit setting up an RGBA16F framebuffer. When limited to RGBA8 framebuffers, as can be tried with r_highPrecisionRendering 0, this rewrite is a mixed bag. In some places it leads to clamping in the color buffer (example: Pulse viewpos 4822 -1312 -1314 98 13), while in others it improves results due to the effective 2 extra bits of precision in the framebuffer (example: Procyon viewpos -955 3443 276 94 7). There are a few cases where lightmap/lightgrid scaling doesn't apply that required special handling: - For intermediate stages of light styles, the already-existing detection of STYLELIGHTMAP and STYLECOLORMAP is used. For these stage types u_Color is scaled by the light factor. Example: metro-b1-2 viewpos -1172 627 107 94 -21. - For non-lightmapped vertex-lit surfaces, u_ColorModulate is scaled by the light factor. Example: station15 small plants. - For fullbright lightmapped stages, the light factor is set to 1. Example: Procyon star chart. Some bugs (in non-clamped overbright mode) that are fixed by this commit: - Non-lightmapped vertex-lit surfaces (like the station15 plants) are now scaled by the light factor as they should be. - Procyon star chart is no longer too dark with material system. - Glowmap-like stage implemented with q3 syntax in a control panel shader are no longer wrongly overbright-scaled, causing visual noise. zittrig-arena viewpos 1201 -301 -338 87 0 Co-authored-by: Thomas Debesse --- src/engine/renderer/Material.cpp | 22 ++------ src/engine/renderer/gl_shader.cpp | 26 +++------ src/engine/renderer/gl_shader.h | 52 ++++++------------ .../glsl_source/cameraEffects_fp.glsl | 4 -- .../renderer/glsl_source/computeLight_fp.glsl | 4 ++ .../renderer/glsl_source/contrast_fp.glsl | 4 -- .../renderer/glsl_source/fogGlobal_fp.glsl | 3 -- .../renderer/glsl_source/fogQuake3_fp.glsl | 3 -- .../glsl_source/forwardLighting_fp.glsl | 4 +- .../renderer/glsl_source/generic_fp.glsl | 12 ----- .../renderer/glsl_source/lightMapping_fp.glsl | 32 ++--------- .../glsl_source/reflection_CB_fp.glsl | 4 -- .../glsl_source/shaderProfiler_fp.glsl | 7 --- .../renderer/glsl_source/skybox_fp.glsl | 3 -- src/engine/renderer/tr_backend.cpp | 25 +-------- src/engine/renderer/tr_bsp.cpp | 2 - src/engine/renderer/tr_local.h | 4 -- src/engine/renderer/tr_scene.cpp | 6 --- src/engine/renderer/tr_shade.cpp | 40 +++++--------- src/engine/renderer/tr_shader.cpp | 54 ------------------- src/engine/renderer/tr_sky.cpp | 3 -- 21 files changed, 50 insertions(+), 264 deletions(-) diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index 26e960b5b9..02d168a740 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -222,15 +222,12 @@ void UpdateSurfaceDataGeneric3D( uint32_t* materials, Material& material, drawSu // u_AlphaThreshold gl_genericShaderMaterial->SetUniform_AlphaTest( pStage->stateBits ); - // u_InverseLightFactor - float inverseLightFactor = pStage->cancelOverBright ? tr.mapInverseLightFactor : 1.0f; - gl_genericShaderMaterial->SetUniform_InverseLightFactor( inverseLightFactor ); - // u_ColorModulate colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_genericShaderMaterial->SetUniform_ColorModulate( rgbGen, alphaGen ); + bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && drawSurf->bspSurface; + gl_genericShaderMaterial->SetUniform_ColorModulate( rgbGen, alphaGen, mayUseVertexOverbright ); Tess_ComputeColor( pStage ); gl_genericShaderMaterial->SetUniform_Color( tess.svars.color ); @@ -291,12 +288,9 @@ void UpdateSurfaceDataLightMapping( uint32_t* materials, Material& material, dra bool enableGridLighting = ( lightMode == lightMode_t::GRID ); bool enableGridDeluxeMapping = ( deluxeMode == deluxeMode_t::GRID ); - // u_InverseLightFactor - /* HACK: use sign to know if there is a light or not, and - then if it will receive overbright multiplication or not. */ - bool cancelOverBright = pStage->cancelOverBright || lightMode == lightMode_t::FULLBRIGHT; - float inverseLightFactor = cancelOverBright ? tr.mapInverseLightFactor : -tr.mapInverseLightFactor; - gl_lightMappingShaderMaterial->SetUniform_InverseLightFactor( inverseLightFactor ); + // u_LightFactor + gl_lightMappingShaderMaterial->SetUniform_LightFactor( + lightMode == lightMode_t::FULLBRIGHT ? 1.0f : tr.mapLightFactor ); // u_ColorModulate gl_lightMappingShaderMaterial->SetUniform_ColorModulate( rgbGen, alphaGen ); @@ -470,9 +464,6 @@ void UpdateSurfaceDataSkybox( uint32_t* materials, Material& material, drawSurf_ // u_AlphaThreshold gl_skyboxShaderMaterial->SetUniform_AlphaTest( GLS_ATEST_NONE ); - // u_InverseLightFactor - gl_skyboxShaderMaterial->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - gl_skyboxShaderMaterial->WriteUniformsToBuffer( materials ); } @@ -620,9 +611,6 @@ void UpdateSurfaceDataFog( uint32_t* materials, Material& material, drawSurf_t* const fog_t* fog = material.fog; - // u_InverseLightFactor - gl_fogQuake3ShaderMaterial->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - // u_Color gl_fogQuake3ShaderMaterial->SetUniform_Color( fog->color ); diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 620af3155a..64923fa81d 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -2210,7 +2210,6 @@ GLShader_generic::GLShader_generic( GLShaderManager *manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ), u_ColorModulate( this ), u_Color( this ), u_Bones( this ), @@ -2243,7 +2242,6 @@ GLShader_genericMaterial::GLShader_genericMaterial( GLShaderManager* manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ), u_ColorModulate( this ), u_Color( this ), u_DepthScale( this ), @@ -2285,7 +2283,7 @@ GLShader_lightMapping::GLShader_lightMapping( GLShaderManager *manager ) : u_ViewOrigin( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ), + u_LightFactor( this ), u_Bones( this ), u_VertexInterpolation( this ), u_ReliefDepthScale( this ), @@ -2354,7 +2352,7 @@ GLShader_lightMappingMaterial::GLShader_lightMappingMaterial( GLShaderManager* m u_ViewOrigin( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ), + u_LightFactor( this ), u_ReliefDepthScale( this ), u_ReliefOffsetBias( this ), u_NormalScale( this ), @@ -2413,7 +2411,6 @@ GLShader_forwardLighting_omniXYZ::GLShader_forwardLighting_omniXYZ( GLShaderMana u_ViewOrigin( this ), u_LightOrigin( this ), u_LightColor( this ), - u_InverseLightFactor( this ), u_LightRadius( this ), u_LightScale( this ), u_LightAttenuationMatrix( this ), @@ -2467,7 +2464,6 @@ GLShader_forwardLighting_projXYZ::GLShader_forwardLighting_projXYZ( GLShaderMana u_ViewOrigin( this ), u_LightOrigin( this ), u_LightColor( this ), - u_InverseLightFactor( this ), u_LightRadius( this ), u_LightScale( this ), u_LightAttenuationMatrix( this ), @@ -2532,7 +2528,6 @@ GLShader_forwardLighting_directionalSun::GLShader_forwardLighting_directionalSun u_ViewOrigin( this ), u_LightDir( this ), u_LightColor( this ), - u_InverseLightFactor( this ), u_LightRadius( this ), u_LightScale( this ), u_LightAttenuationMatrix( this ), @@ -2622,7 +2617,6 @@ GLShader_reflection::GLShader_reflection( GLShaderManager *manager ): u_NormalScale( this ), u_VertexInterpolation( this ), u_CameraPosition( this ), - u_InverseLightFactor( this ), GLDeformStage( this ), GLCompileMacro_USE_VERTEX_SKINNING( this ), GLCompileMacro_USE_VERTEX_ANIMATION( this ), @@ -2651,7 +2645,6 @@ GLShader_reflectionMaterial::GLShader_reflectionMaterial( GLShaderManager* manag u_ReliefOffsetBias( this ), u_NormalScale( this ), u_CameraPosition( this ), - u_InverseLightFactor( this ), GLDeformStage( this ), GLCompileMacro_USE_HEIGHTMAP_IN_NORMALMAP( this ), GLCompileMacro_USE_RELIEF_MAPPING( this ) { @@ -2673,8 +2666,7 @@ GLShader_skybox::GLShader_skybox( GLShaderManager *manager ) : u_UseCloudMap( this ), u_AlphaThreshold( this ), u_ModelMatrix( this ), - u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ) + u_ModelViewProjectionMatrix( this ) { } @@ -2694,9 +2686,8 @@ GLShader_skyboxMaterial::GLShader_skyboxMaterial( GLShaderManager* manager ) : u_UseCloudMap( this ), u_AlphaThreshold( this ), u_ModelMatrix( this ), - u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ) { -} + u_ModelViewProjectionMatrix( this ) +{} void GLShader_skyboxMaterial::SetShaderProgramUniforms( shaderProgram_t* shaderProgram ) { glUniform1i( glGetUniformLocation( shaderProgram->program, "u_ColorMap" ), 0 ); @@ -2708,7 +2699,6 @@ GLShader_fogQuake3::GLShader_fogQuake3( GLShaderManager *manager ) : u_FogMap( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ), u_Color( this ), u_Bones( this ), u_VertexInterpolation( this ), @@ -2731,7 +2721,6 @@ GLShader_fogQuake3Material::GLShader_fogQuake3Material( GLShaderManager* manager u_FogMap( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ), u_Color( this ), u_FogDistanceVector( this ), u_FogDepthVector( this ), @@ -2751,7 +2740,6 @@ GLShader_fogGlobal::GLShader_fogGlobal( GLShaderManager *manager ) : u_ViewMatrix( this ), u_ModelViewProjectionMatrix( this ), u_UnprojectMatrix( this ), - u_InverseLightFactor( this ), u_Color( this ), u_FogDistanceVector( this ), u_FogDepthVector( this ) @@ -2861,8 +2849,7 @@ void GLShader_portal::SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) GLShader_contrast::GLShader_contrast( GLShaderManager *manager ) : GLShader( "contrast", ATTR_POSITION, manager ), u_ColorMap( this ), - u_ModelViewProjectionMatrix( this ), - u_InverseLightFactor( this ) + u_ModelViewProjectionMatrix( this ) { } @@ -2878,7 +2865,6 @@ GLShader_cameraEffects::GLShader_cameraEffects( GLShaderManager *manager ) : u_ColorModulate( this ), u_TextureMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_LightFactor( this ), u_DeformMagnitude( this ), u_InverseGamma( this ) { diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index fff592e99e..507aeab4ac 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -2150,21 +2150,6 @@ class u_LightFactor : } }; -class u_InverseLightFactor : - GLUniform1f -{ -public: - u_InverseLightFactor( GLShader *shader ) : - GLUniform1f( shader, "u_InverseLightFactor" ) - { - } - - void SetUniform_InverseLightFactor( const float inverseLightFactor ) - { - this->SetValue( inverseLightFactor ); - } -}; - class u_ColorMap : GLUniformSampler2D { public: @@ -3617,7 +3602,7 @@ class u_ColorModulate : { this->SetValue( v ); } - void SetUniform_ColorModulate( colorGen_t colorGen, alphaGen_t alphaGen ) + void SetUniform_ColorModulate( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false ) { vec4_t v; bool needAttrib = false; @@ -3631,7 +3616,16 @@ class u_ColorModulate : { case colorGen_t::CGEN_VERTEX: needAttrib = true; - VectorSet( v, 1, 1, 1 ); + 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 ); + } break; case colorGen_t::CGEN_ONE_MINUS_VERTEX: @@ -3946,7 +3940,6 @@ class GLShader_generic : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_InverseLightFactor, public u_ColorModulate, public u_Color, public u_Bones, @@ -3976,7 +3969,6 @@ class GLShader_genericMaterial : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_InverseLightFactor, public u_ColorModulate, public u_Color, public u_DepthScale, @@ -4015,7 +4007,7 @@ class GLShader_lightMapping : public u_ViewOrigin, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_InverseLightFactor, + public u_LightFactor, public u_Bones, public u_VertexInterpolation, public u_ReliefDepthScale, @@ -4067,7 +4059,7 @@ class GLShader_lightMappingMaterial : public u_ViewOrigin, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_InverseLightFactor, + public u_LightFactor, public u_ReliefDepthScale, public u_ReliefOffsetBias, public u_NormalScale, @@ -4113,7 +4105,6 @@ class GLShader_forwardLighting_omniXYZ : public u_ViewOrigin, public u_LightOrigin, public u_LightColor, - public u_InverseLightFactor, public u_LightRadius, public u_LightScale, public u_LightAttenuationMatrix, @@ -4157,7 +4148,6 @@ class GLShader_forwardLighting_projXYZ : public u_ViewOrigin, public u_LightOrigin, public u_LightColor, - public u_InverseLightFactor, public u_LightRadius, public u_LightScale, public u_LightAttenuationMatrix, @@ -4208,7 +4198,6 @@ class GLShader_forwardLighting_directionalSun : public u_ViewOrigin, public u_LightDir, public u_LightColor, - public u_InverseLightFactor, public u_LightRadius, public u_LightScale, public u_LightAttenuationMatrix, @@ -4275,7 +4264,6 @@ class GLShader_reflection : public u_NormalScale, public u_VertexInterpolation, public u_CameraPosition, - public u_InverseLightFactor, public GLDeformStage, public GLCompileMacro_USE_VERTEX_SKINNING, public GLCompileMacro_USE_VERTEX_ANIMATION, @@ -4300,7 +4288,6 @@ class GLShader_reflectionMaterial : public u_ReliefOffsetBias, public u_NormalScale, public u_CameraPosition, - public u_InverseLightFactor, public GLDeformStage, public GLCompileMacro_USE_HEIGHTMAP_IN_NORMALMAP, public GLCompileMacro_USE_RELIEF_MAPPING { @@ -4319,8 +4306,7 @@ class GLShader_skybox : public u_UseCloudMap, public u_AlphaThreshold, public u_ModelMatrix, - public u_ModelViewProjectionMatrix, - public u_InverseLightFactor + public u_ModelViewProjectionMatrix { public: GLShader_skybox( GLShaderManager *manager ); @@ -4337,8 +4323,7 @@ class GLShader_skyboxMaterial : public u_UseCloudMap, public u_AlphaThreshold, public u_ModelMatrix, - public u_ModelViewProjectionMatrix, - public u_InverseLightFactor { + public u_ModelViewProjectionMatrix { public: GLShader_skyboxMaterial( GLShaderManager* manager ); void SetShaderProgramUniforms( shaderProgram_t* shaderProgram ) override; @@ -4349,7 +4334,6 @@ class GLShader_fogQuake3 : public u_FogMap, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_InverseLightFactor, public u_Color, public u_Bones, public u_VertexInterpolation, @@ -4370,7 +4354,6 @@ class GLShader_fogQuake3Material : public u_FogMap, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_InverseLightFactor, public u_Color, public u_FogDistanceVector, public u_FogDepthVector, @@ -4389,7 +4372,6 @@ class GLShader_fogGlobal : public u_ViewMatrix, public u_ModelViewProjectionMatrix, public u_UnprojectMatrix, - public u_InverseLightFactor, public u_Color, public u_FogDistanceVector, public u_FogDepthVector @@ -4484,8 +4466,7 @@ class GLShader_portal : class GLShader_contrast : public GLShader, public u_ColorMap, - public u_ModelViewProjectionMatrix, - public u_InverseLightFactor + public u_ModelViewProjectionMatrix { public: GLShader_contrast( GLShaderManager *manager ); @@ -4499,7 +4480,6 @@ class GLShader_cameraEffects : public u_ColorModulate, public u_TextureMatrix, public u_ModelViewProjectionMatrix, - public u_LightFactor, public u_DeformMagnitude, public u_InverseGamma { diff --git a/src/engine/renderer/glsl_source/cameraEffects_fp.glsl b/src/engine/renderer/glsl_source/cameraEffects_fp.glsl index 9e70baafb3..e58b37bbd9 100644 --- a/src/engine/renderer/glsl_source/cameraEffects_fp.glsl +++ b/src/engine/renderer/glsl_source/cameraEffects_fp.glsl @@ -28,8 +28,6 @@ uniform sampler2D u_CurrentMap; uniform sampler3D u_ColorMap3D; #endif -uniform float u_LightFactor; - uniform vec4 u_ColorModulate; uniform float u_InverseGamma; @@ -44,8 +42,6 @@ void main() vec4 color = texture2D(u_CurrentMap, st); - color.rgb *= u_LightFactor; - color = clamp(color, 0.0, 1.0); #if defined(r_colorGrading) diff --git a/src/engine/renderer/glsl_source/computeLight_fp.glsl b/src/engine/renderer/glsl_source/computeLight_fp.glsl index d9e8eb76b6..b36c132d39 100644 --- a/src/engine/renderer/glsl_source/computeLight_fp.glsl +++ b/src/engine/renderer/glsl_source/computeLight_fp.glsl @@ -23,6 +23,8 @@ 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 @@ -55,6 +57,8 @@ vec4 EnvironmentalSpecularFactor( vec3 viewDir, vec3 normal ) float directedScale = 2.0 - ambientScale; ambientColor = ambientScale * texel.rgb; lightColor = directedScale * texel.rgb; + ambientColor *= u_LightFactor; + lightColor *= u_LightFactor; } #endif diff --git a/src/engine/renderer/glsl_source/contrast_fp.glsl b/src/engine/renderer/glsl_source/contrast_fp.glsl index 7c06cd7a8f..ef74cf594b 100644 --- a/src/engine/renderer/glsl_source/contrast_fp.glsl +++ b/src/engine/renderer/glsl_source/contrast_fp.glsl @@ -24,8 +24,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA uniform sampler2D u_ColorMap; -uniform float u_InverseLightFactor; - const vec4 LUMINANCE_VECTOR = vec4(0.2125, 0.7154, 0.0721, 0.0); #if __VERSION__ > 120 @@ -59,7 +57,5 @@ void main() color += f(texture2D(u_ColorMap, st + vec2(1.0, 1.0) * scale)); color *= 0.25; - color.rgb *= u_InverseLightFactor; - outputColor = color; } diff --git a/src/engine/renderer/glsl_source/fogGlobal_fp.glsl b/src/engine/renderer/glsl_source/fogGlobal_fp.glsl index 2151f5b1b9..ad05524a9a 100644 --- a/src/engine/renderer/glsl_source/fogGlobal_fp.glsl +++ b/src/engine/renderer/glsl_source/fogGlobal_fp.glsl @@ -25,7 +25,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA uniform sampler2D u_ColorMap; // fog texture uniform sampler2D u_DepthMap; -uniform float u_InverseLightFactor; uniform vec3 u_ViewOrigin; uniform vec4 u_FogDistanceVector; uniform vec4 u_FogDepthVector; @@ -56,7 +55,5 @@ void main() vec4 color = texture2D(u_ColorMap, st); - color.rgb *= u_InverseLightFactor; - outputColor = u_Color * color; } diff --git a/src/engine/renderer/glsl_source/fogQuake3_fp.glsl b/src/engine/renderer/glsl_source/fogQuake3_fp.glsl index 459658a4de..ab31ca9fb3 100644 --- a/src/engine/renderer/glsl_source/fogQuake3_fp.glsl +++ b/src/engine/renderer/glsl_source/fogQuake3_fp.glsl @@ -26,7 +26,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA uniform sampler2D u_FogMap; -uniform float u_InverseLightFactor; IN(smooth) vec3 var_Position; IN(smooth) vec2 var_TexCoords; IN(smooth) vec4 var_Color; @@ -41,8 +40,6 @@ void main() color *= var_Color; - color.rgb *= u_InverseLightFactor; - outputColor = color; #if 0 diff --git a/src/engine/renderer/glsl_source/forwardLighting_fp.glsl b/src/engine/renderer/glsl_source/forwardLighting_fp.glsl index 8cdff5ea10..1021815f2b 100644 --- a/src/engine/renderer/glsl_source/forwardLighting_fp.glsl +++ b/src/engine/renderer/glsl_source/forwardLighting_fp.glsl @@ -22,7 +22,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* forwardLighting_fp.glsl */ +// computeSpecularity is the only thing used from this file #insert computeLight_fp + #insert reliefMapping_fp /* swizzle one- and two-component textures to RG */ @@ -68,7 +70,6 @@ uniform vec3 u_LightDir; uniform vec3 u_LightOrigin; #endif uniform vec3 u_LightColor; -uniform float u_InverseLightFactor; uniform float u_LightRadius; uniform float u_LightScale; uniform float u_AlphaThreshold; @@ -1015,7 +1016,6 @@ void main() color.rgb *= attenuationZ; #endif color.rgb *= abs(u_LightScale); - color.rgb *= u_InverseLightFactor; color.rgb *= shadow; color.rgb *= var_Color.rgb; diff --git a/src/engine/renderer/glsl_source/generic_fp.glsl b/src/engine/renderer/glsl_source/generic_fp.glsl index 85f3f1d1fd..2c4b5c4f9c 100644 --- a/src/engine/renderer/glsl_source/generic_fp.glsl +++ b/src/engine/renderer/glsl_source/generic_fp.glsl @@ -27,10 +27,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA uniform sampler2D u_ColorMap; uniform float u_AlphaThreshold; -#if !defined(GENERIC_2D) - uniform float u_InverseLightFactor; -#endif - #if defined(USE_MATERIAL_SYSTEM) uniform bool u_ShowTris; uniform vec3 u_MaterialColour; @@ -74,10 +70,6 @@ void main() #endif color *= var_Color; - -#if !defined(GENERIC_2D) - color.rgb *= u_InverseLightFactor; -#endif SHADER_PROFILER_SET( color ) @@ -92,9 +84,5 @@ void main() outputColor = vec4(0.0, 0.0, 0.0, 0.0); #elif defined(USE_MATERIAL_SYSTEM) && defined(r_showGlobalMaterials) outputColor.rgb = u_MaterialColour; - - #if !defined(GENERIC_2D) && !defined(USE_DEPTH_FADE) - outputColor.rgb *= u_InverseLightFactor; - #endif #endif } diff --git a/src/engine/renderer/glsl_source/lightMapping_fp.glsl b/src/engine/renderer/glsl_source/lightMapping_fp.glsl index 8ec26659e4..bd9ce97f19 100644 --- a/src/engine/renderer/glsl_source/lightMapping_fp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_fp.glsl @@ -32,7 +32,6 @@ uniform sampler2D u_MaterialMap; uniform sampler2D u_GlowMap; uniform float u_AlphaThreshold; -uniform float u_InverseLightFactor; uniform vec3 u_ViewOrigin; IN(smooth) vec3 var_Position; @@ -144,7 +143,10 @@ void main() #if defined(USE_LIGHT_MAPPING) // Compute light color from world space lightmap. + // When doing vertex lighting with full-range overbright, this reads out + // 1< 0 ) - { - color.rgb *= u_InverseLightFactor; - } - #if defined(r_glowMapping) // Blend glow map. vec3 glow = texture2D(u_GlowMap, texCoords).rgb; - /* HACK: use sign to know if there is a light or not, and - then if it will receive overbright multiplication or not. */ - if ( u_InverseLightFactor < 0 ) - { - glow *= - u_InverseLightFactor; - } - color.rgb += glow; #endif @@ -247,13 +235,6 @@ void main() vec4 envColor1 = textureCube(u_EnvironmentMap1, reflect(-viewDir, normal)); outputColor = vec4( mix(envColor0, envColor1, u_EnvironmentInterpolation).rgb, 1.0 ); - - /* HACK: use sign to know if there is a light or not, and - then if it will receive overbright multiplication or not. */ - if ( u_InverseLightFactor < 0 ) - { - outputColor *= - u_InverseLightFactor; - } #elif defined(r_showVertexColors) /* We need to keep the texture alpha channel so impact marks like creep don't fully overwrite the world texture. */ @@ -265,12 +246,5 @@ void main() #endif #elif defined(USE_MATERIAL_SYSTEM) && defined(r_showGlobalMaterials) outputColor.rgb = u_MaterialColour + lightColor.rgb * u_MaterialColour; - - /* HACK: use sign to know if there is a light or not, and - then if it will receive overbright multiplication or not. */ - if ( u_InverseLightFactor < 0 ) - { - outputColor *= - u_InverseLightFactor; - } #endif } diff --git a/src/engine/renderer/glsl_source/reflection_CB_fp.glsl b/src/engine/renderer/glsl_source/reflection_CB_fp.glsl index 1943185880..298d79ac44 100644 --- a/src/engine/renderer/glsl_source/reflection_CB_fp.glsl +++ b/src/engine/renderer/glsl_source/reflection_CB_fp.glsl @@ -30,8 +30,6 @@ uniform samplerCube u_ColorMapCube; uniform vec3 u_ViewOrigin; uniform mat4 u_ModelMatrix; -uniform float u_InverseLightFactor; - IN(smooth) vec3 var_Position; IN(smooth) vec2 var_TexCoords; IN(smooth) vec4 var_Tangent; @@ -73,8 +71,6 @@ void main() #if defined(r_showCubeProbes) viewDir = normalize(var_Position); outputColor = textureCube(u_ColorMapCube, viewDir); - - outputColor.rgb *= u_InverseLightFactor; #endif // outputColor = vec4(1.0, 0.0, 0.0, 1.0); } diff --git a/src/engine/renderer/glsl_source/shaderProfiler_fp.glsl b/src/engine/renderer/glsl_source/shaderProfiler_fp.glsl index 32883bbf6a..aaf4fd7202 100644 --- a/src/engine/renderer/glsl_source/shaderProfiler_fp.glsl +++ b/src/engine/renderer/glsl_source/shaderProfiler_fp.glsl @@ -51,13 +51,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. color += vec4( count < 0.5 ? count + 0.5 : 0.0, count >= 0.5 ? count : 0.0, 0.0, 1.0 ); - - /* HACK: use sign to know if there is a light or not, and - then if it will receive overbright multiplication or not. */ - if ( u_InverseLightFactor < 0 ) - { - color *= -u_InverseLightFactor; - } } } #else diff --git a/src/engine/renderer/glsl_source/skybox_fp.glsl b/src/engine/renderer/glsl_source/skybox_fp.glsl index c900e69512..13f0fa2477 100644 --- a/src/engine/renderer/glsl_source/skybox_fp.glsl +++ b/src/engine/renderer/glsl_source/skybox_fp.glsl @@ -28,7 +28,6 @@ const float radiusWorld = 4096.0; // Value used by quake 3 skybox code uniform samplerCube u_ColorMapCube; -uniform float u_InverseLightFactor; uniform sampler2D u_CloudMap; uniform bool u_UseCloudMap; @@ -77,7 +76,5 @@ void main() return; } - color.rgb *= u_InverseLightFactor; - outputColor = color; } diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index 2676ae4eab..d6029e8794 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -1921,7 +1921,6 @@ static void RB_SetupLightForLighting( trRefLight_t *light ) gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); - // TODO: set u_InverseLightFactor! GL_State( GLS_POLYMODE_LINE | GLS_DEPTHTEST_DISABLE ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -2774,7 +2773,6 @@ void RB_RunVisTests( ) gl_genericShader->SetUniform_Color( Color::White ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -2980,9 +2978,6 @@ void RB_RenderGlobalFog() gl_fogGlobalShader->SetUniform_ViewOrigin( backEnd.viewParms.orientation.origin ); // world space - // u_InverseLightFactor - gl_fogGlobalShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - { fog_t *fog; @@ -3077,9 +3072,6 @@ void RB_RenderBloom() // render contrast downscaled to 1/4th of the screen gl_contrastShader->BindProgram( 0 ); - // u_InverseLightFactor - gl_contrastShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - gl_contrastShader->SetUniform_ColorMapBindless( GL_BindToTMU( 0, tr.currentRenderImage[backEnd.currentMainFBO] ) ); @@ -3240,7 +3232,7 @@ void RB_RenderSSAO() if ( r_ssao->integer < 0 ) { // clear the screen to show only SSAO - GL_ClearColor( tr.mapInverseLightFactor, tr.mapInverseLightFactor, tr.mapInverseLightFactor, 1.0 ); + GL_ClearColor( 1.0, 1.0, 1.0, 1.0 ); glClear( GL_COLOR_BUFFER_BIT ); } @@ -3354,9 +3346,6 @@ void RB_CameraPostFX() // enable shader, set arrays gl_cameraEffectsShader->BindProgram( 0 ); - // u_LightFactor - gl_cameraEffectsShader->SetUniform_LightFactor( tr.mapLightFactor ); - gl_cameraEffectsShader->SetUniform_ColorModulate( backEnd.viewParms.gradingWeights ); gl_cameraEffectsShader->SetUniform_InverseGamma( 1.0 / r_gamma->value ); @@ -3410,7 +3399,6 @@ 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_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3553,7 +3541,6 @@ static void RB_RenderDebugUtils() gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3669,7 +3656,6 @@ static void RB_RenderDebugUtils() gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3735,7 +3721,6 @@ static void RB_RenderDebugUtils() gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3949,7 +3934,6 @@ 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_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -4027,8 +4011,6 @@ static void RB_RenderDebugUtils() gl_reflectionShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_reflectionShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); - gl_reflectionShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - if ( r_showCubeProbes.Get() == Util::ordinal( showCubeProbesMode::GRID ) ) { // Debug rendering can be really slow here for ( auto it = tr.cubeProbeGrid.begin(); it != tr.cubeProbeGrid.end(); it++ ) { @@ -4086,7 +4068,6 @@ static void RB_RenderDebugUtils() gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); GL_State( GLS_DEFAULT ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -4169,7 +4150,6 @@ static void RB_RenderDebugUtils() gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( Color::Black ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); GL_State( GLS_DEFAULT ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -4260,7 +4240,6 @@ 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_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -4560,7 +4539,6 @@ void DebugDrawBegin( debugDrawMode_t mode, float size ) { gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_Color( colorClear ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -5681,7 +5659,6 @@ void RB_ShowImages() gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); gl_genericShader->SetUniform_TextureMatrix( matrixIdentity ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); GL_SelectTexture( 0 ); diff --git a/src/engine/renderer/tr_bsp.cpp b/src/engine/renderer/tr_bsp.cpp index 46c28cb617..a997ced291 100644 --- a/src/engine/renderer/tr_bsp.cpp +++ b/src/engine/renderer/tr_bsp.cpp @@ -5112,7 +5112,6 @@ void RE_LoadWorldMap( const char *name ) tr.modelLight = lightMode_t::FULLBRIGHT; tr.modelDeluxe = deluxeMode_t::NONE; tr.mapLightFactor = 1.0f; - tr.mapInverseLightFactor = 1.0f; // Use fullbright lighting for everything if the world is fullbright. if ( tr.worldLight != lightMode_t::FULLBRIGHT ) @@ -5189,7 +5188,6 @@ void RE_LoadWorldMap( const char *name ) if ( !tr.legacyOverBrightClamping && tr.lightMode != lightMode_t::FULLBRIGHT ) { tr.mapLightFactor = pow( 2, tr.mapOverBrightBits ); - tr.mapInverseLightFactor = 1.0f / tr.mapLightFactor; } tr.worldLoaded = true; diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 6162bb9743..9350907f6f 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -1075,8 +1075,6 @@ enum class shaderProfilerRenderSubGroupsMode { bool dpMaterial; - bool cancelOverBright; - // Core renderer (code path for when only OpenGL Core is available, or compatible OpenGL 2). stageRenderer_t colorRenderer; @@ -2769,8 +2767,6 @@ enum class shaderProfilerRenderSubGroupsMode { int mapOverBrightBits; // pow(2, mapOverbrightBits) float mapLightFactor; - // 1 / mapLightFactor - float mapInverseLightFactor; // May have to be true on some legacy maps: clamp and normalize multiplied colors. bool legacyOverBrightClamping; diff --git a/src/engine/renderer/tr_scene.cpp b/src/engine/renderer/tr_scene.cpp index 8e66bec87d..818835811f 100644 --- a/src/engine/renderer/tr_scene.cpp +++ b/src/engine/renderer/tr_scene.cpp @@ -335,12 +335,6 @@ void RE_AddDynamicLightToSceneET( const vec3_t org, float radius, float intensit light->l.color[ 1 ] = g; light->l.color[ 2 ] = b; - if ( r_realtimeLightingRenderer.Get() == Util::ordinal( realtimeLightingRenderer_t::TILED ) ) - { - // Cancel overBright on dynamic lights. - VectorScale( light->l.color, tr.mapInverseLightFactor, light->l.color ); - } - light->l.inverseShadows = (flags & REF_INVERSE_DLIGHT) != 0; light->l.noShadows = !r_realtimeLightingCastShadows->integer && !light->l.inverseShadows; diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index fd6b01de69..3bff3e2fa4 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -693,7 +693,6 @@ static void DrawTris() } gl_genericShader->SetUniform_ColorModulate( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); - gl_genericShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -921,15 +920,15 @@ void Render_generic3D( shaderStage_t *pStage ) // u_AlphaThreshold gl_genericShader->SetUniform_AlphaTest( pStage->stateBits ); - // u_InverseLightFactor - float inverseLightFactor = pStage->cancelOverBright ? tr.mapInverseLightFactor : 1.0f; - gl_genericShader->SetUniform_InverseLightFactor( inverseLightFactor ); - // u_ColorModulate colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_genericShader->SetUniform_ColorModulate( rgbGen, alphaGen ); + // Here, it's safe to multiply the overbright factor for vertex lighting into the color gen` + // 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 ); // u_Color gl_genericShader->SetUniform_Color( tess.svars.color ); @@ -1125,12 +1124,9 @@ void Render_lightMapping( shaderStage_t *pStage ) // u_DeformGen gl_lightMappingShader->SetUniform_Time( backEnd.refdef.floatTime - backEnd.currentEntity->e.shaderTime ); - // u_InverseLightFactor - /* HACK: use sign to know if there is a light or not, and - then if it will receive overbright multiplication or not. */ - bool cancelOverBright = pStage->cancelOverBright; - float inverseLightFactor = cancelOverBright ? tr.mapInverseLightFactor : -tr.mapInverseLightFactor; - gl_lightMappingShader->SetUniform_InverseLightFactor( inverseLightFactor ); + // u_LightFactor + gl_lightMappingShader->SetUniform_LightFactor( + lightMode == lightMode_t::FULLBRIGHT ? 1.0f : tr.mapLightFactor ); // u_ColorModulate gl_lightMappingShader->SetUniform_ColorModulate( rgbGen, alphaGen ); @@ -1418,9 +1414,6 @@ static void Render_forwardLighting_DBS_omni( shaderStage_t *pStage, // u_AlphaThreshold gl_forwardLightingShader_omniXYZ->SetUniform_AlphaTest( pStage->stateBits ); - // u_InverseLightFactor - gl_forwardLightingShader_omniXYZ->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - // bind u_HeightMap if ( pStage->enableReliefMapping ) { @@ -1596,9 +1589,6 @@ static void Render_forwardLighting_DBS_proj( shaderStage_t *pStage, // u_AlphaThreshold gl_forwardLightingShader_projXYZ->SetUniform_AlphaTest( pStage->stateBits ); - // u_InverseLightFactor - gl_forwardLightingShader_projXYZ->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - // bind u_HeightMap if ( pStage->enableReliefMapping ) { @@ -1775,9 +1765,6 @@ static void Render_forwardLighting_DBS_directional( shaderStage_t *pStage, trRef // u_AlphaThreshold gl_forwardLightingShader_directionalSun->SetUniform_AlphaTest( pStage->stateBits ); - // u_InverseLightFactor - gl_forwardLightingShader_directionalSun->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - // bind u_HeightMap if ( pStage->enableReliefMapping ) { @@ -2069,9 +2056,6 @@ void Render_skybox( shaderStage_t *pStage ) // u_AlphaThreshold gl_skyboxShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - // u_InverseLightFactor - gl_skyboxShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - gl_skyboxShader->SetRequiredVertexPointers(); Tess_DrawElements(); @@ -2397,9 +2381,6 @@ void Render_fog( shaderStage_t* pStage ) gl_fogQuake3Shader->BindProgram( 0 ); - // u_InverseLightFactor - gl_fogQuake3Shader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - gl_fogQuake3Shader->SetUniform_FogDistanceVector( fogDistanceVector ); gl_fogQuake3Shader->SetUniform_FogDepthVector( fogDepthVector ); gl_fogQuake3Shader->SetUniform_FogEyeT( eyeT ); @@ -2589,6 +2570,11 @@ 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 ) { diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 15cc90fe5e..e6b91c1960 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -5174,7 +5174,6 @@ static void CollapseStages() // Make shader stages ready to be used by renderer functions. static void FinishStages() { - bool shaderHasNoLight = true; bool lightStageFound = false; /* Skip standalone lightmaps, they are assumed to be buggy, @@ -5221,22 +5220,15 @@ static void FinishStages() stage->active = glConfig2.reflectionMappingAvailable; break; - case stageType_t::ST_STYLELIGHTMAP: - case stageType_t::ST_STYLECOLORMAP: - shaderHasNoLight = false; - break; - case stageType_t::ST_LIGHTMAP: // standalone lightmap stage: paint shadows over a white texture stage->bundle[ TB_DIFFUSEMAP ].image[ 0 ] = tr.whiteImage; lightStageFound = true; - shaderHasNoLight = false; break; case stageType_t::ST_DIFFUSEMAP: case stageType_t::ST_COLLAPSE_DIFFUSEMAP: lightStageFound = true; - shaderHasNoLight = false; break; case stageType_t::ST_ATTENUATIONMAP_XY: @@ -5255,58 +5247,12 @@ static void FinishStages() ? gl_shaderManager.getDeformShaderIndex( shader.deforms, shader.numDeforms ) : 0; - bool isOpaqueShader = false; - for ( size_t s = 0; s < numStages; s++ ) { shaderStage_t *stage = &stages[ s ]; stage->deformIndex = deformIndex; - // SRC1 and DST0 are reset to zero in ParseStage (no blending). - bool isOpaque = !( stage->stateBits & ( GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS ) ); - - // A shader is not opaque if all stages are not opaques. - isOpaqueShader |= isOpaque; - - if ( shaderHasNoLight ) - { - bool blendFunc_srcDstColor = ( stage->stateBits & GLS_SRCBLEND_BITS ) == GLS_SRCBLEND_DST_COLOR; - - // We should cancel overbright if there is no light stage, unless it's using blendFunc dst_color. - stage->cancelOverBright = !blendFunc_srcDstColor; - - bool isDecal = shader.sort == Util::ordinal(shaderSort_t::SS_DECAL); - - if ( isDecal ) - { - // We should not cancel overbright if that's a non-opaque decal. - stage->cancelOverBright = isOpaque; - } - } - else - { - if ( isOpaqueShader ) - { - // We we should not cancel overbright if the light stage is applied on an opaque surface; - stage->cancelOverBright = false; - } - else - { - bool blendFunc_add = ( stage->stateBits & GLS_SRCBLEND_BITS ) == GLS_SRCBLEND_ONE - && ( stage->stateBits & GLS_DSTBLEND_BITS ) == GLS_DSTBLEND_ONE; - - if ( blendFunc_add ) - { - stage->cancelOverBright = true; - } - else - { - stage->cancelOverBright = false; - } - } - } - // Available textures. bool hasNormalMap = stage->bundle[ TB_NORMALMAP ].image[ 0 ] != nullptr; bool hasHeightMap = stage->bundle[ TB_HEIGHTMAP ].image[ 0 ] != nullptr; diff --git a/src/engine/renderer/tr_sky.cpp b/src/engine/renderer/tr_sky.cpp index 1c5a580960..de1c39eb4f 100644 --- a/src/engine/renderer/tr_sky.cpp +++ b/src/engine/renderer/tr_sky.cpp @@ -102,9 +102,6 @@ void Tess_StageIteratorSky() gl_skyboxShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[glState.stackIndex] ); - // u_InverseLightFactor - gl_skyboxShader->SetUniform_InverseLightFactor( tr.mapInverseLightFactor ); - gl_skyboxShader->SetRequiredVertexPointers(); // draw the outer skybox