Improve gamma shader parity - fixes #611 (#790)

* Call gamma post process after `ui.render` #611

* Fixed "washed out" look.

* Improve gamma pass and cache viewport size
This commit is contained in:
ModMaker101
2026-03-07 04:00:38 -05:00
committed by GitHub
parent cc85ecf05a
commit e754bad17e
9 changed files with 90 additions and 49 deletions

View File

@@ -28,7 +28,11 @@ const char* PostProcesser::g_gammaPSCode =
"float4 main(float4 pos : SV_Position, float2 uv : TEXCOORD0) : SV_Target\n"
"{\n"
" float4 color = sceneTex.Sample(sceneSampler, uv);\n"
" color.rgb = pow(max(color.rgb, 0.0), 1.0 / gamma);\n"
"\n"
" color.rgb = max(color.rgb, 0.0);\n"
"\n"
" color.rgb = pow(color.rgb, 1.0 / gamma);\n"
"\n"
" return color;\n"
"}\n";
@@ -75,6 +79,9 @@ void PostProcesser::Init()
pBackBuffer->GetDesc(&bbDesc);
pBackBuffer->Release();
m_gammaTexWidth = bbDesc.Width;
m_gammaTexHeight = bbDesc.Height;
DXGI_FORMAT texFormat = bbDesc.Format;
if (m_wineMode)
{
@@ -219,7 +226,9 @@ void PostProcesser::Apply() const
if (FAILED(hr))
return;
ctx->CopyResource(m_pGammaOffscreenTex, pBackBuffer);
D3D11_BOX srcBox = { 0, 0, 0, m_gammaTexWidth, m_gammaTexHeight, 1 };
ctx->CopySubresourceRegion(m_pGammaOffscreenTex, 0, 0, 0, 0, pBackBuffer, 0, &srcBox);
pBackBuffer->Release();
D3D11_MAPPED_SUBRESOURCE mapped;
const D3D11_MAP mapType = m_wineMode ? D3D11_MAP_WRITE_NO_OVERWRITE : D3D11_MAP_WRITE_DISCARD;
@@ -236,16 +245,12 @@ void PostProcesser::Apply() const
ctx->OMGetRenderTargets(1, &oldRTV, &oldDSV);
UINT numViewports = 1;
D3D11_VIEWPORT oldViewport;
D3D11_VIEWPORT oldViewport = {};
ctx->RSGetViewports(&numViewports, &oldViewport);
ID3D11RenderTargetView* bbRTV = g_pRenderTargetView;
ctx->OMSetRenderTargets(1, &bbRTV, nullptr);
D3D11_TEXTURE2D_DESC bbDesc;
pBackBuffer->GetDesc(&bbDesc);
pBackBuffer->Release();
D3D11_VIEWPORT vp;
if (m_useCustomViewport)
{
@@ -253,8 +258,8 @@ void PostProcesser::Apply() const
}
else
{
vp.Width = static_cast<FLOAT>(bbDesc.Width);
vp.Height = static_cast<FLOAT>(bbDesc.Height);
vp.Width = static_cast<FLOAT>(m_gammaTexWidth);
vp.Height = static_cast<FLOAT>(m_gammaTexHeight);
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
@@ -313,7 +318,8 @@ void PostProcesser::CopyBackbuffer()
if (FAILED(hr))
return;
ctx->CopyResource(m_pGammaOffscreenTex, pBackBuffer);
D3D11_BOX srcBox = { 0, 0, 0, m_gammaTexWidth, m_gammaTexHeight, 1 };
ctx->CopySubresourceRegion(m_pGammaOffscreenTex, 0, 0, 0, 0, pBackBuffer, 0, &srcBox);
pBackBuffer->Release();
}
@@ -342,7 +348,7 @@ void PostProcesser::ApplyFromCopied() const
ctx->OMGetRenderTargets(1, &oldRTV, &oldDSV);
UINT numViewports = 1;
D3D11_VIEWPORT oldViewport;
D3D11_VIEWPORT oldViewport = {};
ctx->RSGetViewports(&numViewports, &oldViewport);
ID3D11RenderTargetView* bbRTV = g_pRenderTargetView;
@@ -355,10 +361,8 @@ void PostProcesser::ApplyFromCopied() const
}
else
{
D3D11_TEXTURE2D_DESC texDesc;
m_pGammaOffscreenTex->GetDesc(&texDesc);
vp.Width = static_cast<FLOAT>(texDesc.Width);
vp.Height = static_cast<FLOAT>(texDesc.Height);
vp.Width = static_cast<FLOAT>(m_gammaTexWidth);
vp.Height = static_cast<FLOAT>(m_gammaTexHeight);
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;