Replaced r_multiSamples with r_antiAliasing to switch between SMAA, MSAA ( and TXAA future)

This commit is contained in:
Robert Beckebans 2015-12-30 12:07:24 +01:00
parent 08f28edfb0
commit e2e4295556
7 changed files with 124 additions and 59 deletions

View file

@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms
const static int NUM_SYSTEM_OPTIONS_OPTIONS = 8; const static int NUM_SYSTEM_OPTIONS_OPTIONS = 8;
extern idCVar r_multiSamples; extern idCVar r_antiAliasing;
extern idCVar r_motionBlur; extern idCVar r_motionBlur;
extern idCVar r_swapInterval; extern idCVar r_swapInterval;
extern idCVar s_volume_dB; extern idCVar s_volume_dB;
@ -389,7 +389,7 @@ idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::LoadData
void idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::LoadData() void idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::LoadData()
{ {
originalFramerate = com_engineHz.GetInteger(); originalFramerate = com_engineHz.GetInteger();
originalAntialias = r_multiSamples.GetInteger(); originalAntialias = r_antiAliasing.GetInteger();
originalMotionBlur = r_motionBlur.GetInteger(); originalMotionBlur = r_motionBlur.GetInteger();
originalVsync = r_swapInterval.GetInteger(); originalVsync = r_swapInterval.GetInteger();
originalBrightness = r_lightScale.GetFloat(); originalBrightness = r_lightScale.GetFloat();
@ -416,14 +416,16 @@ idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::IsRestartRequ
*/ */
bool idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::IsRestartRequired() const bool idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::IsRestartRequired() const
{ {
if( originalAntialias != r_multiSamples.GetInteger() ) if( originalAntialias != r_antiAliasing.GetInteger() )
{ {
return true; return true;
} }
if( originalFramerate != com_engineHz.GetInteger() ) if( originalFramerate != com_engineHz.GetInteger() )
{ {
return true; return true;
} }
return false; return false;
} }
@ -500,10 +502,17 @@ void idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::AdjustFi
case SYSTEM_FIELD_ANTIALIASING: case SYSTEM_FIELD_ANTIALIASING:
{ {
// RB: disabled 16x MSAA // RB: disabled 16x MSAA
static const int numValues = 4; static const int numValues = 5;
static const int values[numValues] = { 0, 2, 4, 8 }; static const int values[numValues] =
{
ANTI_ALIASING_NONE,
ANTI_ALIASING_SMAA_1X,
ANTI_ALIASING_MSAA_2X,
ANTI_ALIASING_MSAA_4X,
ANTI_ALIASING_MSAA_8X
};
// RB end // RB end
r_multiSamples.SetInteger( AdjustOption( r_multiSamples.GetInteger(), values, numValues, adjustAmount ) ); r_antiAliasing.SetInteger( AdjustOption( r_antiAliasing.GetInteger(), values, numValues, adjustAmount ) );
break; break;
} }
case SYSTEM_FIELD_MOTIONBLUR: case SYSTEM_FIELD_MOTIONBLUR:
@ -596,11 +605,26 @@ idSWFScriptVar idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings
return "#str_swf_disabled"; return "#str_swf_disabled";
} }
case SYSTEM_FIELD_ANTIALIASING: case SYSTEM_FIELD_ANTIALIASING:
if( r_multiSamples.GetInteger() == 0 ) {
if( r_antiAliasing.GetInteger() == 0 )
{ {
return "#str_swf_disabled"; return "#str_swf_disabled";
} }
return va( "%dx", r_multiSamples.GetInteger() );
static const int numValues = 5;
static const const char* values[numValues] =
{
"None",
"SMAA 1X",
"MSAA 2X",
"MSAA 4X",
"MSAA 8X"
};
compile_time_assert( numValues == ( ANTI_ALIASING_MSAA_8X + 1 ) );
return values[ r_antiAliasing.GetInteger() ];
}
case SYSTEM_FIELD_MOTIONBLUR: case SYSTEM_FIELD_MOTIONBLUR:
if( r_motionBlur.GetInteger() == 0 ) if( r_motionBlur.GetInteger() == 0 )
{ {
@ -641,7 +665,7 @@ bool idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::IsDataCh
{ {
return true; return true;
} }
if( originalAntialias != r_multiSamples.GetInteger() ) if( originalAntialias != r_antiAliasing.GetInteger() )
{ {
return true; return true;
} }

View file

@ -159,6 +159,7 @@ bool idPlayerProfile::Serialize( idSerializer& ser )
cvarDict.Delete( "r_fullscreen" ); cvarDict.Delete( "r_fullscreen" );
cvarDict.Delete( "r_vidMode" ); cvarDict.Delete( "r_vidMode" );
cvarDict.Delete( "r_multisamples" ); cvarDict.Delete( "r_multisamples" );
cvarDict.Delete( "r_antiAliasing" );
cvarDict.Delete( "com_engineHz" ); cvarDict.Delete( "com_engineHz" );
cvarSystem->SetCVarsFromDict( cvarDict ); cvarSystem->SetCVarsFromDict( cvarDict );
common->StartupVariable( NULL ); common->StartupVariable( NULL );

View file

@ -295,15 +295,22 @@ static void R_CheckCvars()
} }
} }
if( r_multiSamples.IsModified() ) if( r_antiAliasing.IsModified() )
{ {
if( r_multiSamples.GetInteger() > 0 ) switch( r_antiAliasing.GetInteger() )
{ {
glEnable( GL_MULTISAMPLE ); case ANTI_ALIASING_MSAA_2X:
} case ANTI_ALIASING_MSAA_4X:
else case ANTI_ALIASING_MSAA_8X:
{ if( r_antiAliasing.GetInteger() > 0 )
glDisable( GL_MULTISAMPLE ); {
glEnable( GL_MULTISAMPLE );
}
break;
default:
glDisable( GL_MULTISAMPLE );
break;
} }
} }

View file

@ -96,6 +96,15 @@ enum graphicsDriverType_t
GLDRV_OPENGL_MESA, // fear this, it is probably the best to disable GPU skinning and run shaders in GLSL ES 1.0 GLDRV_OPENGL_MESA, // fear this, it is probably the best to disable GPU skinning and run shaders in GLSL ES 1.0
GLDRV_OPENGL_MESA_CORE_PROFILE GLDRV_OPENGL_MESA_CORE_PROFILE
}; };
enum antiAliasingMode_t
{
ANTI_ALIASING_NONE,
ANTI_ALIASING_SMAA_1X,
ANTI_ALIASING_MSAA_2X,
ANTI_ALIASING_MSAA_4X,
ANTI_ALIASING_MSAA_8X
};
// RB end // RB end
// Contains variables specific to the OpenGL configuration being run right now. // Contains variables specific to the OpenGL configuration being run right now.

View file

@ -51,7 +51,7 @@ idCVar r_debugContext( "r_debugContext", "0", CVAR_RENDERER, "Enable various lev
idCVar r_glDriver( "r_glDriver", "", CVAR_RENDERER, "\"opengl32\", etc." ); idCVar r_glDriver( "r_glDriver", "", CVAR_RENDERER, "\"opengl32\", etc." );
idCVar r_skipIntelWorkarounds( "r_skipIntelWorkarounds", "0", CVAR_RENDERER | CVAR_BOOL, "skip workarounds for Intel driver bugs" ); idCVar r_skipIntelWorkarounds( "r_skipIntelWorkarounds", "0", CVAR_RENDERER | CVAR_BOOL, "skip workarounds for Intel driver bugs" );
// RB: disabled 16x MSAA // RB: disabled 16x MSAA
idCVar r_multiSamples( "r_multiSamples", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "number of antialiasing samples", 0, 8 ); idCVar r_antiAliasing( "r_antiAliasing", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, " 0 = None\n 1 = SMAA 1x\n 2 = MSAA 2x\n 3 = MSAA 4x\n 4 = MSAA 8x\n", 0, ANTI_ALIASING_MSAA_8X );
// RB end // RB end
idCVar r_vidMode( "r_vidMode", "0", CVAR_ARCHIVE | CVAR_RENDERER | CVAR_INTEGER, "fullscreen video mode number" ); idCVar r_vidMode( "r_vidMode", "0", CVAR_ARCHIVE | CVAR_RENDERER | CVAR_INTEGER, "fullscreen video mode number" );
idCVar r_displayRefresh( "r_displayRefresh", "0", CVAR_RENDERER | CVAR_INTEGER | CVAR_NOCHEAT, "optional display refresh rate option for vid mode", 0.0f, 240.0f ); idCVar r_displayRefresh( "r_displayRefresh", "0", CVAR_RENDERER | CVAR_INTEGER | CVAR_NOCHEAT, "optional display refresh rate option for vid mode", 0.0f, 240.0f );
@ -730,7 +730,22 @@ void R_SetNewMode( const bool fullInit )
} }
} }
parms.multiSamples = r_multiSamples.GetInteger(); switch( r_antiAliasing.GetInteger() )
{
case ANTI_ALIASING_MSAA_2X:
parms.multiSamples = 2;
break;
case ANTI_ALIASING_MSAA_4X:
parms.multiSamples = 4;
break;
case ANTI_ALIASING_MSAA_8X:
parms.multiSamples = 8;
break;
default:
break;
}
if( i == 0 ) if( i == 0 )
{ {
parms.stereo = ( stereoRender_enable.GetInteger() == STEREO3D_QUAD_BUFFER ); parms.stereo = ( stereoRender_enable.GetInteger() == STEREO3D_QUAD_BUFFER );
@ -776,7 +791,7 @@ safeMode:
r_vidMode.SetInteger( 0 ); r_vidMode.SetInteger( 0 );
r_fullscreen.SetInteger( 1 ); r_fullscreen.SetInteger( 1 );
r_displayRefresh.SetInteger( 0 ); r_displayRefresh.SetInteger( 0 );
r_multiSamples.SetInteger( 0 ); r_antiAliasing.SetInteger( 0 );
} }
} }

View file

@ -4948,7 +4948,7 @@ void RB_PostProcess( const void* data )
// only do the post process step if resolution scaling is enabled. Prevents the unnecessary copying of the framebuffer and // only do the post process step if resolution scaling is enabled. Prevents the unnecessary copying of the framebuffer and
// corresponding full screen quad pass. // corresponding full screen quad pass.
if( rs_enable.GetInteger() == 0 && !r_useFilmicPostProcessEffects.GetBool() ) //&& !r_useSMAA.GetInteger() ) if( rs_enable.GetInteger() == 0 && !r_useFilmicPostProcessEffects.GetBool() && r_antiAliasing.GetInteger() == 0 )
{ {
return; return;
} }
@ -4958,8 +4958,6 @@ void RB_PostProcess( const void* data )
// resolve the scaled rendering to a temporary texture // resolve the scaled rendering to a temporary texture
postProcessCommand_t* cmd = ( postProcessCommand_t* )data; postProcessCommand_t* cmd = ( postProcessCommand_t* )data;
const idScreenRect& viewport = cmd->viewDef->viewport; const idScreenRect& viewport = cmd->viewDef->viewport;
//globalImages->currentRenderImage->CopyFramebuffer( viewport.x1, viewport.y1, viewport.GetWidth(), viewport.GetHeight() );
globalImages->smaaInputImage->CopyFramebuffer( 0, 0, glConfig.nativeScreenWidth, glConfig.nativeScreenHeight );
GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO | GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS ); GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO | GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS );
GL_Cull( CT_TWO_SIDED ); GL_Cull( CT_TWO_SIDED );
@ -4971,10 +4969,9 @@ void RB_PostProcess( const void* data )
GL_Viewport( 0, 0, screenWidth, screenHeight ); GL_Viewport( 0, 0, screenWidth, screenHeight );
GL_Scissor( 0, 0, screenWidth, screenHeight ); GL_Scissor( 0, 0, screenWidth, screenHeight );
GL_SelectTexture( 0 );
globalImages->smaaInputImage->Bind();
// SMAA // SMAA
int aaMode = r_antiAliasing.GetInteger();
if( aaMode == ANTI_ALIASING_SMAA_1X )
{ {
/* /*
* The shader has three passes, chained together as follows: * The shader has three passes, chained together as follows:
@ -4994,6 +4991,8 @@ void RB_PostProcess( const void* data )
* |output| * |output|
*/ */
globalImages->smaaInputImage->CopyFramebuffer( 0, 0, glConfig.nativeScreenWidth, glConfig.nativeScreenHeight );
// set SMAA_RT_METRICS = rpScreenCorrectionFactor // set SMAA_RT_METRICS = rpScreenCorrectionFactor
float screenCorrectionParm[4]; float screenCorrectionParm[4];
screenCorrectionParm[0] = 1.0f / glConfig.nativeScreenWidth; screenCorrectionParm[0] = 1.0f / glConfig.nativeScreenWidth;
@ -5007,6 +5006,9 @@ void RB_PostProcess( const void* data )
glClearColor( 0, 0, 0, 0 ); glClearColor( 0, 0, 0, 0 );
glClear( GL_COLOR_BUFFER_BIT ); glClear( GL_COLOR_BUFFER_BIT );
GL_SelectTexture( 0 );
globalImages->smaaInputImage->Bind();
renderProgManager.BindShader_SMAA_EdgeDetection(); renderProgManager.BindShader_SMAA_EdgeDetection();
RB_DrawElementsWithCounters( &backEnd.unitSquareSurface ); RB_DrawElementsWithCounters( &backEnd.unitSquareSurface );
@ -5051,41 +5053,46 @@ void RB_PostProcess( const void* data )
} }
#if 1 #if 1
globalImages->currentRenderImage->CopyFramebuffer( viewport.x1, viewport.y1, viewport.GetWidth(), viewport.GetHeight() ); if( r_useFilmicPostProcessEffects.GetBool() )
GL_SelectTexture( 1 );
globalImages->grainImage1->Bind();
renderProgManager.BindShader_PostProcess();
const static int GRAIN_SIZE = 128;
// screen power of two correction factor
float screenCorrectionParm[4];
screenCorrectionParm[0] = 1.0f / GRAIN_SIZE;
screenCorrectionParm[1] = 1.0f / GRAIN_SIZE;
screenCorrectionParm[2] = 1.0f;
screenCorrectionParm[3] = 1.0f;
SetFragmentParm( RENDERPARM_SCREENCORRECTIONFACTOR, screenCorrectionParm ); // rpScreenCorrectionFactor
float jitterTexOffset[4];
if( r_shadowMapRandomizeJitter.GetBool() )
{ {
jitterTexOffset[0] = ( rand() & 255 ) / 255.0; globalImages->currentRenderImage->CopyFramebuffer( viewport.x1, viewport.y1, viewport.GetWidth(), viewport.GetHeight() );
jitterTexOffset[1] = ( rand() & 255 ) / 255.0;
GL_SelectTexture( 0 );
globalImages->currentRenderImage->Bind();
GL_SelectTexture( 1 );
globalImages->grainImage1->Bind();
renderProgManager.BindShader_PostProcess();
const static int GRAIN_SIZE = 128;
// screen power of two correction factor
float screenCorrectionParm[4];
screenCorrectionParm[0] = 1.0f / GRAIN_SIZE;
screenCorrectionParm[1] = 1.0f / GRAIN_SIZE;
screenCorrectionParm[2] = 1.0f;
screenCorrectionParm[3] = 1.0f;
SetFragmentParm( RENDERPARM_SCREENCORRECTIONFACTOR, screenCorrectionParm ); // rpScreenCorrectionFactor
float jitterTexOffset[4];
if( r_shadowMapRandomizeJitter.GetBool() )
{
jitterTexOffset[0] = ( rand() & 255 ) / 255.0;
jitterTexOffset[1] = ( rand() & 255 ) / 255.0;
}
else
{
jitterTexOffset[0] = 0;
jitterTexOffset[1] = 0;
}
jitterTexOffset[2] = 0.0f;
jitterTexOffset[3] = 0.0f;
SetFragmentParm( RENDERPARM_JITTERTEXOFFSET, jitterTexOffset ); // rpJitterTexOffset
// Draw
RB_DrawElementsWithCounters( &backEnd.unitSquareSurface );
} }
else
{
jitterTexOffset[0] = 0;
jitterTexOffset[1] = 0;
}
jitterTexOffset[2] = 0.0f;
jitterTexOffset[3] = 0.0f;
SetFragmentParm( RENDERPARM_JITTERTEXOFFSET, jitterTexOffset ); // rpJitterTexOffset
// Draw
RB_DrawElementsWithCounters( &backEnd.unitSquareSurface );
#endif #endif
GL_SelectTexture( 2 ); GL_SelectTexture( 2 );

View file

@ -921,7 +921,7 @@ extern idCVar r_skipIntelWorkarounds; // skip work arounds for Intel driver bug
extern idCVar r_vidMode; // video mode number extern idCVar r_vidMode; // video mode number
extern idCVar r_displayRefresh; // optional display refresh rate option for vid mode extern idCVar r_displayRefresh; // optional display refresh rate option for vid mode
extern idCVar r_fullscreen; // 0 = windowed, 1 = full screen extern idCVar r_fullscreen; // 0 = windowed, 1 = full screen
extern idCVar r_multiSamples; // number of antialiasing samples extern idCVar r_antiAliasing; // anti aliasing mode, SMAA, TXAA, MSAA etc.
extern idCVar r_znear; // near Z clip plane extern idCVar r_znear; // near Z clip plane
@ -1092,6 +1092,8 @@ extern idCVar r_ldrContrastOffset;
extern idCVar r_useFilmicPostProcessEffects; extern idCVar r_useFilmicPostProcessEffects;
extern idCVar r_forceAmbient; extern idCVar r_forceAmbient;
extern idCVar r_antiAliasing;
// RB end // RB end
/* /*