From cd6ecfc21ff6a8784f983503cb022514ad142bbe Mon Sep 17 00:00:00 2001 From: StapleButter Date: Fri, 14 Jul 2017 04:49:29 +0200 Subject: [PATCH] apply the interpolation fix to Z interpolation. more accurate conversion of Z values. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit but this doesn't fix the horrendous Z-fighting in Pokémon B/W because of course it doesn't >_< --- src/GPU3D.cpp | 2 +- src/GPU3D_Soft.cpp | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index f4de0c17..f08ee5de 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -882,7 +882,7 @@ void SubmitPolygon() if (FlushAttributes & 0x2) z = wshifted; else if (wshifted) - z = (((s64)vtx->Position[2] * 0x800000) / wshifted) + 0x7FFEFF; + z = ((((s64)vtx->Position[2] * 0x4000) / wshifted) * 0x200) + 0x7FFE00; else z = 0x7FFEFF; diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 56660c13..89f191f9 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -222,24 +222,24 @@ public: s32 InterpolateZ(s32 z0, s32 z1, bool wbuffer) { - if (xdiff == 0) return z0; - - s32 zbase, zdiff; - if (z1 < z0) - { - zbase = z0; - zdiff = z1 - z0 - 1; - } - else - { - zbase = z0; - zdiff = z1 - z0; - } + if (xdiff == 0 || z0 == z1) return z0; if ((wdiff != 0) && wbuffer) - return zbase + (((s64)zdiff * yfactor) >> shift); + { + // perspective-correct approx. interpolation + if (z0 < z1) + return z0 + (((s64)(z1-z0) * yfactor) >> shift); + else + return z1 + (((s64)(z0-z1) * ((1<> shift); + } else - return zbase + (((s64)zdiff * x) / xdiff); + { + // linear interpolation + if (z0 < z1) + return z0 + (((s64)(z1-z0) * x) / xdiff); + else + return z1 + (((s64)(z0-z1) * (xdiff-x)) / xdiff); + } } private: