From 3c98e96093e35ed2da15338ac84be500089e2a96 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 6 Mar 2025 16:57:20 +0100 Subject: [PATCH 1/3] renderer: also require EXT_gpu_shader4 for the material system --- src/engine/sys/sdl_glimp.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/engine/sys/sdl_glimp.cpp b/src/engine/sys/sdl_glimp.cpp index 747036b06b..6e024159a9 100644 --- a/src/engine/sys/sdl_glimp.cpp +++ b/src/engine/sys/sdl_glimp.cpp @@ -2591,13 +2591,20 @@ static void GLimp_InitExtensions() glConfig2.geometryCacheAvailable = glConfig2.vertexAttribBindingAvailable && glConfig2.directStateAccessAvailable; - glConfig2.materialSystemAvailable = glConfig2.shaderDrawParametersAvailable && glConfig2.SSBOAvailable - && glConfig2.multiDrawIndirectAvailable && glConfig2.bindlessTexturesAvailable - && glConfig2.computeShaderAvailable && glConfig2.shadingLanguage420PackAvailable - && glConfig2.explicitUniformLocationAvailable && glConfig2.shaderImageLoadStoreAvailable - && glConfig2.shaderAtomicCountersAvailable && glConfig2.indirectParametersAvailable + glConfig2.materialSystemAvailable = + glConfig2.bindlessTexturesAvailable + && glConfig2.computeShaderAvailable && glConfig2.directStateAccessAvailable - && glConfig2.geometryCacheAvailable; + && glConfig2.explicitUniformLocationAvailable + && glConfig2.geometryCacheAvailable + && glConfig2.gpuShader4Available + && glConfig2.indirectParametersAvailable + && glConfig2.multiDrawIndirectAvailable + && glConfig2.shaderAtomicCountersAvailable + && glConfig2.shaderDrawParametersAvailable + && glConfig2.shaderImageLoadStoreAvailable + && glConfig2.shadingLanguage420PackAvailable + && glConfig2.SSBOAvailable; // This requires GLEW 2.2+, so skip if it's a lower version #if defined(GLEW_KHR_shader_subgroup) From 60e7dc8f8260e98a84a5a8e70147c4eb18a50f25 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 1 Mar 2025 04:15:23 +0100 Subject: [PATCH 2/3] renderer: add non-bitwise alternative for u_Color and u_ColorModulateColorGen Add non-bitwise alternative for u_Color and u_ColorModulateColorGen, it is used when GLSL 1.20 isn't supported. The material system assumes GLSL 1.20 is supported. --- src/engine/renderer/Material.cpp | 10 +- src/engine/renderer/gl_shader.cpp | 49 ++- src/engine/renderer/gl_shader.h | 343 +++++++++++++----- src/engine/renderer/glsl_source/common.glsl | 142 ++++++-- .../renderer/glsl_source/fogGlobal_fp.glsl | 7 +- .../renderer/glsl_source/fogQuake3_vp.glsl | 6 +- .../glsl_source/forwardLighting_vp.glsl | 6 +- .../renderer/glsl_source/generic_vp.glsl | 10 +- .../renderer/glsl_source/lightMapping_fp.glsl | 2 +- .../renderer/glsl_source/lightMapping_vp.glsl | 7 +- .../renderer/glsl_source/shadowFill_vp.glsl | 5 +- src/engine/renderer/tr_backend.cpp | 64 ++-- src/engine/renderer/tr_shade.cpp | 35 +- 13 files changed, 482 insertions(+), 204 deletions(-) diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index a858389947..89202ca0c0 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -148,10 +148,10 @@ void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage, boo alphaGen_t alphaGen = SetAlphaGen( pStage ); const bool styleLightMap = pStage->type == stageType_t::ST_STYLELIGHTMAP || pStage->type == stageType_t::ST_STYLECOLORMAP; - gl_genericShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright, styleLightMap ); + gl_genericShaderMaterial->SetUniform_ColorModulateColorGen_Uint( rgbGen, alphaGen, mayUseVertexOverbright, styleLightMap ); Tess_ComputeColor( pStage ); - gl_genericShaderMaterial->SetUniform_Color( tess.svars.color ); + gl_genericShaderMaterial->SetUniform_Color_Uint( tess.svars.color ); bool hasDepthFade = pStage->hasDepthFade; if ( hasDepthFade ) { @@ -178,10 +178,10 @@ void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage, } // u_ColorModulate - gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, !fullbright ); + gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen_Uint( rgbGen, alphaGen, false, !fullbright ); // u_Color - gl_lightMappingShaderMaterial->SetUniform_Color( tess.svars.color ); + gl_lightMappingShaderMaterial->SetUniform_Color_Uint( tess.svars.color ); // u_AlphaThreshold gl_lightMappingShaderMaterial->SetUniform_AlphaTest( pStage->stateBits ); @@ -1054,7 +1054,7 @@ void BindShaderFog( Material* material ) { gl_fogQuake3ShaderMaterial->SetUniform_FogDepthVector( fogDepthVector ); gl_fogQuake3ShaderMaterial->SetUniform_FogEyeT( eyeT ); - gl_fogQuake3ShaderMaterial->SetUniform_ColorGlobal( fog->color ); + gl_fogQuake3ShaderMaterial->SetUniform_ColorGlobal_Uint( fog->color ); gl_fogQuake3ShaderMaterial->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_fogQuake3ShaderMaterial->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[glState.stackIndex] ); diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 512cdfb7df..e3755cfb2f 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -2407,8 +2407,10 @@ GLShader_generic::GLShader_generic( GLShaderManager *manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Float( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_Bones( this ), u_VertexInterpolation( this ), u_DepthScale( this ), @@ -2439,8 +2441,8 @@ GLShader_genericMaterial::GLShader_genericMaterial( GLShaderManager* manager ) : u_AlphaThreshold( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Uint( this ), u_DepthScale( this ), u_ShowTris( this ), u_MaterialColour( this ), @@ -2474,8 +2476,10 @@ GLShader_lightMapping::GLShader_lightMapping( GLShaderManager *manager ) : u_LightTiles( this ), u_TextureMatrix( this ), u_SpecularExponent( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Float( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_AlphaThreshold( this ), u_ViewOrigin( this ), u_ModelMatrix( this ), @@ -2542,8 +2546,8 @@ GLShader_lightMappingMaterial::GLShader_lightMappingMaterial( GLShaderManager* m u_LightTiles( this ), u_TextureMatrix( this ), u_SpecularExponent( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Uint( this ), u_AlphaThreshold( this ), u_ViewOrigin( this ), u_ModelMatrix( this ), @@ -2601,8 +2605,10 @@ GLShader_forwardLighting_omniXYZ::GLShader_forwardLighting_omniXYZ( GLShaderMana u_TextureMatrix( this ), u_SpecularExponent( this ), u_AlphaThreshold( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Float( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_ViewOrigin( this ), u_LightOrigin( this ), u_LightColor( this ), @@ -2654,8 +2660,10 @@ GLShader_forwardLighting_projXYZ::GLShader_forwardLighting_projXYZ( GLShaderMana u_TextureMatrix( this ), u_SpecularExponent( this ), u_AlphaThreshold( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Float( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_ViewOrigin( this ), u_LightOrigin( this ), u_LightColor( this ), @@ -2718,8 +2726,10 @@ GLShader_forwardLighting_directionalSun::GLShader_forwardLighting_directionalSun u_TextureMatrix( this ), u_SpecularExponent( this ), u_AlphaThreshold( this ), - u_ColorModulateColorGen( this ), - u_Color( this ), + u_ColorModulateColorGen_Float( this ), + u_ColorModulateColorGen_Uint( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_ViewOrigin( this ), u_LightDir( this ), u_LightColor( this ), @@ -2781,7 +2791,8 @@ GLShader_shadowFill::GLShader_shadowFill( GLShaderManager *manager ) : u_LightRadius( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_Color( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_Bones( this ), u_VertexInterpolation( this ), GLDeformStage( this ), @@ -2889,7 +2900,8 @@ GLShader_fogQuake3::GLShader_fogQuake3( GLShaderManager *manager ) : u_FogMap( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorGlobal( this ), + u_ColorGlobal_Float( this ), + u_ColorGlobal_Uint( this ), u_Bones( this ), u_VertexInterpolation( this ), u_FogDistanceVector( this ), @@ -2911,7 +2923,7 @@ GLShader_fogQuake3Material::GLShader_fogQuake3Material( GLShaderManager* manager u_FogMap( this ), u_ModelMatrix( this ), u_ModelViewProjectionMatrix( this ), - u_ColorGlobal( this ), + u_ColorGlobal_Uint( this ), u_FogDistanceVector( this ), u_FogDepthVector( this ), u_FogEyeT( this ), @@ -2928,7 +2940,8 @@ GLShader_fogGlobal::GLShader_fogGlobal( GLShaderManager *manager ) : u_DepthMap( this ), u_ModelViewProjectionMatrix( this ), u_UnprojectMatrix( this ), - u_Color( this ), + u_Color_Float( this ), + u_Color_Uint( this ), u_FogDistanceVector( this ) { } diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index 5024ba78ea..a81e45eece 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -3155,33 +3155,87 @@ class u_CloudHeight : } }; -class u_Color : +class u_Color_Float : + GLUniform4f +{ +public: + u_Color_Float( GLShader *shader ) : + GLUniform4f( shader, "u_Color" ) + { + } + + void SetUniform_Color_Float( const Color::Color& color ) + { + this->SetValue( color.ToArray() ); + } +}; + +class u_Color_Uint : GLUniform1ui { public: - u_Color( GLShader *shader ) : + u_Color_Uint( GLShader *shader ) : GLUniform1ui( shader, "u_Color" ) { } - void SetUniform_Color( const Color::Color& color ) + void SetUniform_Color_Uint( const Color::Color& color ) { this->SetValue( packUnorm4x8( color.ToArray() ) ); } }; -class u_ColorGlobal : +template void SetUniform_Color( Shader* shader, const Color::Color& color ) +{ + if( glConfig2.gpuShader4Available ) + { + shader->SetUniform_Color_Uint( color ); + } + else + { + shader->SetUniform_Color_Float( color ); + } +} + +class u_ColorGlobal_Float : + GLUniform4f +{ +public: + u_ColorGlobal_Float( GLShader *shader ) : + GLUniform4f( shader, "u_ColorGlobal", true ) + { + } + + void SetUniform_ColorGlobal_Float( const Color::Color& color ) + { + this->SetValue( color.ToArray() ); + } +}; + +class u_ColorGlobal_Uint : GLUniform1ui { public: - u_ColorGlobal( GLShader* shader ) : + u_ColorGlobal_Uint( GLShader* shader ) : GLUniform1ui( shader, "u_ColorGlobal", true ) { } - void SetUniform_ColorGlobal( const Color::Color& color ) { + void SetUniform_ColorGlobal_Uint( const Color::Color& color ) { this->SetValue( packUnorm4x8( color.ToArray() ) ); } }; +template void SetUniform_ColorGlobal( Shader* shader, const Color::Color& color ) +{ + if( glConfig2.gpuShader4Available ) + { + shader->SetUniform_ColorGlobal_Uint( color ); + } + else + { + shader->SetUniform_ColorGlobal_Float( color ); + } +} + class u_Frame : GLUniform1ui { public: @@ -3689,89 +3743,187 @@ class u_ColorModulate : } }; -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 ), - ALPHA_ADD_ONE = BIT( 5 ) +struct colorModulation_t { + float colorGen = 0.0f; + float alphaGen = 0.0f; + float lightFactor = 1.0f; + bool isLightStyle = false; + bool alphaAddOne = true; }; -class u_ColorModulateColorGen : - GLUniform1ui { - public: - u_ColorModulateColorGen( GLShader* shader ) : - GLUniform1ui( shader, "u_ColorModulateColorGen" ) { +static colorModulation_t ColorModulateColorGen( + const colorGen_t colorGen, + const alphaGen_t alphaGen, + const bool vertexOverbright, + const bool useMapLightFactor ) +{ + colorModulation_t colorModulation = {}; + + switch ( colorGen ) + { + case colorGen_t::CGEN_VERTEX: + colorModulation.alphaAddOne = false;; + + 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 + colorModulation.isLightStyle = true; + colorModulation.lightFactor = tr.mapLightFactor; + } + else + { + colorModulation.colorGen = 1.0f; + } + break; + + case colorGen_t::CGEN_ONE_MINUS_VERTEX: + colorModulation.alphaAddOne = false;; + colorModulation.colorGen = -1.0f; + break; + + default: + break; } - void SetUniform_ColorModulateColorGen( colorGen_t colorGen, alphaGen_t alphaGen, bool vertexOverbright = false, - const bool useMapLightFactor = false ) { - uint32_t colorModulate = 0; - bool needAttrib = false; + if ( useMapLightFactor ) + { + ASSERT_EQ( vertexOverbright, false ); + colorModulation.lightFactor = tr.mapLightFactor; + } + switch ( alphaGen ) + { + case alphaGen_t::AGEN_VERTEX: + colorModulation.alphaAddOne = false;; + colorModulation.alphaGen = 1.0f; + break; + + case alphaGen_t::AGEN_ONE_MINUS_VERTEX: + colorModulation.alphaAddOne = false;; + colorModulation.alphaGen = -1.0f; + break; + + default: + break; + } + + return colorModulation; +} + +class u_ColorModulateColorGen_Float : + GLUniform4f +{ +public: + u_ColorModulateColorGen_Float( GLShader* shader ) : + GLUniform4f( shader, "u_ColorModulateColorGen" ) + { + } + + void SetUniform_ColorModulateColorGen_Float( + const colorGen_t colorGen, + const alphaGen_t alphaGen, + const bool vertexOverbright = false, + const bool useMapLightFactor = false ) + { if ( r_logFile->integer ) { GLimp_LogComment( - va( "--- u_ColorModulate::SetUniform_ColorModulateColorGen( program = %s, colorGen = %s, alphaGen = %s ) ---\n", + va( "--- u_ColorModulate::SetUniform_ColorModulateColorGen_Float( " + "program = %s, colorGen = %s, alphaGen = %s ) ---\n", _shader->GetName().c_str(), Util::enum_str( colorGen ), Util::enum_str( alphaGen ) ) ); } - uint32_t lightFactor = 0; - switch ( colorGen ) { - case colorGen_t::CGEN_VERTEX: - needAttrib = true; - 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 - colorModulate |= Util::ordinal( ColorModulate::COLOR_LIGHTFACTOR ); - lightFactor = uint32_t( tr.mapLightFactor ) << 6; - } else { - colorModulate |= Util::ordinal( ColorModulate::COLOR_ONE ); - } - break; - - case colorGen_t::CGEN_ONE_MINUS_VERTEX: - needAttrib = true; - colorModulate |= Util::ordinal( ColorModulate::COLOR_MINUS_ONE ); - break; - - default: - break; - } - - if ( useMapLightFactor ) { - ASSERT_EQ( vertexOverbright, false ); - lightFactor = uint32_t( tr.mapLightFactor ) << 6; - } + colorModulation_t colorModulation = ColorModulateColorGen( + colorGen, alphaGen, vertexOverbright, useMapLightFactor ); - colorModulate |= lightFactor ? lightFactor : 1 << 6; + vec4_t colorModulate_Float; + colorModulate_Float[ 0 ] = colorModulation.colorGen; + colorModulate_Float[ 1 ] = colorModulation.lightFactor; + colorModulate_Float[ 1 ] *= colorModulation.isLightStyle ? -1.0f : 1.0f; + colorModulate_Float[ 2 ] = colorModulation.alphaAddOne; + colorModulate_Float[ 3 ] = colorModulation.alphaGen; - switch ( alphaGen ) { - case alphaGen_t::AGEN_VERTEX: - needAttrib = true; - colorModulate |= Util::ordinal( ColorModulate::ALPHA_ONE ); - break; + this->SetValue( colorModulate_Float ); + } +}; - case alphaGen_t::AGEN_ONE_MINUS_VERTEX: - needAttrib = true; - colorModulate |= Util::ordinal( ColorModulate::ALPHA_MINUS_ONE ); - break; +class u_ColorModulateColorGen_Uint : + GLUniform1ui { + public: + u_ColorModulateColorGen_Uint( GLShader* shader ) : + GLUniform1ui( shader, "u_ColorModulateColorGen" ) { + } - default: - break; + void SetUniform_ColorModulateColorGen_Uint( + const colorGen_t colorGen, + const alphaGen_t alphaGen, + const bool vertexOverbright = false, + const bool useMapLightFactor = false ) + { + if ( r_logFile->integer ) { + GLimp_LogComment( + va( "--- u_ColorModulate::SetUniform_ColorModulateColorGen_Uint( " + "program = %s, colorGen = %s, alphaGen = %s ) ---\n", + _shader->GetName().c_str(), Util::enum_str( colorGen ), Util::enum_str( alphaGen ) ) + ); } - if ( !needAttrib ) { - /* Originally, this controlled whether the vertex color array was used, - now it does the equivalent by setting the color in the shader in such way as if it was using - the default OpenGL values for the disabled arrays (0.0, 0.0, 0.0, 1.0) - This allows to skip the vertex format change */ - colorModulate |= Util::ordinal( ColorModulate::ALPHA_ADD_ONE ); - } - this->SetValue( colorModulate ); + colorModulation_t colorModulation = ColorModulateColorGen( + colorGen, alphaGen, vertexOverbright, useMapLightFactor ); + + enum class ColorModulate_Bit { + COLOR_ONE = 0, + COLOR_MINUS_ONE = 1, + ALPHA_ONE = 2, + ALPHA_MINUS_ONE = 3, + ALPHA_ADD_ONE = 4, + // <-- Insert new bits there. + IS_LIGHT_STYLE = 27, + LIGHTFACTOR_BIT0 = 28, + LIGHTFACTOR_BIT1 = 29, + LIGHTFACTOR_BIT2 = 30, + LIGHTFACTOR_BIT3 = 31, + // There should be not bit higher than the light factor. + }; + + uint32_t colorModulate_Uint = 0; + + colorModulate_Uint |= ( colorModulation.colorGen == 1.0f ) + << Util::ordinal( ColorModulate_Bit::COLOR_ONE ); + colorModulate_Uint |= ( colorModulation.colorGen == -1.0f ) + << Util::ordinal( ColorModulate_Bit::COLOR_MINUS_ONE ); + colorModulate_Uint |= ( colorModulation.alphaGen == 1.0f ) + << Util::ordinal( ColorModulate_Bit::ALPHA_ONE ); + colorModulate_Uint |= ( colorModulation.alphaGen == -1.0f ) + << Util::ordinal( ColorModulate_Bit::ALPHA_MINUS_ONE ); + colorModulate_Uint |= colorModulation.alphaAddOne + << Util::ordinal( ColorModulate_Bit::ALPHA_ADD_ONE ); + colorModulate_Uint |= colorModulation.isLightStyle + << Util::ordinal( ColorModulate_Bit::IS_LIGHT_STYLE ); + colorModulate_Uint |= uint32_t( colorModulation.lightFactor ) + << Util::ordinal( ColorModulate_Bit::LIGHTFACTOR_BIT0 ); + + this->SetValue( colorModulate_Uint ); + } +}; + +template void SetUniform_ColorModulateColorGen( + Shader* shader, + const colorGen_t colorGen, + const alphaGen_t alphaGen, + const bool vertexOverbright = false, + const bool useMapLightFactor = false ) +{ + if( glConfig2.gpuShader4Available ) + { + shader->SetUniform_ColorModulateColorGen_Uint( colorGen, alphaGen, vertexOverbright, useMapLightFactor ); } -}; + else + { + shader->SetUniform_ColorModulateColorGen_Float( colorGen, alphaGen, vertexOverbright, useMapLightFactor ); + } +} class u_FogDistanceVector : GLUniform4f @@ -4070,8 +4222,10 @@ class GLShader_generic : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Float, + public u_ColorModulateColorGen_Uint, + public u_Color_Float, + public u_Color_Uint, public u_Bones, public u_VertexInterpolation, public u_DepthScale, @@ -4099,8 +4253,8 @@ class GLShader_genericMaterial : public u_AlphaThreshold, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Uint, + public u_Color_Uint, public u_DepthScale, public u_ShowTris, public u_MaterialColour, @@ -4131,8 +4285,10 @@ class GLShader_lightMapping : public u_LightTiles, public u_TextureMatrix, public u_SpecularExponent, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Float, + public u_ColorModulateColorGen_Uint, + public u_Color_Float, + public u_Color_Uint, public u_AlphaThreshold, public u_ViewOrigin, public u_ModelMatrix, @@ -4182,8 +4338,8 @@ class GLShader_lightMappingMaterial : public u_LightTiles, public u_TextureMatrix, public u_SpecularExponent, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Uint, + public u_Color_Uint, public u_AlphaThreshold, public u_ViewOrigin, public u_ModelMatrix, @@ -4228,8 +4384,10 @@ class GLShader_forwardLighting_omniXYZ : public u_TextureMatrix, public u_SpecularExponent, public u_AlphaThreshold, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Float, + public u_ColorModulateColorGen_Uint, + public u_Color_Float, + public u_Color_Uint, public u_ViewOrigin, public u_LightOrigin, public u_LightColor, @@ -4271,8 +4429,10 @@ class GLShader_forwardLighting_projXYZ : public u_TextureMatrix, public u_SpecularExponent, public u_AlphaThreshold, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Float, + public u_ColorModulateColorGen_Uint, + public u_Color_Float, + public u_Color_Uint, public u_ViewOrigin, public u_LightOrigin, public u_LightColor, @@ -4321,8 +4481,10 @@ class GLShader_forwardLighting_directionalSun : public u_TextureMatrix, public u_SpecularExponent, public u_AlphaThreshold, - public u_ColorModulateColorGen, - public u_Color, + public u_ColorModulateColorGen_Float, + public u_ColorModulateColorGen_Uint, + public u_Color_Float, + public u_Color_Uint, public u_ViewOrigin, public u_LightDir, public u_LightColor, @@ -4363,7 +4525,8 @@ class GLShader_shadowFill : public u_LightRadius, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_Color, + public u_Color_Float, + public u_Color_Uint, public u_Bones, public u_VertexInterpolation, public GLDeformStage, @@ -4457,7 +4620,8 @@ class GLShader_fogQuake3 : public u_FogMap, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorGlobal, + public u_ColorGlobal_Float, + public u_ColorGlobal_Uint, public u_Bones, public u_VertexInterpolation, public u_FogDistanceVector, @@ -4477,7 +4641,7 @@ class GLShader_fogQuake3Material : public u_FogMap, public u_ModelMatrix, public u_ModelViewProjectionMatrix, - public u_ColorGlobal, + public u_ColorGlobal_Uint, public u_FogDistanceVector, public u_FogDepthVector, public u_FogEyeT, @@ -4493,7 +4657,8 @@ class GLShader_fogGlobal : public u_DepthMap, public u_ModelViewProjectionMatrix, public u_UnprojectMatrix, - public u_Color, + public u_Color_Float, + public u_Color_Uint, public u_FogDistanceVector { public: diff --git a/src/engine/renderer/glsl_source/common.glsl b/src/engine/renderer/glsl_source/common.glsl index ac596f9a57..2aba2c9eed 100644 --- a/src/engine/renderer/glsl_source/common.glsl +++ b/src/engine/renderer/glsl_source/common.glsl @@ -43,33 +43,129 @@ 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: alpha = 1 -Bit 6-9: 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; +// Common functions + +#if defined(HAVE_EXT_gpu_shader4) + #define colorPack uint + #define colorModulatePack uint +#else + #define colorPack vec4 + #define colorModulatePack vec4 +#endif + +vec4 UnpackColor( const in colorPack packedColor ) +{ +#if defined(HAVE_EXT_gpu_shader4) + return unpackUnorm4x8( packedColor ); +#else + return packedColor; +#endif } -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; +/* colorMod uint format: + +colorMod << 0: color * 1 +colorMod << 1: color * ( -1 ) +colorMod << 2: alpha * 1 +colorMod << 3: alpha * ( -1 ) +colorMod << 4: alpha = 1 +colorMod << 5-26: available for future usage +colorMod << 27: color += lightFactor +colorMod << 28-31: lightFactor + +colorMod float format: + +colorMod[ 0 ]: color * f +colorMod[ 1 ] absolute value: lightFactor +colorMod[ 1 ] minus sign: color += lightFactor +colorMod[ 2 ]: alpha = 1 +colorMod[ 3 ]: alpha * f */ + +vec4 ColorModulateToColor( const in colorModulatePack colorMod ) +{ +#if defined(HAVE_EXT_gpu_shader4) + vec3 colorModArray = vec3( 0.0f, 1.0f, -1.0f ); + + uint rgbIndex = colorMod & 3u; + uint alphaIndex = ( colorMod >> 2u ) & 3u; + + float rgb = colorModArray[ rgbIndex ]; + float alpha = colorModArray[ alphaIndex ]; +#else + float rgb = colorMod.r; + float alpha = colorMod.a; +#endif + + return vec4( rgb, rgb, rgb, alpha ); } -float ColorModulateToLightFactor( const in uint colorMod ) { - return ( colorMod >> 6 ) & 0xF; +struct modBits_t { + bool alphaAddOne; + bool isLightStyle; +}; + +modBits_t ColorModulateToBits( const in colorModulatePack colorMod ) +{ + modBits_t modBits; + +#if defined(HAVE_EXT_gpu_shader4) + modBits.alphaAddOne = bool( ( colorMod >> 4u ) & 1u ); + modBits.isLightStyle = bool( ( colorMod >> 27u ) & 1u ); +#else + modBits.alphaAddOne = colorMod.b != 0; + modBits.isLightStyle = colorMod.g < 0; +#endif + + return modBits; } -// This is used to skip vertex colours if the colorMod doesn't need them -bool ColorModulateToVertexColor( const in uint colorMod ) { - return ( colorMod & 32 ) == 32; +float ColorModulateToLightFactor( const in colorModulatePack colorMod ) +{ +#if defined(HAVE_EXT_gpu_shader4) + return float( colorMod >> 28u ); +#else + return abs( colorMod.g ); +#endif +} + +void ModulateColor( + const in vec4 colorModulation, + const in vec4 unpackedColor, + inout vec4 color ) +{ + color *= colorModulation; + color += unpackedColor; +} + +void ColorModulateColor( + const in colorModulatePack colorMod, + const in colorPack packedColor, + inout vec4 color ) +{ + vec4 colorModulation = ColorModulateToColor( colorMod ); + + vec4 unpackedColor = UnpackColor( packedColor ); + + ModulateColor( colorModulation, unpackedColor, color ); +} + +void ColorModulateColor_lightFactor( + const in colorModulatePack colorMod, + const in colorPack packedColor, + inout vec4 color ) +{ + vec4 colorModulation = ColorModulateToColor( colorMod ); + modBits_t modBits = ColorModulateToBits( colorMod ); + float lightFactor = ColorModulateToLightFactor( colorMod ); + + // This is used to skip vertex colours if the colorMod doesn't need them. + color.a = modBits.alphaAddOne ? 1.0 : color.a; + + colorModulation.rgb += vec3( modBits.isLightStyle ? lightFactor : 0 ); + + vec4 unpackedColor = UnpackColor( packedColor ); + + unpackedColor.rgb *= lightFactor; + + ModulateColor( colorModulation, unpackedColor, color ); } diff --git a/src/engine/renderer/glsl_source/fogGlobal_fp.glsl b/src/engine/renderer/glsl_source/fogGlobal_fp.glsl index 24076a159b..126fc12bcc 100644 --- a/src/engine/renderer/glsl_source/fogGlobal_fp.glsl +++ b/src/engine/renderer/glsl_source/fogGlobal_fp.glsl @@ -22,11 +22,14 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* fogGlobal_fp.glsl */ +#insert common + uniform sampler2D u_ColorMap; // fog texture uniform sampler2D u_DepthMap; +uniform colorPack u_Color; + uniform vec4 u_FogDistanceVector; -uniform uint u_Color; uniform mat4 u_UnprojectMatrix; #if __VERSION__ > 120 @@ -52,5 +55,5 @@ void main() vec4 color = texture2D(u_ColorMap, st); - outputColor = unpackUnorm4x8( u_Color ) * color; + outputColor = UnpackColor( u_Color ) * color; } diff --git a/src/engine/renderer/glsl_source/fogQuake3_vp.glsl b/src/engine/renderer/glsl_source/fogQuake3_vp.glsl index 1101a3ad77..0d34f16a62 100644 --- a/src/engine/renderer/glsl_source/fogQuake3_vp.glsl +++ b/src/engine/renderer/glsl_source/fogQuake3_vp.glsl @@ -22,13 +22,15 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* fogQuake3_vp.glsl */ +#insert common #insert vertexSimple_vp #insert vertexSkinning_vp #insert vertexAnimation_vp uniform float u_Time; -uniform uint u_ColorGlobal; +uniform colorPack u_ColorGlobal; + uniform mat4 u_ModelMatrix; uniform mat4 u_ModelViewProjectionMatrix; @@ -57,7 +59,7 @@ void main() VertexFetch( position, LB, color, texCoord, lmCoord ); - color = unpackUnorm4x8( u_ColorGlobal ); + color = UnpackColor( u_ColorGlobal ); 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 06f9039df2..dfaaf9be8e 100644 --- a/src/engine/renderer/glsl_source/forwardLighting_vp.glsl +++ b/src/engine/renderer/glsl_source/forwardLighting_vp.glsl @@ -32,8 +32,8 @@ uniform mat4 u_LightAttenuationMatrix; uniform mat4 u_ModelMatrix; uniform mat4 u_ModelViewProjectionMatrix; -uniform uint u_ColorModulateColorGen; -uniform uint u_Color; +uniform colorModulatePack u_ColorModulateColorGen; +uniform colorPack u_Color; uniform float u_Time; @@ -64,7 +64,7 @@ void main() VertexFetch( position, LB, color, texCoord, lmCoord); // assign color - color = color * ColorModulateToColor( u_ColorModulateColorGen ) + unpackUnorm4x8( u_Color ); + ColorModulateColor( u_ColorModulateColorGen, u_Color, 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 594c76212d..69f29881b5 100644 --- a/src/engine/renderer/glsl_source/generic_vp.glsl +++ b/src/engine/renderer/glsl_source/generic_vp.glsl @@ -36,8 +36,9 @@ uniform vec3 u_ViewOrigin; uniform float u_Time; -uniform uint u_ColorModulateColorGen; -uniform uint u_Color; +uniform colorModulatePack u_ColorModulateColorGen; +uniform colorPack u_Color; + #if defined(USE_TCGEN_ENVIRONMENT) uniform mat4 u_ModelMatrix; @@ -63,10 +64,7 @@ void main() { vec2 texCoord, lmCoord; VertexFetch( position, LB, color, texCoord, lmCoord ); - float lightFactor = ColorModulateToLightFactor( u_ColorModulateColorGen ); - color.a = ColorModulateToVertexColor( u_ColorModulateColorGen ) ? 1.0 : color.a; - color = color * ColorModulateToColor( u_ColorModulateColorGen, lightFactor ) - + unpackUnorm4x8( u_Color ) * vec4( lightFactor, lightFactor, lightFactor, 1.0 ); + ColorModulateColor_lightFactor( u_ColorModulateColorGen, u_Color, color ); DeformVertex( position, LB.normal, texCoord, color, u_Time ); diff --git a/src/engine/renderer/glsl_source/lightMapping_fp.glsl b/src/engine/renderer/glsl_source/lightMapping_fp.glsl index 84af19f6ef..1652e12b3c 100644 --- a/src/engine/renderer/glsl_source/lightMapping_fp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_fp.glsl @@ -35,7 +35,7 @@ uniform sampler2D u_GlowMap; uniform float u_AlphaThreshold; uniform vec3 u_ViewOrigin; -uniform uint u_ColorModulateColorGen; +uniform colorModulatePack u_ColorModulateColorGen; IN(smooth) vec3 var_Position; IN(smooth) vec2 var_TexCoords; diff --git a/src/engine/renderer/glsl_source/lightMapping_vp.glsl b/src/engine/renderer/glsl_source/lightMapping_vp.glsl index 8e6bf7e30c..125ff94070 100644 --- a/src/engine/renderer/glsl_source/lightMapping_vp.glsl +++ b/src/engine/renderer/glsl_source/lightMapping_vp.glsl @@ -48,8 +48,8 @@ uniform mat4 u_ModelViewProjectionMatrix; uniform float u_Time; -uniform uint u_ColorModulateColorGen; -uniform uint u_Color; +uniform colorModulatePack u_ColorModulateColorGen; +uniform colorPack u_Color; OUT(smooth) vec3 var_Position; OUT(smooth) vec2 var_TexCoords; @@ -76,7 +76,8 @@ void main() VertexFetch(position, LB, color, texCoord, lmCoord); - color = color * ColorModulateToColor( u_ColorModulateColorGen ) + unpackUnorm4x8( u_Color ); + // assign color + ColorModulateColor( u_ColorModulateColorGen, u_Color, 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 3ac13c691e..9c082423d5 100644 --- a/src/engine/renderer/glsl_source/shadowFill_vp.glsl +++ b/src/engine/renderer/glsl_source/shadowFill_vp.glsl @@ -22,11 +22,12 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA /* shadowFill_vp.glsl */ +#insert common #insert vertexSimple_vp #insert vertexSkinning_vp #insert vertexAnimation_vp -uniform uint u_Color; +uniform colorPack u_Color; uniform mat3x2 u_TextureMatrix; uniform mat4 u_ModelMatrix; @@ -73,5 +74,5 @@ void main() var_TexCoords = (u_TextureMatrix * vec3(texCoord, 1.0)).st; // assign color - var_Color = unpackUnorm4x8( u_Color ); + var_Color = UnpackColor( u_Color ); } diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index 9539a0fd96..8d8664cdab 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -1919,8 +1919,8 @@ static void RB_SetupLightForLighting( trRefLight_t *light ) // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); GL_State( GLS_POLYMODE_LINE | GLS_DEPTHTEST_DISABLE ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -2773,9 +2773,9 @@ void RB_RunVisTests( ) gl_genericShader->BindProgram( 0 ); gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_Color( Color::White ); + SetUniform_Color( gl_genericShader, Color::White ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -3005,7 +3005,7 @@ void RB_RenderGlobalFog() fogDistanceVector[ 3 ] *= fog->tcScale; gl_fogGlobalShader->SetUniform_FogDistanceVector( fogDistanceVector ); - gl_fogGlobalShader->SetUniform_Color( fog->color ); + SetUniform_Color( gl_fogGlobalShader, fog->color ); } gl_fogGlobalShader->SetUniform_UnprojectMatrix( backEnd.viewParms.unprojectionMatrix ); @@ -3413,7 +3413,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3465,7 +3465,7 @@ static void RB_RenderDebugUtils() lightColor.SetAlpha( 0.2 ); - gl_genericShader->SetUniform_Color( lightColor ); + SetUniform_Color( gl_genericShader, lightColor ); MatrixToVectorsFLU( matrixIdentity, forward, left, up ); VectorMA( vec3_origin, 16, forward, forward ); @@ -3554,8 +3554,8 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3669,8 +3669,8 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3734,8 +3734,8 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3948,7 +3948,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -3966,7 +3966,7 @@ static void RB_RenderDebugUtils() for ( iaCount = 0, ia = &backEnd.viewParms.interactions[ 0 ]; iaCount < backEnd.viewParms.numInteractions; ) { - gl_genericShader->SetUniform_Color( Color::White ); + SetUniform_Color( gl_genericShader, Color::White ); Tess_InstantQuad( *gl_genericShader, ia->scissorX, ia->scissorY, ia->scissorWidth - 1.0f, ia->scissorHeight - 1.0f ); @@ -4081,8 +4081,8 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); GL_State( GLS_DEFAULT ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -4163,8 +4163,8 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); GL_State( GLS_DEFAULT ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -4254,7 +4254,7 @@ static void RB_RenderDebugUtils() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -4283,7 +4283,7 @@ static void RB_RenderDebugUtils() GL_Cull( cullType_t::CT_TWO_SIDED ); GL_State( GLS_DEPTHTEST_DISABLE ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_Color( gl_genericShader, Color::Black ); w = 300; h = 300; @@ -4344,8 +4344,8 @@ static void RB_RenderDebugUtils() } // set uniforms - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( Color::Black ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, Color::Black ); GL_State( GLS_POLYMODE_LINE | GLS_DEPTHTEST_DISABLE ); GL_Cull( cullType_t::CT_TWO_SIDED ); @@ -4397,7 +4397,7 @@ static void RB_RenderDebugUtils() Tess_End(); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_CUSTOM_RGB, alphaGen_t::AGEN_CUSTOM ); } } // i == 1 else @@ -4432,15 +4432,15 @@ static void RB_RenderDebugUtils() } //if(node->shrinkedAABB) - // gl_genericShader->SetUniform_Color(colorBlue); + // SetUniform_Color( gl_genericShader,colorBlue); //else if ( node->visCounts[ tr.visIndex ] == tr.visCounts[ tr.visIndex ] ) { - gl_genericShader->SetUniform_Color( Color::Green ); + SetUniform_Color( gl_genericShader, Color::Green ); } else { - gl_genericShader->SetUniform_Color( Color::Red ); + SetUniform_Color( gl_genericShader, Color::Red ); } } else @@ -4452,11 +4452,11 @@ static void RB_RenderDebugUtils() if ( node->visCounts[ tr.visIndex ] == tr.visCounts[ tr.visIndex ] ) { - gl_genericShader->SetUniform_Color( Color::Yellow ); + SetUniform_Color( gl_genericShader, Color::Yellow ); } else { - gl_genericShader->SetUniform_Color( Color::Blue ); + SetUniform_Color( gl_genericShader, Color::Blue ); } } @@ -4552,8 +4552,8 @@ void DebugDrawBegin( debugDrawMode_t mode, float size ) { // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); - gl_genericShader->SetUniform_Color( colorClear ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_Color( gl_genericShader, colorClear ); // bind u_ColorMap gl_genericShader->SetUniform_ColorMapBindless( @@ -5670,7 +5670,7 @@ void RB_ShowImages() // set uniforms gl_genericShader->SetUniform_AlphaTest( GLS_ATEST_NONE ); - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_VERTEX, alphaGen_t::AGEN_VERTEX ); + SetUniform_ColorModulateColorGen( gl_genericShader, 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 27ba657617..879502fbd2 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -679,22 +679,22 @@ static void DrawTris() if ( r_showBatches->integer || r_showLightBatches->integer ) { - gl_genericShader->SetUniform_Color( Color::Color::Indexed( backEnd.pc.c_batches % 8 ) ); + SetUniform_Color( gl_genericShader, Color::Color::Indexed( backEnd.pc.c_batches % 8 ) ); } else if ( glState.currentVBO == tess.vbo ) { - gl_genericShader->SetUniform_Color( Color::Red ); + SetUniform_Color( gl_genericShader, Color::Red ); } else if ( glState.currentVBO ) { - gl_genericShader->SetUniform_Color( Color::Blue ); + SetUniform_Color( gl_genericShader, Color::Blue ); } else { - gl_genericShader->SetUniform_Color( Color::White ); + SetUniform_Color( gl_genericShader, Color::White ); } - gl_genericShader->SetUniform_ColorModulateColorGen( colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); + SetUniform_ColorModulateColorGen( gl_genericShader, colorGen_t::CGEN_CONST, alphaGen_t::AGEN_CONST ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -856,11 +856,10 @@ void Render_generic3D( shaderStage_t *pStage ) bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && tess.bspSurface; const bool styleLightMap = pStage->type == stageType_t::ST_STYLELIGHTMAP || pStage->type == stageType_t::ST_STYLECOLORMAP; - gl_genericShader->SetUniform_ColorModulateColorGen( - rgbGen, alphaGen, mayUseVertexOverbright, /*useMapLightFactor=*/ styleLightMap); + SetUniform_ColorModulateColorGen( gl_genericShader, rgbGen, alphaGen, mayUseVertexOverbright, styleLightMap ); // u_Color - gl_genericShader->SetUniform_Color( tess.svars.color ); + SetUniform_Color( gl_genericShader, tess.svars.color ); gl_genericShader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_genericShader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); @@ -1058,10 +1057,10 @@ void Render_lightMapping( shaderStage_t *pStage ) gl_lightMappingShader->SetUniform_Time( backEnd.refdef.floatTime - backEnd.currentEntity->e.shaderTime ); // u_ColorModulate - gl_lightMappingShader->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, lightMode != lightMode_t::FULLBRIGHT ); + SetUniform_ColorModulateColorGen( gl_lightMappingShader, rgbGen, alphaGen, false, lightMode != lightMode_t::FULLBRIGHT ); // u_Color - gl_lightMappingShader->SetUniform_Color( tess.svars.color ); + SetUniform_Color( gl_lightMappingShader, tess.svars.color ); // u_AlphaThreshold gl_lightMappingShader->SetUniform_AlphaTest( pStage->stateBits ); @@ -1250,7 +1249,7 @@ static void Render_shadowFill( shaderStage_t *pStage ) if ( r_debugShadowMaps->integer ) { - gl_shadowFillShader->SetUniform_Color( Color::Color::Indexed( backEnd.pc.c_batches % 8 ) ); + SetUniform_Color( gl_shadowFillShader, Color::Color::Indexed( backEnd.pc.c_batches % 8 ) ); } // u_AlphaThreshold @@ -1331,10 +1330,10 @@ static void Render_forwardLighting_DBS_omni( shaderStage_t *pStage, colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_forwardLightingShader_omniXYZ->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); + SetUniform_ColorModulateColorGen( gl_forwardLightingShader_omniXYZ, rgbGen, alphaGen ); // u_Color - gl_forwardLightingShader_omniXYZ->SetUniform_Color( tess.svars.color ); + SetUniform_Color( gl_forwardLightingShader_omniXYZ, tess.svars.color ); // u_AlphaThreshold gl_forwardLightingShader_omniXYZ->SetUniform_AlphaTest( pStage->stateBits ); @@ -1506,10 +1505,10 @@ static void Render_forwardLighting_DBS_proj( shaderStage_t *pStage, colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_forwardLightingShader_projXYZ->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); + SetUniform_ColorModulateColorGen( gl_forwardLightingShader_projXYZ, rgbGen, alphaGen ); // u_Color - gl_forwardLightingShader_projXYZ->SetUniform_Color( tess.svars.color ); + SetUniform_Color( gl_forwardLightingShader_projXYZ, tess.svars.color ); // u_AlphaThreshold gl_forwardLightingShader_projXYZ->SetUniform_AlphaTest( pStage->stateBits ); @@ -1682,10 +1681,10 @@ static void Render_forwardLighting_DBS_directional( shaderStage_t *pStage, trRef colorGen_t rgbGen = SetRgbGen( pStage ); alphaGen_t alphaGen = SetAlphaGen( pStage ); - gl_forwardLightingShader_directionalSun->SetUniform_ColorModulateColorGen( rgbGen, alphaGen ); + SetUniform_ColorModulateColorGen( gl_forwardLightingShader_directionalSun, rgbGen, alphaGen ); // u_Color - gl_forwardLightingShader_directionalSun->SetUniform_Color( tess.svars.color ); + SetUniform_Color( gl_forwardLightingShader_directionalSun, tess.svars.color ); // u_AlphaThreshold gl_forwardLightingShader_directionalSun->SetUniform_AlphaTest( pStage->stateBits ); @@ -2278,7 +2277,7 @@ void Render_fog( shaderStage_t* pStage ) gl_fogQuake3Shader->SetUniform_FogEyeT( eyeT ); // u_Color - gl_fogQuake3Shader->SetUniform_ColorGlobal( fog->color ); + SetUniform_ColorGlobal( gl_fogQuake3Shader, fog->color ); gl_fogQuake3Shader->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix ); gl_fogQuake3Shader->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[ glState.stackIndex ] ); From ec4bdaf903614b458590c6ce78671830bbcf641a Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Mon, 17 Mar 2025 12:44:52 +0100 Subject: [PATCH 3/3] fixup: fixes --- src/engine/renderer/gl_shader.h | 12 ++++++------ src/engine/renderer/glsl_source/common.glsl | 17 +++++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index a81e45eece..92e96500c0 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -3747,7 +3747,7 @@ struct colorModulation_t { float colorGen = 0.0f; float alphaGen = 0.0f; float lightFactor = 1.0f; - bool isLightStyle = false; + bool useVertexLightFactor = false; bool alphaAddOne = true; }; @@ -3762,13 +3762,13 @@ static colorModulation_t ColorModulateColorGen( switch ( colorGen ) { case colorGen_t::CGEN_VERTEX: - colorModulation.alphaAddOne = false;; + colorModulation.alphaAddOne = false; 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 - colorModulation.isLightStyle = true; + colorModulation.useVertexLightFactor = true; colorModulation.lightFactor = tr.mapLightFactor; } else @@ -3778,7 +3778,7 @@ static colorModulation_t ColorModulateColorGen( break; case colorGen_t::CGEN_ONE_MINUS_VERTEX: - colorModulation.alphaAddOne = false;; + colorModulation.alphaAddOne = false; colorModulation.colorGen = -1.0f; break; @@ -3840,7 +3840,7 @@ class u_ColorModulateColorGen_Float : vec4_t colorModulate_Float; colorModulate_Float[ 0 ] = colorModulation.colorGen; colorModulate_Float[ 1 ] = colorModulation.lightFactor; - colorModulate_Float[ 1 ] *= colorModulation.isLightStyle ? -1.0f : 1.0f; + colorModulate_Float[ 1 ] *= colorModulation.useVertexLightFactor ? -1.0f : 1.0f; colorModulate_Float[ 2 ] = colorModulation.alphaAddOne; colorModulate_Float[ 3 ] = colorModulation.alphaGen; @@ -3899,7 +3899,7 @@ class u_ColorModulateColorGen_Uint : << Util::ordinal( ColorModulate_Bit::ALPHA_MINUS_ONE ); colorModulate_Uint |= colorModulation.alphaAddOne << Util::ordinal( ColorModulate_Bit::ALPHA_ADD_ONE ); - colorModulate_Uint |= colorModulation.isLightStyle + colorModulate_Uint |= colorModulation.useVertexLightFactor << Util::ordinal( ColorModulate_Bit::IS_LIGHT_STYLE ); colorModulate_Uint |= uint32_t( colorModulation.lightFactor ) << Util::ordinal( ColorModulate_Bit::LIGHTFACTOR_BIT0 ); diff --git a/src/engine/renderer/glsl_source/common.glsl b/src/engine/renderer/glsl_source/common.glsl index 2aba2c9eed..1c7013a74d 100644 --- a/src/engine/renderer/glsl_source/common.glsl +++ b/src/engine/renderer/glsl_source/common.glsl @@ -99,21 +99,22 @@ vec4 ColorModulateToColor( const in colorModulatePack colorMod ) return vec4( rgb, rgb, rgb, alpha ); } -struct modBits_t { +struct ModBits_t +{ bool alphaAddOne; - bool isLightStyle; + bool useVertexLightFactor; }; -modBits_t ColorModulateToBits( const in colorModulatePack colorMod ) +ModBits_t ColorModulateToBits( const in colorModulatePack colorMod ) { - modBits_t modBits; + ModBits_t modBits; #if defined(HAVE_EXT_gpu_shader4) modBits.alphaAddOne = bool( ( colorMod >> 4u ) & 1u ); - modBits.isLightStyle = bool( ( colorMod >> 27u ) & 1u ); + modBits.useVertexLightFactor = bool( ( colorMod >> 27u ) & 1u ); #else modBits.alphaAddOne = colorMod.b != 0; - modBits.isLightStyle = colorMod.g < 0; + modBits.useVertexLightFactor = colorMod.g < 0; #endif return modBits; @@ -155,13 +156,13 @@ void ColorModulateColor_lightFactor( inout vec4 color ) { vec4 colorModulation = ColorModulateToColor( colorMod ); - modBits_t modBits = ColorModulateToBits( colorMod ); + ModBits_t modBits = ColorModulateToBits( colorMod ); float lightFactor = ColorModulateToLightFactor( colorMod ); // This is used to skip vertex colours if the colorMod doesn't need them. color.a = modBits.alphaAddOne ? 1.0 : color.a; - colorModulation.rgb += vec3( modBits.isLightStyle ? lightFactor : 0 ); + colorModulation.rgb += vec3( modBits.useVertexLightFactor ? lightFactor : 0 ); vec4 unpackedColor = UnpackColor( packedColor );