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..1070522b60 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 ); + 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 ); @@ -284,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_ColorModulate( 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 3a9121db41..0c4b21bd45 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; } @@ -1434,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 && !Str::cisalpha( line[pos + strlen( uniform->GetName() )] ) ) { + skip = true; + break; + } } } } @@ -2187,7 +2194,7 @@ GLShader_generic::GLShader_generic( GLShaderManager *manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_Bones( this ), u_VertexInterpolation( this ), @@ -2219,7 +2226,7 @@ GLShader_genericMaterial::GLShader_genericMaterial( GLShaderManager* manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorModulate( this ), + u_ColorModulateColorGen( this ), u_Color( this ), u_DepthScale( this ), u_ShowTris( this ), @@ -2254,13 +2261,12 @@ 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 ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_LightFactor( this ), u_Bones( this ), u_VertexInterpolation( this ), u_ReliefDepthScale( this ), @@ -2323,13 +2329,12 @@ 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 ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_LightFactor( this ), u_ReliefDepthScale( this ), u_ReliefOffsetBias( this ), u_NormalScale( this ), @@ -2383,7 +2388,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 ), @@ -2436,7 +2441,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 ), @@ -2500,7 +2505,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 bdd8cf7102..7c49f7b9d8 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: @@ -3099,17 +3084,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() ) ); } }; @@ -3603,68 +3588,86 @@ 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_ONE = BIT( 0 ), + COLOR_MINUS_ONE = BIT( 1 ), + COLOR_LIGHTFACTOR = BIT( 2 ), + ALPHA_ONE = BIT( 3 ), + ALPHA_MINUS_ONE = 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, + const bool useMapLightFactor = 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 ) - { + uint32_t lightFactor = 0; + 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 ); + lightFactor = uint32_t( tr.mapLightFactor ) << 5; + } else { + colorModulate |= Util::ordinal( ColorModulate::COLOR_ONE ); } break; case colorGen_t::CGEN_ONE_MINUS_VERTEX: needAttrib = true; - VectorSet( v, -1, -1, -1 ); + colorModulate |= Util::ordinal( ColorModulate::COLOR_MINUS_ONE ); break; default: - VectorSet( v, 0, 0, 0 ); break; } - switch ( alphaGen ) - { + if ( useMapLightFactor ) { + ASSERT_EQ( vertexOverbright, false ); + lightFactor = uint32_t( tr.mapLightFactor ) << 5; + } + + colorModulate |= lightFactor ? lightFactor : 1 << 5; + + switch ( alphaGen ) { case alphaGen_t::AGEN_VERTEX: needAttrib = true; - v[ 3 ] = 1.0f; + colorModulate |= Util::ordinal( ColorModulate::ALPHA_ONE ); break; case alphaGen_t::AGEN_ONE_MINUS_VERTEX: needAttrib = true; - v[ 3 ] = -1.0f; + colorModulate |= Util::ordinal( ColorModulate::ALPHA_MINUS_ONE ); 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 +3932,7 @@ class GLShader_generic : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_Bones, public u_VertexInterpolation, @@ -3958,7 +3961,7 @@ class GLShader_genericMaterial : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorModulate, + public u_ColorModulateColorGen, public u_Color, public u_DepthScale, public u_ShowTris, @@ -3990,13 +3993,12 @@ 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, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_LightFactor, public u_Bones, public u_VertexInterpolation, public u_ReliefDepthScale, @@ -4042,13 +4044,12 @@ 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, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_LightFactor, public u_ReliefDepthScale, public u_ReliefOffsetBias, public u_NormalScale, @@ -4089,7 +4090,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 +4133,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 +4183,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..a539da8276 --- /dev/null +++ b/src/engine/renderer/glsl_source/common.glsl @@ -0,0 +1,69 @@ +/* +=========================================================================== + +Daemon BSD Source Code +Copyright (c) 2024-2025 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 * 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 ); + +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 ) >> 2 ) * lightFactor ); + colorModulate.a = ( colorModArray[( colorMod & 24 ) >> 3] ); + return colorModulate; +} + +float ColorModulateToLightFactor( const in uint colorMod ) { + return ( colorMod >> 5 ) & 0x7; +} 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/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..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 vec4 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 + 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 d62630d649..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 @@ -32,8 +33,8 @@ uniform vec3 u_ViewOrigin; uniform float u_Time; -uniform vec4 u_ColorModulate; -uniform vec4 u_Color; +uniform uint u_ColorModulateColorGen; +uniform uint u_Color; #if defined(USE_TCGEN_ENVIRONMENT) uniform mat4 u_ModelMatrix; #endif @@ -63,7 +64,9 @@ void main() vec2 texCoord, lmCoord; VertexFetch( position, LB, color, texCoord, lmCoord ); - color = color * u_ColorModulate + 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_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< 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_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..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); @@ -3047,6 +3054,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; diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 778f083362..b66f4c298e 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -687,7 +687,7 @@ 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_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -856,7 +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_ColorModulate( rgbGen, alphaGen, mayUseVertexOverbright ); + 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 ); @@ -1058,12 +1059,8 @@ void Render_lightMapping( shaderStage_t *pStage ) // u_DeformGen gl_lightMappingShader->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_ColorModulate( rgbGen, alphaGen ); + gl_lightMappingShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, lightMode != lightMode_t::FULLBRIGHT ); // u_Color gl_lightMappingShader->SetUniform_Color( tess.svars.color ); @@ -1340,7 +1337,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 +1512,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 +1688,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 ); @@ -2501,11 +2498,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 ) {