diff --git a/pcsx2/GS/Renderers/Common/GSDevice.cpp b/pcsx2/GS/Renderers/Common/GSDevice.cpp index 88f41ed3e3..732a0a37e4 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.cpp +++ b/pcsx2/GS/Renderers/Common/GSDevice.cpp @@ -378,7 +378,7 @@ void GSDevice::Interlace(const GSVector2i& ds, int field, int mode, float yoffse if (mode == 0 || mode == 2) // weave or blend { // weave first - const float offset = -yoffset * static_cast(field); + const float offset = yoffset * static_cast(field); DoInterlace(m_merge, m_weavebob, field, false, GSConfig.DisableInterlaceOffset ? 0.0f : offset); diff --git a/pcsx2/GS/Renderers/Common/GSRenderer.cpp b/pcsx2/GS/Renderers/Common/GSRenderer.cpp index 02c8bb3232..503ceee777 100644 --- a/pcsx2/GS/Renderers/Common/GSRenderer.cpp +++ b/pcsx2/GS/Renderers/Common/GSRenderer.cpp @@ -308,7 +308,8 @@ bool GSRenderer::Merge(int field) if (m_regs->SMODE2.FFMD && !is_bob && !GSConfig.DisableInterlaceOffset) { - interlace_offset += (tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y) * static_cast(field ^ field2); + // Why 3/4? Mainly to line up the odd scanlines for the interlacing routine. + interlace_offset += ((tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y) * 0.75f) * static_cast(field ^ field2); // We're handling the interlacing offset for upscaling in the merge circuit, rather than in the interlacing shader. offset = 0.0f; }