Improve gamma pass and cache viewport size

This commit is contained in:
Chase Cooper 2026-03-07 00:56:46 -05:00
parent c2bd085547
commit 3e3d0384e2
3 changed files with 22 additions and 16 deletions

View file

@ -45,6 +45,8 @@ private:
bool m_wineMode = false; bool m_wineMode = false;
D3D11_VIEWPORT m_customViewport; D3D11_VIEWPORT m_customViewport;
bool m_useCustomViewport = false; bool m_useCustomViewport = false;
UINT m_gammaTexWidth = 0;
UINT m_gammaTexHeight = 0;
struct GammaCBData struct GammaCBData
{ {

View file

@ -937,7 +937,7 @@ float GameRenderer::ComputeGammaFromSlider(float slider0to100)
slider = min(slider, 100.0f); slider = min(slider, 100.0f);
if (slider > 50.0f) if (slider > 50.0f)
return 1.0f + (slider - 50.0f) / 50.0f * 1.2f; // 1.0 -> 2.2 return 1.0f + (slider - 50.0f) / 50.0f * 0.5f; // 1.0 -> 1.5
else else
return 1.0f - (50.0f - slider) / 50.0f * 0.5f; // 1.0 -> 0.5 return 1.0f - (50.0f - slider) / 50.0f * 0.5f; // 1.0 -> 0.5
} }

View file

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