Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions trinity/Eve/EveSpaceScene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ void EveSpaceScene::UpdatePostProcessAttributes()
{
m_combinedPostProcess.CreateInstance();
}
m_combinedPostProcess->m_sharpeningStrength = m_sceneDefaultPostProcess ? m_sceneDefaultPostProcess->m_sharpeningStrength : 0.5f;

std::sort(
begin( postProcessAttributes ),
Expand Down
1 change: 1 addition & 0 deletions trinity/PostProcess/Tr2PostProcess2.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ BLUE_CLASS( Tr2PostProcess2 ) :
float GetMipLodBias() const;

float m_exposureAdjustment = 0;
float m_sharpeningStrength = 0.5f;

private:
Tr2PPSignalLossEffectPtr m_signalLoss;
Expand Down
2 changes: 2 additions & 0 deletions trinity/PostProcess/Tr2PostProcess2_Blue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,7 @@ const Be::ClassInfo* Tr2PostProcess2::ExposeToBlue()
MAP_ATTRIBUTE( "colorCorrection", m_colorCorrection, "Accesses the color correction effect", Be::READWRITE | Be::PERSIST )
MAP_ATTRIBUTE( "genericEffect", m_generic, "Accesses the generic effect", Be::READWRITE | Be::PERSIST )

MAP_ATTRIBUTE( "sharpeningStrength", m_sharpeningStrength, "CAS sharpening strength: from 0 to 1", Be::READWRITE | Be::PERSIST )

EXPOSURE_END()
}
55 changes: 32 additions & 23 deletions trinity/PostProcess/Tr2PostProcessRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -678,19 +678,17 @@ void Tr2PostProcessRenderer::Execute(
const auto upscalingInfo = renderContext.GetPrimaryRenderContext().GetUpscalingInfo( upscalingContext ? upscalingContext->GetID() : Tr2UpscalingAL::INVALID_CONTEXT_ID );

auto upscalingEnabled = upscalingInfo.technique != Tr2UpscalingAL::NONE;
bool sharpeningRequired = !upscalingInfo.hasSharpening;
bool sharpeningRequired = postProcess ? !upscalingInfo.hasSharpening && postProcess->m_sharpeningStrength > 0.f : false;

Tr2GpuResourcePool::Texture output;
if( upscalingEnabled )
{
displaySize = { upscalingInfo.displayWidth, upscalingInfo.displayHeight };

output = gpuResourcePool.GetTempTexture( "Final Result", displaySize, destination.GetFormat(), RENDER_TARGET );
}
else
{
output = gpuResourcePool.GetTempTexture( "Final Result", displaySize, destination.GetFormat(), RENDER_TARGET );
}
Tr2GpuResourcePool::Texture output = gpuResourcePool.GetTempTexture(
"Final Result",
displaySize,
sharpeningRequired ? GetUavCompatibleFormat( destination.GetFormat() ) : destination.GetFormat(),
sharpeningRequired ? RENDER_TARGET | Tr2GpuUsage::UNORDERED_ACCESS : RENDER_TARGET );

// Always copy
auto nonMsaaSource = gpuResourcePool.GetTempTexture( "Pre-upscaling Composite", renderSize, sourceBuffer->GetFormat(), RENDER_TARGET );
Expand Down Expand Up @@ -787,12 +785,11 @@ void Tr2PostProcessRenderer::Execute(
}
}

upscaledSource = RenderSharpening( sharpeningRequired, upscaledSource, gpuResourcePool, renderContext );

TEMP_PARAM( m_tonemappingEffect, "BlitCurrent", bloomTexture );
TEMP_PARAM( m_tonemappingEffect, "BlitOriginal", upscaledSource );
TEMP_PARAM( m_tonemappingEffect, "Exposure", GetExposureBuffer( gpuResourcePool ) );
TEMP_PARAM( m_tonemappingEffect, "Histogram", histogramBuffer );
m_tonemappingEffect->SetParameter( MEMOIZED_STRING( "DitherStrength" ), sharpeningRequired ? 0.f : 1.f );

Tr2PPFilmGrainEffect* filmGrain = postProcess != nullptr ? postProcess->GetFilmGrainIfAvailable( m_quality ) : nullptr;

Expand All @@ -801,23 +798,36 @@ void Tr2PostProcessRenderer::Execute(
GPU_REGION( renderContext, "Tonemapping" );
if( upscalingContext && !upscalingInfo.temporal )
{
auto tonemappedOutput = gpuResourcePool.GetTempTexture( "Tonemapping Result", renderSize, destination.GetFormat(), RENDER_TARGET );
auto tonemappedOutput = gpuResourcePool.GetTempTexture( "Tonemapping Result", renderSize, sharpeningRequired ? upscaledSource->GetFormat() : destination.GetFormat(), RENDER_TARGET );

RenderTonemapping( tonemappedOutput, postProcess, renderContext );

output = RenderUpscaling( tonemappedOutput, depthMap, velocity, opaqueColor, scene->GetReprojectionMatrix(), gpuResourcePool, renderContext, upscalingContext, dynamicExposure );
auto upscaled = RenderUpscaling( tonemappedOutput, depthMap, velocity, opaqueColor, scene->GetReprojectionMatrix(), gpuResourcePool, renderContext, upscalingContext, dynamicExposure );
depthMap = {};
velocity = {};
opaqueColor = {};

// need to reset the perframedata so we have the correct viewport size etc
scene->ApplyUpscalingToPerFrameData( displaySize.width, displaySize.height, renderContext );
if( sharpeningRequired )
{
RenderSharpening( postProcess->m_sharpeningStrength, upscaled, output, renderContext );
}
else
{
output = upscaled;
}
}
else if( sharpeningRequired )
{
auto tonemappedOutput = gpuResourcePool.GetTempTexture( "Tonemapping Result", displaySize, upscaledSource->GetFormat(), RENDER_TARGET );
RenderTonemapping( tonemappedOutput, postProcess, renderContext );
RenderSharpening( postProcess->m_sharpeningStrength, tonemappedOutput, output, renderContext );
}
else
{
RenderTonemapping( output, postProcess, renderContext );
}

renderContext.m_esm.SetRenderTarget( 0, destination );
if( filmGrain != nullptr )
{
Expand All @@ -828,6 +838,13 @@ void Tr2PostProcessRenderer::Execute(
Tr2Renderer::DrawTexture( renderContext, output );
}
}
else if( sharpeningRequired )
{
auto tonemappedOutput = gpuResourcePool.GetTempTexture( "Tonemapping Result", displaySize, upscaledSource->GetFormat(), RENDER_TARGET );
RenderTonemapping( tonemappedOutput, postProcess, renderContext );
RenderSharpening( postProcess->m_sharpeningStrength, tonemappedOutput, output, renderContext );
Tr2Renderer::DrawTexture( renderContext, output );
}
else
{
RenderTonemapping( output, postProcess, renderContext );
Expand Down Expand Up @@ -856,27 +873,20 @@ void Tr2PostProcessRenderer::SetupExposureConversion( bool enable, float middleV
}
}

Tr2GpuResourcePool::Texture Tr2PostProcessRenderer::RenderSharpening( bool enable, Tr2GpuResourcePool::Texture& input, Tr2GpuResourcePool& gpuResourcePool, Tr2RenderContext& renderContext )
void Tr2PostProcessRenderer::RenderSharpening( float strength, Tr2GpuResourcePool::Texture& input, Tr2GpuResourcePool::Texture& output, Tr2RenderContext& renderContext )
{
if( !enable )
{
return input;
}
GPU_REGION( renderContext, "CAS Sharpening" );

static const uint32_t CAS_THREAD_GROUP_WORK_REGION_DIM = 16;
auto format = GetUavCompatibleFormat( input->GetFormat() );
auto output = gpuResourcePool.GetTempTexture( "Sharpening Output", input->GetWidth(), input->GetHeight(), format, RENDER_TARGET | Tr2GpuUsage::UNORDERED_ACCESS );

auto renderWidth = output->GetWidth();
auto renderHeight = output->GetHeight();
AF1 outWidth = static_cast<AF1>( renderWidth );
AF1 outHeight = static_cast<AF1>( renderHeight );
float casIntensity = 0.0f;

AMDSharpening::CASConstants casConst;

CasSetup( casConst.const0.u, casConst.const1.u, casIntensity, outWidth, outHeight, outWidth, outHeight );
CasSetup( casConst.const0.u, casConst.const1.u, std::clamp( strength, 0.0f, 1.0f ), outWidth, outHeight, outWidth, outHeight );

m_fidelityFxCasShader->SetParameter( MEMOIZED_STRING( "const0" ), AMDSharpening::AsVector( casConst.const0 ) );
m_fidelityFxCasShader->SetParameter( MEMOIZED_STRING( "const1" ), AMDSharpening::AsVector( casConst.const1 ) );
Expand All @@ -886,7 +896,6 @@ Tr2GpuResourcePool::Texture Tr2PostProcessRenderer::RenderSharpening( bool enabl
auto dispatchX = ( renderWidth + ( CAS_THREAD_GROUP_WORK_REGION_DIM - 1 ) ) / CAS_THREAD_GROUP_WORK_REGION_DIM;
auto dispatchY = ( renderHeight + ( CAS_THREAD_GROUP_WORK_REGION_DIM - 1 ) ) / CAS_THREAD_GROUP_WORK_REGION_DIM;
Tr2Renderer::RunComputeShader( m_fidelityFxCasShader, dispatchX, dispatchY, 1, renderContext );
return output;
}

// Helper function to blur certain channel of a source render target to a destination render target with a blur type (Big/Small)
Expand Down
2 changes: 1 addition & 1 deletion trinity/PostProcess/Tr2PostProcessRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ BLUE_CLASS( Tr2PostProcessRenderer ) :
void SetupExposureConversion( bool enable, float middleValue );

// optional sharpening
Tr2GpuResourcePool::Texture RenderSharpening( bool enable, Tr2GpuResourcePool::Texture& input, Tr2GpuResourcePool& gpuResourcePool, Tr2RenderContext& renderContext );
void RenderSharpening( float strength, Tr2GpuResourcePool::Texture& input, Tr2GpuResourcePool::Texture& output, Tr2RenderContext& renderContext );

// bloom
Tr2GpuResourcePool::Texture RenderBloom( Tr2GpuResourcePool::Texture & dest, Tr2GpuResourcePool & gpuResourcePool, Tr2RenderContext & renderContext, Tr2PPBloomEffect * bloom, Tr2PPDynamicExposureEffect * dynamicExposure );
Expand Down