Skip to content

Commit d39d77c

Browse files
committed
renderer: rework tone mapper and SSAO enablement
1 parent f476a00 commit d39d77c

File tree

6 files changed

+73
-46
lines changed

6 files changed

+73
-46
lines changed

src/engine/renderer/glsl_source/cameraEffects_fp.glsl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ IN(smooth) vec2 var_TexCoords;
3636

3737
DECLARE_OUTPUT(vec4)
3838

39+
// Tone mapping is not available when high-precision float framebuffer isn't enabled or supported.
40+
#if defined(r_highPrecisionRendering) && defined(HAVE_ARB_texture_float)
3941
/* x: contrast
4042
y: highlightsCompressionSpeed
4143
z: shoulderClip
@@ -49,6 +51,7 @@ vec3 TonemapLottes( vec3 color ) {
4951
return pow( color, vec3( u_TonemapParms[0] ) )
5052
/ ( pow( color, vec3( u_TonemapParms[0] * u_TonemapParms[1] ) ) * u_TonemapParms[2] + u_TonemapParms[3] );
5153
}
54+
#endif
5255

5356
void main()
5457
{
@@ -58,9 +61,10 @@ void main()
5861
vec4 color = texture2D(u_CurrentMap, st);
5962
color *= u_GlobalLightFactor;
6063

61-
if( u_Tonemap ) {
62-
color.rgb = TonemapLottes( color.rgb * u_TonemapExposure );
63-
}
64+
#if defined(r_highPrecisionRendering) && defined(HAVE_ARB_texture_float)
65+
color.rgb = TonemapLottes( color.rgb * u_TonemapExposure );
66+
#endif
67+
6468
color.rgb = clamp( color.rgb, vec3( 0.0f ), vec3( 1.0f ) );
6569

6670
#if defined(r_colorGrading)

src/engine/renderer/tr_backend.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ void GL_BindNullProgram()
151151

152152
void GL_SelectTexture( int unit )
153153
{
154-
155154
if ( glState.currenttmu == unit )
156155
{
157156
return;
@@ -3192,7 +3191,8 @@ void RB_RenderSSAO()
31923191
{
31933192
GLimp_LogComment( "--- RB_RenderSSAO ---\n" );
31943193

3195-
if ( !glConfig2.textureGatherAvailable ) {
3194+
if ( !glConfig2.ssao )
3195+
{
31963196
return;
31973197
}
31983198

@@ -3205,7 +3205,7 @@ void RB_RenderSSAO()
32053205
GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );
32063206
GL_Cull( cullType_t::CT_TWO_SIDED );
32073207

3208-
if ( r_ssao->integer < 0 ) {
3208+
if ( glConfig2.ssao && r_ssao.Get() == Util::ordinal( ssaoMode::SHOW ) ) {
32093209
// clear the screen to show only SSAO
32103210
GL_ClearColor( 1.0, 1.0, 1.0, 1.0 );
32113211
glClear( GL_COLOR_BUFFER_BIT );
@@ -3355,13 +3355,13 @@ void RB_CameraPostFX()
33553355

33563356
gl_cameraEffectsShader->SetUniform_InverseGamma( 1.0 / r_gamma->value );
33573357

3358-
const bool tonemap = r_tonemap.Get() && r_highPrecisionRendering.Get() && glConfig2.textureFloatAvailable;
3358+
const bool tonemap = r_toneMapping.Get() && r_highPrecisionRendering.Get() && glConfig2.textureFloatAvailable;
33593359
if ( tonemap ) {
3360-
vec4_t tonemapParms { r_tonemapContrast.Get(), r_tonemapHighlightsCompressionSpeed.Get() };
3361-
ComputeTonemapParams( tonemapParms[0], tonemapParms[1], r_tonemapHDRMax.Get(),
3362-
r_tonemapDarkAreaPointHDR.Get(), r_tonemapDarkAreaPointLDR.Get(), tonemapParms[2], tonemapParms[3] );
3360+
vec4_t tonemapParms { r_toneMappingContrast.Get(), r_toneMappingHighlightsCompressionSpeed.Get() };
3361+
ComputeTonemapParams( tonemapParms[0], tonemapParms[1], r_toneMappingHDRMax.Get(),
3362+
r_toneMappingDarkAreaPointHDR.Get(), r_toneMappingDarkAreaPointLDR.Get(), tonemapParms[2], tonemapParms[3] );
33633363
gl_cameraEffectsShader->SetUniform_TonemapParms( tonemapParms );
3364-
gl_cameraEffectsShader->SetUniform_TonemapExposure( r_tonemapExposure.Get() );
3364+
gl_cameraEffectsShader->SetUniform_TonemapExposure( r_toneMappingExposure.Get() );
33653365
}
33663366
gl_cameraEffectsShader->SetUniform_Tonemap( tonemap );
33673367

@@ -4726,9 +4726,7 @@ static void RB_RenderView( bool depthPass )
47264726
RB_RenderDrawSurfaces( shaderSort_t::SS_ENVIRONMENT_FOG, shaderSort_t::SS_OPAQUE, DRAWSURFACES_ALL );
47274727
}
47284728

4729-
if ( r_ssao->integer ) {
4730-
RB_RenderSSAO();
4731-
}
4729+
RB_RenderSSAO();
47324730

47334731
if ( r_speeds->integer == Util::ordinal(renderSpeeds_t::RSPEEDS_SHADING_TIMES) )
47344732
{

src/engine/renderer/tr_init.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -209,20 +209,24 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
209209

210210
cvar_t *r_gamma;
211211

212-
Cvar::Cvar<bool> r_tonemap( "r_tonemap", "Use HDR->LDR tonemapping", Cvar::NONE, true );
213-
Cvar::Cvar<float> r_tonemapExposure( "r_tonemapExposure", "Tonemap exposure", Cvar::NONE, 1.0f );
214-
Cvar::Range<Cvar::Cvar<float>> r_tonemapContrast( "r_tonemapContrast", "Makes dark areas light up faster",
212+
Cvar::Cvar<bool> r_toneMapping(
213+
"r_toneMapping", "Use HDR->LDR tonemapping", Cvar::NONE, true );
214+
Cvar::Cvar<float> r_toneMappingExposure(
215+
"r_toneMappingExposure", "Tonemap exposure", Cvar::NONE, 1.0f );
216+
Cvar::Range<Cvar::Cvar<float>> r_toneMappingContrast(
217+
"r_toneMappingContrast", "Makes dark areas light up faster",
215218
Cvar::NONE, 1.6f, 1.0f, 10.0f );
216-
Cvar::Range<Cvar::Cvar<float>> r_tonemapHighlightsCompressionSpeed( "r_tonemapHighlightsCompressionSpeed",
217-
"Highlights saturation",
219+
Cvar::Range<Cvar::Cvar<float>> r_toneMappingHighlightsCompressionSpeed(
220+
"r_toneMappingHighlightsCompressionSpeed", "Highlights saturation",
218221
Cvar::NONE, 0.977f, 0.0f, 10.0f );
219-
Cvar::Range<Cvar::Cvar<float>> r_tonemapHDRMax( "r_tonemapHDRMax", "HDR white point",
222+
Cvar::Range<Cvar::Cvar<float>> r_toneMappingHDRMax(
223+
"r_toneMappingHDRMax", "HDR white point",
220224
Cvar::NONE, 8.0f, 1.0f, 128.0f );
221-
Cvar::Range<Cvar::Cvar<float>> r_tonemapDarkAreaPointHDR( "r_tonemapDarkAreaPointHDR",
222-
"Cut-off for dark area light-up",
225+
Cvar::Range<Cvar::Cvar<float>> r_toneMappingDarkAreaPointHDR(
226+
"r_toneMappingDarkAreaPointHDR", "Cut-off for dark area light-up",
223227
Cvar::NONE, 0.18f, 0.0f, 1.0f );
224-
Cvar::Range<Cvar::Cvar<float>> r_tonemapDarkAreaPointLDR( "r_tonemapDarkAreaPointLDR",
225-
"Convert to this brightness at dark area cut-off",
228+
Cvar::Range<Cvar::Cvar<float>> r_toneMappingDarkAreaPointLDR(
229+
"r_toneMappingDarkAreaPointLDR", "Convert to this brightness at dark area cut-off",
226230
Cvar::NONE, 0.268f, 0.0f, 1.0f );
227231

228232
cvar_t *r_lockpvs;
@@ -316,7 +320,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
316320
Cvar::Cvar<float> r_bloomBlur( "r_bloomBlur", "Bloom strength", Cvar::NONE, 1.0 );
317321
Cvar::Cvar<int> r_bloomPasses( "r_bloomPasses", "Amount of bloom passes in each direction", Cvar::NONE, 2 );
318322
cvar_t *r_FXAA;
319-
cvar_t *r_ssao;
323+
Cvar::Range<Cvar::Cvar<int>> r_ssao( "r_ssao",
324+
"Screen space ambient occlusion: "
325+
"-1: show, 0: disabled, 1: enabled",
326+
Cvar::NONE,
327+
Util::ordinal( ssaoMode::DISABLED ),
328+
Util::ordinal( ssaoMode::SHOW ),
329+
Util::ordinal( ssaoMode::ENABLED ) );
320330

321331
cvar_t *r_evsmPostProcess;
322332

@@ -1246,7 +1256,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p
12461256

12471257
Cvar::Latch( r_bloom );
12481258
r_FXAA = Cvar_Get( "r_FXAA", "0", CVAR_LATCH | CVAR_ARCHIVE );
1249-
r_ssao = Cvar_Get( "r_ssao", "0", CVAR_LATCH | CVAR_ARCHIVE );
1259+
Cvar::Latch( r_ssao );
12501260

12511261
// temporary variables that can change at any time
12521262
r_showImages = Cvar_Get( "r_showImages", "0", CVAR_TEMP );

src/engine/renderer/tr_local.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,12 @@ enum class shaderProfilerRenderSubGroupsMode {
321321
FS_ALL
322322
};
323323

324+
enum class ssaoMode {
325+
SHOW = -1,
326+
DISABLED,
327+
ENABLED,
328+
};
329+
324330
enum class renderSpeeds_t
325331
{
326332
RSPEEDS_GENERAL = 1,
@@ -2964,13 +2970,13 @@ enum class shaderProfilerRenderSubGroupsMode {
29642970
extern cvar_t *r_mode; // video mode
29652971
extern cvar_t *r_gamma;
29662972

2967-
extern Cvar::Cvar<bool> r_tonemap;
2968-
extern Cvar::Cvar<float> r_tonemapExposure;
2969-
extern Cvar::Range<Cvar::Cvar<float>> r_tonemapContrast;
2970-
extern Cvar::Range<Cvar::Cvar<float>> r_tonemapHighlightsCompressionSpeed;
2971-
extern Cvar::Range<Cvar::Cvar<float>> r_tonemapHDRMax;
2972-
extern Cvar::Range<Cvar::Cvar<float>> r_tonemapDarkAreaPointHDR;
2973-
extern Cvar::Range<Cvar::Cvar<float>> r_tonemapDarkAreaPointLDR;
2973+
extern Cvar::Cvar<bool> r_toneMapping;
2974+
extern Cvar::Cvar<float> r_toneMappingExposure;
2975+
extern Cvar::Range<Cvar::Cvar<float>> r_toneMappingContrast;
2976+
extern Cvar::Range<Cvar::Cvar<float>> r_toneMappingHighlightsCompressionSpeed;
2977+
extern Cvar::Range<Cvar::Cvar<float>> r_toneMappingHDRMax;
2978+
extern Cvar::Range<Cvar::Cvar<float>> r_toneMappingDarkAreaPointHDR;
2979+
extern Cvar::Range<Cvar::Cvar<float>> r_toneMappingDarkAreaPointLDR;
29742980

29752981
extern cvar_t *r_nobind; // turns off binding to appropriate textures
29762982
extern cvar_t *r_singleShader; // make most world faces use default shader
@@ -3109,7 +3115,7 @@ enum class shaderProfilerRenderSubGroupsMode {
31093115
extern Cvar::Cvar<float> r_bloomBlur;
31103116
extern Cvar::Cvar<int> r_bloomPasses;
31113117
extern cvar_t *r_FXAA;
3112-
extern cvar_t *r_ssao;
3118+
extern Cvar::Range<Cvar::Cvar<int>> r_ssao;
31133119

31143120
extern cvar_t *r_evsmPostProcess;
31153121

src/engine/renderer/tr_public.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ struct glconfig2_t
152152
bool reflectionMappingAvailable;
153153
bool reflectionMapping;
154154
bool bloom;
155+
bool ssao;
155156
bool motionBlur;
156157
};
157158

src/engine/renderer/tr_shade.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static void EnableAvailableFeatures()
7373

7474
if ( glConfig2.realtimeLightLayers > glConfig2.max3DTextureSize ) {
7575
glConfig2.realtimeLightLayers = glConfig2.max3DTextureSize;
76-
Log::Notice( "r_realtimeLightLayers exceeds maximum 3D texture size, using %i instead", glConfig2.max3DTextureSize );
76+
Log::Notice( "r_realtimeLightLayers exceeds maximum 3D texture size, using %i instead.", glConfig2.max3DTextureSize );
7777
}
7878

7979
Log::Notice( "Using %i dynamic light layers, %i dynamic lights available per tile", glConfig2.realtimeLightLayers,
@@ -98,7 +98,7 @@ static void EnableAvailableFeatures()
9898
{
9999
if ( !glConfig2.textureFloatAvailable )
100100
{
101-
Log::Warn( "Shadow mapping disabled because ARB_texture_float is not available" );
101+
Log::Warn( "Shadow mapping disabled because ARB_texture_float is not available." );
102102
glConfig2.shadowMapping = false;
103103
}
104104
}
@@ -136,14 +136,29 @@ static void EnableAvailableFeatures()
136136
}
137137
}
138138

139-
140139
// Disable features that require deluxe mapping to be enabled.
141140
glConfig2.normalMapping = glConfig2.deluxeMapping && glConfig2.normalMapping;
142141
glConfig2.specularMapping = glConfig2.deluxeMapping && glConfig2.specularMapping;
143142
glConfig2.physicalMapping = glConfig2.deluxeMapping && glConfig2.physicalMapping;
144143

145144
glConfig2.bloom = r_bloom.Get();
146145

146+
glConfig2.ssao = r_ssao.Get() != Util::ordinal( ssaoMode::DISABLED );
147+
148+
static const std::pair<bool*, std::string> ssaoRequiredExtensions[] = {
149+
{ &glConfig2.textureGatherAvailable, "ARB_texture_gather" },
150+
{ &glConfig2.gpuShader4Available, "EXT_gpu_shader4" },
151+
};
152+
153+
for ( auto& e: ssaoRequiredExtensions )
154+
{
155+
if ( !*e.first )
156+
{
157+
Log::Warn( "SSAO disabled because %s is not available.", e.second );
158+
glConfig2.ssao = false;
159+
}
160+
}
161+
147162
/* Motion blur is enabled by cg_motionblur which is a client cvar so we have to build it in all cases,
148163
unless unsupported by the hardware which is the only condition when the engine knows it is not used. */
149164
glConfig2.motionBlur = true;
@@ -369,16 +384,9 @@ static void GLSL_InitGPUShadersOrError()
369384
gl_shaderManager.LoadShader( gl_motionblurShader );
370385
}
371386

372-
if ( r_ssao->integer )
387+
if ( glConfig2.ssao )
373388
{
374-
if ( glConfig2.textureGatherAvailable )
375-
{
376-
gl_shaderManager.LoadShader( gl_ssaoShader );
377-
}
378-
else
379-
{
380-
Log::Warn("SSAO not used because GL_ARB_texture_gather is not available.");
381-
}
389+
gl_shaderManager.LoadShader( gl_ssaoShader );
382390
}
383391

384392
if ( r_FXAA->integer != 0 )

0 commit comments

Comments
 (0)