apply the interpolation fix to Z interpolation.
more accurate conversion of Z values. but this doesn't fix the horrendous Z-fighting in Pokémon B/W because of course it doesn't >_<
This commit is contained in:
parent
e1926d6e97
commit
cd6ecfc21f
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)-yfactor)) >> 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:
|
||||
|
|
Loading…
Reference in New Issue