Skip to content

Commit e0ff661

Browse files
committed
wip: sRGB specularMap
1 parent 4dc117a commit e0ff661

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

src/engine/renderer/glsl_source/lightMapping_fp.glsl

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,15 @@ void main()
9191
return;
9292
}
9393

94-
/* HACK: emulate two-bits bitfield
95-
even: no texture linearization (first bit)
96-
less than 2: no lightmap linearization (second bit) */
97-
bool linearizeTexture = bool(u_LinearizeTexture % 2);
98-
bool linearizeLightMap = u_LinearizeTexture > 1;
94+
/* HACK: emulate three-bits bitfield
95+
even: no color map linearization (first bit)
96+
less than 2: no light map linearization (second bit)
97+
positive: no material map linearization (extra bit) */
98+
bool linearizeColorMap = bool(u_LinearizeTexture % 2);
99+
bool linearizeLightMap = abs(u_LinearizeTexture) > 1;
100+
bool linearizeMaterialMap = u_LinearizeTexture < 0;
99101

100-
convertFromSRGB(diffuse.rgb, linearizeTexture);
102+
convertFromSRGB(diffuse.rgb, linearizeColorMap);
101103

102104
diffuse.rgb *= var_Color.rgb;
103105

@@ -107,6 +109,8 @@ void main()
107109
// Compute the material term.
108110
vec4 material = texture2D(u_MaterialMap, texCoords);
109111

112+
convertFromSRGB(material.rgb, linearizeMaterialMap);
113+
110114
// Compute final color.
111115
vec4 color;
112116
color.a = diffuse.a;
@@ -197,7 +201,7 @@ void main()
197201
// Blend glow map.
198202
vec3 glow = texture2D(u_GlowMap, texCoords).rgb;
199203

200-
convertFromSRGB(glow, linearizeTexture);
204+
convertFromSRGB(glow, linearizeColorMap);
201205

202206
/* HACK: use sign to know if there is a light or not, and
203207
then if it will receive overbright multiplication or not. */

src/engine/renderer/tr_shader.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4735,12 +4735,13 @@ static bool ParseShader( const char *_text )
47354735
return true;
47364736
}
47374737

4738-
static int packLinearizeTexture( bool linearizeTexture, bool linearizeLightMap )
4738+
static int packLinearizeTexture( bool linearizeColorMap, bool linearizeMaterialMap, bool linearizeLightMap )
47394739
{
4740-
/* HACK: emulate two-bits bitfield
4741-
even: no texture linearization (first bit)
4742-
less than 2: no lightmap linearization (second bit) */
4743-
return int(linearizeTexture) + ( 2 * int(linearizeLightMap) );
4740+
/* HACK: emulate three-bits bitfield
4741+
even: no color map linearization (first bit)
4742+
less than 2: no light map linearization (second bit)
4743+
positive: no material map linearization (extra bit) */
4744+
return ( int(linearizeColorMap) + ( 2 * int(linearizeLightMap) ) ) * ( linearizeMaterialMap ? -1 : 1 );
47444745
}
47454746

47464747
/*
@@ -5161,28 +5162,6 @@ static void CollapseStages()
51615162
{
51625163
shaderStage_t *stage = &stages[ s ];
51635164

5164-
switch ( stage->type )
5165-
{
5166-
case stageType_t::ST_COLORMAP:
5167-
case stageType_t::ST_COLLAPSE_COLORMAP:
5168-
case stageType_t::ST_SKYBOXMAP:
5169-
stage->linearizeTexture = tr.worldLinearizeTexture;
5170-
break;
5171-
case stageType_t::ST_STYLELIGHTMAP:
5172-
case stageType_t::ST_STYLECOLORMAP:
5173-
stage->linearizeTexture = tr.worldLinearizeLightMap;
5174-
break;
5175-
case stageType_t::ST_LIGHTMAP:
5176-
stage->linearizeTexture = packLinearizeTexture( false, tr.worldLinearizeLightMap );
5177-
break;
5178-
case stageType_t::ST_DIFFUSEMAP:
5179-
case stageType_t::ST_COLLAPSE_DIFFUSEMAP:
5180-
stage->linearizeTexture = packLinearizeTexture( tr.worldLinearizeTexture, tr.worldLinearizeLightMap );
5181-
break;
5182-
default:
5183-
break;
5184-
}
5185-
51865165
switch ( stage->type )
51875166
{
51885167
case stageType_t::ST_LIGHTMAP:
@@ -5234,6 +5213,31 @@ static void CollapseStages()
52345213
// see https://github.com/DaemonEngine/Daemon/issues/376
52355214
stage->isHeightMapInNormalMap = stage->isHeightMapInNormalMap && ( stage->enableNormalMapping || stage->enableReliefMapping );
52365215

5216+
switch ( stage->type )
5217+
{
5218+
case stageType_t::ST_COLORMAP:
5219+
case stageType_t::ST_COLLAPSE_COLORMAP:
5220+
case stageType_t::ST_SKYBOXMAP:
5221+
stage->linearizeTexture = tr.worldLinearizeTexture;
5222+
break;
5223+
case stageType_t::ST_STYLELIGHTMAP:
5224+
case stageType_t::ST_STYLECOLORMAP:
5225+
stage->linearizeTexture = tr.worldLinearizeLightMap;
5226+
break;
5227+
case stageType_t::ST_LIGHTMAP:
5228+
stage->linearizeTexture = packLinearizeTexture( false, false, tr.worldLinearizeLightMap );
5229+
break;
5230+
case stageType_t::ST_DIFFUSEMAP:
5231+
case stageType_t::ST_COLLAPSE_DIFFUSEMAP:
5232+
stage->linearizeTexture = packLinearizeTexture(
5233+
tr.worldLinearizeTexture,
5234+
stage->hasMaterialMap && stages->collapseType == collapseType_t::COLLAPSE_PHONG,
5235+
tr.worldLinearizeLightMap );
5236+
break;
5237+
default:
5238+
break;
5239+
}
5240+
52375241
// Bind fallback textures if required.
52385242
if ( !stage->enableNormalMapping && !( stage->enableReliefMapping && stage->isHeightMapInNormalMap) )
52395243
{

0 commit comments

Comments
 (0)