Fixed OpenGL backend, Added r_usePBR to toggle Image Based Lighting

This commit is contained in:
Robert Beckebans 2019-11-22 18:25:33 +01:00
parent 527b1fbfd5
commit fa3df4e2d2
9 changed files with 77 additions and 33 deletions

View file

@ -224,7 +224,7 @@ void main( PS_IN fragment, out PS_OUT result )
}
shadow *= stepSize;
#else
#elif 1
const float2 poissonDisk[12] = float2[](
float2(0.6111618, 0.1050905),
@ -269,7 +269,9 @@ void main( PS_IN fragment, out PS_OUT result )
shadow *= stepSize;
//float shadow = texture( samp5, shadowTexcoord.xywz );
#else
float shadow = texture( samp5, shadowTexcoord.xywz );
#endif

View file

@ -200,7 +200,7 @@ static srfTriangles_t* R_CreateInteractionLightTris( const idRenderEntityLocal*
// it is debatable if non-shadowing lights should light back faces. we aren't at the moment
// RB: now we do with r_useHalfLambert, so don't cull back faces if we have smooth shadowing enabled
if( r_lightAllBackFaces.GetBool() || light->lightShader->LightEffectsBackSides()
|| shader->ReceivesLightingOnBackSides() || ent->parms.noSelfShadow || ent->parms.noShadow || ( r_useHalfLambertLighting.GetInteger() && r_useShadowMapping.GetBool() ) )
|| shader->ReceivesLightingOnBackSides() || ent->parms.noSelfShadow || ent->parms.noShadow || r_usePBR.GetBool() || ( r_useHalfLambertLighting.GetInteger() && r_useShadowMapping.GetBool() ) )
{
includeBackFaces = true;
}

View file

@ -1491,10 +1491,23 @@ void idRenderBackend::CheckCVars()
}
}
if( r_useHDR.IsModified() || r_useHalfLambertLighting.IsModified() )
if( r_usePBR.IsModified() || r_useHDR.IsModified() || r_useHalfLambertLighting.IsModified() )
{
bool needShaderReload = false;
if( r_usePBR.GetBool() && r_useHalfLambertLighting.GetBool() )
{
r_useHalfLambertLighting.SetBool( false );
needShaderReload = true;
}
needShaderReload |= r_useHDR.IsModified();
r_usePBR.ClearModified();
r_useHDR.ClearModified();
r_useHalfLambertLighting.ClearModified();
renderProgManager.KillAllShaders();
renderProgManager.LoadAllShaders();
}
@ -1598,6 +1611,8 @@ STENCIL SHADOW RENDERING
idRenderBackend::DrawStencilShadowPass
=====================
*/
extern idCVar r_useStencilShadowPreload;
void idRenderBackend::DrawStencilShadowPass( const drawSurf_t* drawSurf, const bool renderZPass )
{
if( renderZPass )

View file

@ -213,7 +213,7 @@ void idRenderProgManager::LoadShader( shader_t& shader )
idStr hlslCode( hlslFileBuffer );
idStr programHLSL = StripDeadCode( hlslCode, inFile, compileMacros, shader.builtin );
programGLSL = ConvertCG2GLSL( programHLSL, inFile.c_str(), shader.stage, programUniforms, false, hasGPUSkinning );
programGLSL = ConvertCG2GLSL( programHLSL, inFile.c_str(), shader.stage, programUniforms, false, hasGPUSkinning, shader.vertexLayout );
fileSystem->WriteFile( outFileHLSL, programHLSL.c_str(), programHLSL.Length(), "fs_savepath" );
fileSystem->WriteFile( outFileGLSL, programGLSL.c_str(), programGLSL.Length(), "fs_savepath" );

View file

@ -1992,6 +1992,16 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
const bool hdrIsActive = ( r_useHDR.GetBool() && globalFramebuffers.hdrFBO != NULL && globalFramebuffers.hdrFBO->IsBound() );
if( !fillGbuffer )
{
if( r_forceAmbient.GetFloat() <= 0 || r_skipAmbient.GetBool() )
{
// clear gbuffer
GL_Clear( true, false, false, 0, 0.0f, 0.0f, 0.0f, 1.0f, false );
return;
}
}
/*
if( fillGbuffer )
{
@ -2034,8 +2044,15 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
idVec4 ambientColor;
float ambientBoost = 1.0f;
ambientBoost += r_useSSAO.GetBool() ? 0.2f : 0.0f;
ambientBoost *= r_useHDR.GetBool() ? 1.1f : 1.0f;
if( !r_usePBR.GetBool() )
{
ambientBoost += r_useSSAO.GetBool() ? 0.2f : 0.0f;
ambientBoost *= r_useHDR.GetBool() ? 1.1f : 1.0f;
}
bool useIBL = r_usePBR.GetBool() && !fillGbuffer;
ambientColor.x = r_forceAmbient.GetFloat() * ambientBoost;
ambientColor.y = r_forceAmbient.GetFloat() * ambientBoost;
ambientColor.z = r_forceAmbient.GetFloat() * ambientBoost;
@ -2101,33 +2118,36 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
else
#endif
{
#if 1
// draw Quake 4 style ambient
if( drawSurf->jointCache )
if( useIBL )
{
renderProgManager.BindShader_ImageBasedLightingSkinned();
// draw Quake 4 style ambient
if( drawSurf->jointCache )
{
renderProgManager.BindShader_ImageBasedLightingSkinned();
}
else
{
renderProgManager.BindShader_ImageBasedLighting();
}
GL_SelectTexture( INTERACTION_TEXUNIT_AMBIENT_CUBE1 );
globalImages->defaultUACIrradianceCube->Bind();
GL_SelectTexture( INTERACTION_TEXUNIT_SPECULAR_CUBE1 );
globalImages->defaultUACRadianceCube->Bind();
}
else
{
renderProgManager.BindShader_ImageBasedLighting();
// draw Quake 4 style ambient
if( drawSurf->jointCache )
{
renderProgManager.BindShader_AmbientLightingSkinned();
}
else
{
renderProgManager.BindShader_AmbientLighting();
}
}
GL_SelectTexture( INTERACTION_TEXUNIT_AMBIENT_CUBE1 );
globalImages->defaultUACIrradianceCube->Bind();
GL_SelectTexture( INTERACTION_TEXUNIT_SPECULAR_CUBE1 );
globalImages->defaultUACRadianceCube->Bind();
#else
// draw Quake 4 style ambient
if( drawSurf->jointCache )
{
renderProgManager.BindShader_AmbientLightingSkinned();
}
else
{
renderProgManager.BindShader_AmbientLighting();
}
#endif
}
}
@ -2292,7 +2312,7 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
// draw any previous interaction
if( inter.bumpImage != NULL )
{
DrawSingleInteraction( &inter, !fillGbuffer );
DrawSingleInteraction( &inter, useIBL );
}
inter.bumpImage = surfaceStage->texture.image;
inter.diffuseImage = NULL;
@ -2313,7 +2333,7 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
// draw any previous interaction
if( inter.diffuseImage != NULL )
{
DrawSingleInteraction( &inter, !fillGbuffer );
DrawSingleInteraction( &inter, useIBL );
}
inter.diffuseImage = surfaceStage->texture.image;
@ -2333,7 +2353,7 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
// draw any previous interaction
if( inter.specularImage != NULL )
{
DrawSingleInteraction( &inter, !fillGbuffer );
DrawSingleInteraction( &inter, useIBL );
}
inter.specularImage = surfaceStage->texture.image;
inter.vertexColor = surfaceStage->vertexColor;
@ -2345,7 +2365,7 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr
}
// draw the final interaction
DrawSingleInteraction( &inter, !fillGbuffer );
DrawSingleInteraction( &inter, useIBL );
renderLog.CloseBlock();
}

View file

@ -1118,6 +1118,8 @@ extern idCVar r_ssaoDebug;
extern idCVar r_ssaoFiltering;
extern idCVar r_useHierarchicalDepthBuffer;
extern idCVar r_usePBR;
extern idCVar r_exposure;
// RB end

View file

@ -230,6 +230,7 @@ void idRenderProgManager::Init()
r_useHalfLambertLighting.ClearModified();
r_useHDR.ClearModified();
r_usePBR.ClearModified();
uniforms.SetNum( RENDERPARM_TOTAL, vec4_zero );

View file

@ -839,11 +839,13 @@ private:
progId( INVALID_PROGID ),
shaderFeatures( 0 ),
builtin( false ),
vertexLayout( LAYOUT_DRAW_VERT ),
uniformArray( -1 ) {}
idStr name;
idStr nameOutSuffix;
uint32 shaderFeatures; // RB: Cg compile macros
bool builtin; // RB: part of the core shaders built into the executable
vertexLayoutType_t vertexLayout;
rpStage_t stage;
uint progId;
int uniformArray;

View file

@ -283,6 +283,8 @@ idCVar r_ssaoDebug( "r_ssaoDebug", "0", CVAR_RENDERER | CVAR_INTEGER, "" );
idCVar r_ssaoFiltering( "r_ssaoFiltering", "1", CVAR_RENDERER | CVAR_BOOL, "" );
idCVar r_useHierarchicalDepthBuffer( "r_useHierarchicalDepthBuffer", "1", CVAR_RENDERER | CVAR_BOOL, "" );
idCVar r_usePBR( "r_usePBR", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "use Physically Based Rendering inlcuding Image Based Lighting" );
idCVar r_exposure( "r_exposure", "0.5", CVAR_ARCHIVE | CVAR_RENDERER | CVAR_FLOAT, "HDR exposure or LDR brightness [0.0 .. 1.0]", 0.0f, 1.0f );
// RB end