Skip to content

Commit 5c2c758

Browse files
committed
renderer: implement sRGB in GLSL
1 parent c74d6f9 commit 5c2c758

22 files changed

+459
-83
lines changed

src.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ set(GLSLSOURCELIST
154154
${ENGINE_DIR}/renderer/glsl_source/blurY_vp.glsl
155155
${ENGINE_DIR}/renderer/glsl_source/cameraEffects_fp.glsl
156156
${ENGINE_DIR}/renderer/glsl_source/cameraEffects_vp.glsl
157+
${ENGINE_DIR}/renderer/glsl_source/colorSpace_fp.glsl
157158
${ENGINE_DIR}/renderer/glsl_source/computeLight_fp.glsl
158159
${ENGINE_DIR}/renderer/glsl_source/contrast_fp.glsl
159160
${ENGINE_DIR}/renderer/glsl_source/contrast_vp.glsl

src/common/Color.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3838
#include "Compiler.h"
3939
#include "Math.h"
4040

41+
#define convertFromSRGB( v ) v <= 0.04045f ? v * (1.0f / 12.92f) : pow((v + 0.055f) * (1.0f / 1.055f), 2.4f)
42+
4143
namespace Color {
4244

4345
/*
@@ -256,6 +258,18 @@ class BasicColor
256258
alpha = v;
257259
}
258260

261+
CONSTEXPR_FUNCTION_RELAXED component_type ConvertFromSRGB( component_type v ) NOEXCEPT
262+
{
263+
return convertFromSRGB( v );
264+
}
265+
266+
CONSTEXPR_FUNCTION_RELAXED void ConvertFromSRGB() NOEXCEPT
267+
{
268+
red = ConvertFromSRGB( red );
269+
green = ConvertFromSRGB( green );
270+
blue = ConvertFromSRGB( blue );
271+
}
272+
259273
CONSTEXPR_FUNCTION_RELAXED BasicColor& operator*=( float factor ) NOEXCEPT
260274
{
261275
*this = *this * factor;

src/engine/renderer/gl_shader.cpp

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,11 @@ static std::string GenEngineConstants() {
589589
AddConst( str, "r_RimExponent", r_rimExponent->value );
590590
}
591591

592+
if ( r_cheapSRGB.Get() )
593+
{
594+
AddDefine( str, "r_cheapSRGB", 1 );
595+
}
596+
592597
if ( r_showLightTiles->integer )
593598
{
594599
AddDefine( str, "r_showLightTiles", 1 );
@@ -1574,6 +1579,7 @@ void GLShader_generic2D::SetShaderProgramUniforms( shaderProgram_t *shaderProgra
15741579
GLShader_generic::GLShader_generic( GLShaderManager *manager ) :
15751580
GLShader( "generic", ATTR_POSITION | ATTR_TEXCOORD | ATTR_QTANGENT, manager ),
15761581
u_LightFactor( this ),
1582+
u_LinearizeTexture( this ),
15771583
u_TextureMatrix( this ),
15781584
u_ViewOrigin( this ),
15791585
u_ViewUp( this ),
@@ -1602,6 +1608,11 @@ void GLShader_generic::BuildShaderVertexLibNames( std::string& vertexInlines )
16021608
vertexInlines += "vertexSimple vertexSkinning vertexAnimation vertexSprite ";
16031609
}
16041610

1611+
void GLShader_generic::BuildShaderFragmentLibNames( std::string& fragmentInlines )
1612+
{
1613+
fragmentInlines += "colorSpace";
1614+
}
1615+
16051616
void GLShader_generic::SetShaderProgramUniforms( shaderProgram_t *shaderProgram )
16061617
{
16071618
glUniform1i( glGetUniformLocation( shaderProgram->program, "u_ColorMap" ), 0 );
@@ -1612,6 +1623,7 @@ GLShader_lightMapping::GLShader_lightMapping( GLShaderManager *manager ) :
16121623
GLShader( "lightMapping",
16131624
ATTR_POSITION | ATTR_TEXCOORD | ATTR_QTANGENT | ATTR_COLOR, manager ),
16141625
u_LightFactors( this ),
1626+
u_LinearizeTextures( this ),
16151627
u_TextureMatrix( this ),
16161628
u_SpecularExponent( this ),
16171629
u_ColorModulate( this ),
@@ -1651,7 +1663,7 @@ void GLShader_lightMapping::BuildShaderVertexLibNames( std::string& vertexInline
16511663

16521664
void GLShader_lightMapping::BuildShaderFragmentLibNames( std::string& fragmentInlines )
16531665
{
1654-
fragmentInlines += "computeLight reliefMapping";
1666+
fragmentInlines += "colorSpace computeLight reliefMapping";
16551667
}
16561668

16571669
void GLShader_lightMapping::BuildShaderCompileMacros( std::string& /*compileMacros*/ )
@@ -1677,6 +1689,7 @@ void GLShader_lightMapping::SetShaderProgramUniforms( shaderProgram_t *shaderPro
16771689

16781690
GLShader_forwardLighting_omniXYZ::GLShader_forwardLighting_omniXYZ( GLShaderManager *manager ):
16791691
GLShader("forwardLighting_omniXYZ", "forwardLighting", ATTR_POSITION | ATTR_TEXCOORD | ATTR_QTANGENT, manager),
1692+
u_LinearizeTextures( this ),
16801693
u_TextureMatrix( this ),
16811694
u_SpecularExponent( this ),
16821695
u_AlphaThreshold( this ),
@@ -1713,7 +1726,7 @@ void GLShader_forwardLighting_omniXYZ::BuildShaderVertexLibNames( std::string& v
17131726

17141727
void GLShader_forwardLighting_omniXYZ::BuildShaderFragmentLibNames( std::string& fragmentInlines )
17151728
{
1716-
fragmentInlines += "computeLight reliefMapping";
1729+
fragmentInlines += "colorSpace computeLight reliefMapping";
17171730
}
17181731

17191732
void GLShader_forwardLighting_omniXYZ::BuildShaderCompileMacros( std::string& /*compileMacros*/ )
@@ -1735,6 +1748,7 @@ void GLShader_forwardLighting_omniXYZ::SetShaderProgramUniforms( shaderProgram_t
17351748

17361749
GLShader_forwardLighting_projXYZ::GLShader_forwardLighting_projXYZ( GLShaderManager *manager ):
17371750
GLShader("forwardLighting_projXYZ", "forwardLighting", ATTR_POSITION | ATTR_TEXCOORD | ATTR_QTANGENT, manager),
1751+
u_LinearizeTextures( this ),
17381752
u_TextureMatrix( this ),
17391753
u_SpecularExponent( this ),
17401754
u_AlphaThreshold( this ),
@@ -1772,7 +1786,7 @@ void GLShader_forwardLighting_projXYZ::BuildShaderVertexLibNames( std::string& v
17721786

17731787
void GLShader_forwardLighting_projXYZ::BuildShaderFragmentLibNames( std::string& fragmentInlines )
17741788
{
1775-
fragmentInlines += "computeLight reliefMapping";
1789+
fragmentInlines += "colorSpace computeLight reliefMapping";
17761790
}
17771791

17781792
void GLShader_forwardLighting_projXYZ::BuildShaderCompileMacros( std::string& compileMacros )
@@ -1795,6 +1809,7 @@ void GLShader_forwardLighting_projXYZ::SetShaderProgramUniforms( shaderProgram_t
17951809

17961810
GLShader_forwardLighting_directionalSun::GLShader_forwardLighting_directionalSun( GLShaderManager *manager ):
17971811
GLShader("forwardLighting_directionalSun", "forwardLighting", ATTR_POSITION | ATTR_TEXCOORD | ATTR_QTANGENT, manager),
1812+
u_LinearizeTextures( this ),
17981813
u_TextureMatrix( this ),
17991814
u_SpecularExponent( this ),
18001815
u_AlphaThreshold( this ),
@@ -1834,7 +1849,7 @@ void GLShader_forwardLighting_directionalSun::BuildShaderVertexLibNames( std::st
18341849

18351850
void GLShader_forwardLighting_directionalSun::BuildShaderFragmentLibNames( std::string& fragmentInlines )
18361851
{
1837-
fragmentInlines += "computeLight reliefMapping";
1852+
fragmentInlines += "colorSpace computeLight reliefMapping";
18381853
}
18391854

18401855
void GLShader_forwardLighting_directionalSun::BuildShaderCompileMacros( std::string& compileMacros )
@@ -1933,6 +1948,7 @@ void GLShader_reflection::SetShaderProgramUniforms( shaderProgram_t *shaderProgr
19331948

19341949
GLShader_skybox::GLShader_skybox( GLShaderManager *manager ) :
19351950
GLShader( "skybox", ATTR_POSITION, manager ),
1951+
u_LinearizeTexture( this ),
19361952
u_ViewOrigin( this ),
19371953
u_ModelMatrix( this ),
19381954
u_ModelViewProjectionMatrix( this ),
@@ -1942,13 +1958,19 @@ GLShader_skybox::GLShader_skybox( GLShaderManager *manager ) :
19421958
{
19431959
}
19441960

1961+
void GLShader_skybox::BuildShaderFragmentLibNames( std::string& fragmentInlines )
1962+
{
1963+
fragmentInlines += "colorSpace";
1964+
}
1965+
19451966
void GLShader_skybox::SetShaderProgramUniforms( shaderProgram_t *shaderProgram )
19461967
{
19471968
glUniform1i( glGetUniformLocation( shaderProgram->program, "u_ColorMap" ), 0 );
19481969
}
19491970

19501971
GLShader_fogQuake3::GLShader_fogQuake3( GLShaderManager *manager ) :
19511972
GLShader( "fogQuake3", ATTR_POSITION | ATTR_QTANGENT, manager ),
1973+
u_LinearizeTexture( this ),
19521974
u_ModelMatrix( this ),
19531975
u_ModelViewProjectionMatrix( this ),
19541976
u_Color( this ),
@@ -1968,13 +1990,19 @@ void GLShader_fogQuake3::BuildShaderVertexLibNames( std::string& vertexInlines )
19681990
vertexInlines += "vertexSimple vertexSkinning vertexAnimation ";
19691991
}
19701992

1993+
void GLShader_fogQuake3::BuildShaderFragmentLibNames( std::string& fragmentInlines )
1994+
{
1995+
fragmentInlines += "colorSpace";
1996+
}
1997+
19711998
void GLShader_fogQuake3::SetShaderProgramUniforms( shaderProgram_t *shaderProgram )
19721999
{
19732000
glUniform1i( glGetUniformLocation( shaderProgram->program, "u_ColorMap" ), 0 );
19742001
}
19752002

19762003
GLShader_fogGlobal::GLShader_fogGlobal( GLShaderManager *manager ) :
19772004
GLShader( "fogGlobal", ATTR_POSITION, manager ),
2005+
u_LinearizeTexture( this ),
19782006
u_ViewOrigin( this ),
19792007
u_ViewMatrix( this ),
19802008
u_ModelViewProjectionMatrix( this ),
@@ -1985,6 +2013,11 @@ GLShader_fogGlobal::GLShader_fogGlobal( GLShaderManager *manager ) :
19852013
{
19862014
}
19872015

2016+
void GLShader_fogGlobal::BuildShaderFragmentLibNames( std::string& fragmentInlines )
2017+
{
2018+
fragmentInlines += "colorSpace";
2019+
}
2020+
19882021
void GLShader_fogGlobal::SetShaderProgramUniforms( shaderProgram_t *shaderProgram )
19892022
{
19902023
glUniform1i( glGetUniformLocation( shaderProgram->program, "u_ColorMap" ), 0 );
@@ -2071,8 +2104,14 @@ GLShader_cameraEffects::GLShader_cameraEffects( GLShaderManager *manager ) :
20712104
u_TextureMatrix( this ),
20722105
u_ModelViewProjectionMatrix( this ),
20732106
u_DeformMagnitude( this ),
2074-
u_InverseGamma( this )
2107+
u_InverseGamma( this ),
2108+
u_DelinearizeScreen( this )
2109+
{
2110+
}
2111+
2112+
void GLShader_cameraEffects::BuildShaderFragmentLibNames( std::string& fragmentInlines )
20752113
{
2114+
fragmentInlines += "colorSpace";
20762115
}
20772116

20782117
void GLShader_cameraEffects::SetShaderProgramUniforms( shaderProgram_t *shaderProgram )
@@ -2144,7 +2183,7 @@ GLShader_liquid::GLShader_liquid( GLShaderManager *manager ) :
21442183

21452184
void GLShader_liquid::BuildShaderFragmentLibNames( std::string& fragmentInlines )
21462185
{
2147-
fragmentInlines += "computeLight reliefMapping";
2186+
fragmentInlines += "colorSpace computeLight reliefMapping";
21482187
}
21492188

21502189
void GLShader_liquid::SetShaderProgramUniforms( shaderProgram_t *shaderProgram )

src/engine/renderer/gl_shader.h

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1678,6 +1678,51 @@ class u_ShadowTexelSize :
16781678
}
16791679
};
16801680

1681+
class u_LinearizeTexture :
1682+
GLUniform1i
1683+
{
1684+
public:
1685+
u_LinearizeTexture( GLShader *shader ) :
1686+
GLUniform1i( shader, "u_LinearizeTexture" )
1687+
{
1688+
}
1689+
1690+
void SetUniform_LinearizeTexture( const int value )
1691+
{
1692+
this->SetValue( value );
1693+
}
1694+
};
1695+
1696+
class u_LinearizeTextures :
1697+
GLUniform2i
1698+
{
1699+
public:
1700+
u_LinearizeTextures( GLShader *shader ) :
1701+
GLUniform2i( shader, "u_LinearizeTextures" )
1702+
{
1703+
}
1704+
1705+
void SetUniform_LinearizeTextures( const ivec2_t v )
1706+
{
1707+
this->SetValue( v );
1708+
}
1709+
};
1710+
1711+
class u_DelinearizeScreen :
1712+
GLUniform1i
1713+
{
1714+
public:
1715+
u_DelinearizeScreen( GLShader *shader ) :
1716+
GLUniform1i( shader, "u_DelinearizeScreen" )
1717+
{
1718+
}
1719+
1720+
void SetUniform_DelinearizeScreen( const int value )
1721+
{
1722+
this->SetValue( value );
1723+
}
1724+
};
1725+
16811726
class u_ShadowBlur :
16821727
GLUniform1f
16831728
{
@@ -2390,6 +2435,7 @@ class GLShader_generic2D :
23902435
class GLShader_generic :
23912436
public GLShader,
23922437
public u_LightFactor,
2438+
public u_LinearizeTexture,
23932439
public u_TextureMatrix,
23942440
public u_ViewOrigin,
23952441
public u_ViewUp,
@@ -2414,12 +2460,14 @@ class GLShader_generic :
24142460
public:
24152461
GLShader_generic( GLShaderManager *manager );
24162462
void BuildShaderVertexLibNames( std::string& vertexInlines ) override;
2463+
void BuildShaderFragmentLibNames( std::string& vertexInlines ) override;
24172464
void SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) override;
24182465
};
24192466

24202467
class GLShader_lightMapping :
24212468
public GLShader,
24222469
public u_LightFactors,
2470+
public u_LinearizeTextures,
24232471
public u_TextureMatrix,
24242472
public u_SpecularExponent,
24252473
public u_ColorModulate,
@@ -2460,6 +2508,7 @@ class GLShader_lightMapping :
24602508

24612509
class GLShader_forwardLighting_omniXYZ :
24622510
public GLShader,
2511+
public u_LinearizeTextures,
24632512
public u_TextureMatrix,
24642513
public u_SpecularExponent,
24652514
public u_AlphaThreshold,
@@ -2497,6 +2546,7 @@ class GLShader_forwardLighting_omniXYZ :
24972546

24982547
class GLShader_forwardLighting_projXYZ :
24992548
public GLShader,
2549+
public u_LinearizeTextures,
25002550
public u_TextureMatrix,
25012551
public u_SpecularExponent,
25022552
public u_AlphaThreshold,
@@ -2535,6 +2585,7 @@ class GLShader_forwardLighting_projXYZ :
25352585

25362586
class GLShader_forwardLighting_directionalSun :
25372587
public GLShader,
2588+
public u_LinearizeTextures,
25382589
public u_TextureMatrix,
25392590
public u_SpecularExponent,
25402591
public u_AlphaThreshold,
@@ -2623,6 +2674,7 @@ class GLShader_reflection :
26232674

26242675
class GLShader_skybox :
26252676
public GLShader,
2677+
public u_LinearizeTexture,
26262678
public u_ViewOrigin,
26272679
public u_ModelMatrix,
26282680
public u_ModelViewProjectionMatrix,
@@ -2632,11 +2684,13 @@ class GLShader_skybox :
26322684
{
26332685
public:
26342686
GLShader_skybox( GLShaderManager *manager );
2687+
void BuildShaderFragmentLibNames( std::string& vertexInlines ) override;
26352688
void SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) override;
26362689
};
26372690

26382691
class GLShader_fogQuake3 :
26392692
public GLShader,
2693+
public u_LinearizeTexture,
26402694
public u_ModelMatrix,
26412695
public u_ModelViewProjectionMatrix,
26422696
public u_Color,
@@ -2652,11 +2706,13 @@ class GLShader_fogQuake3 :
26522706
public:
26532707
GLShader_fogQuake3( GLShaderManager *manager );
26542708
void BuildShaderVertexLibNames( std::string& vertexInlines ) override;
2709+
void BuildShaderFragmentLibNames( std::string& fragmentInlines ) override;
26552710
void SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) override;
26562711
};
26572712

26582713
class GLShader_fogGlobal :
26592714
public GLShader,
2715+
public u_LinearizeTexture,
26602716
public u_ViewOrigin,
26612717
public u_ViewMatrix,
26622718
public u_ModelViewProjectionMatrix,
@@ -2667,6 +2723,7 @@ class GLShader_fogGlobal :
26672723
{
26682724
public:
26692725
GLShader_fogGlobal( GLShaderManager *manager );
2726+
void BuildShaderFragmentLibNames( std::string& fragmentInlines ) override;
26702727
void SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) override;
26712728
};
26722729

@@ -2732,11 +2789,13 @@ class GLShader_cameraEffects :
27322789
public u_TextureMatrix,
27332790
public u_ModelViewProjectionMatrix,
27342791
public u_DeformMagnitude,
2735-
public u_InverseGamma
2792+
public u_InverseGamma,
2793+
public u_DelinearizeScreen
27362794
{
27372795
public:
27382796
GLShader_cameraEffects( GLShaderManager *manager );
27392797
void SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) override;
2798+
void BuildShaderFragmentLibNames( std::string& vertexInlines ) override;
27402799
};
27412800

27422801
class GLShader_blurX :

0 commit comments

Comments
 (0)