rasterizer: slightly improve shadow precision
This commit is contained in:
parent
a77cb87edc
commit
c442ae295f
|
@ -311,13 +311,6 @@ struct PolyAttr
|
||||||
|
|
||||||
bool isVisible(bool backfacing)
|
bool isVisible(bool backfacing)
|
||||||
{
|
{
|
||||||
//this was added after adding multi-bit stencil buffer
|
|
||||||
//it seems that we also need to prevent drawing back faces of shadow polys for rendering
|
|
||||||
u32 mode = (val>>4)&0x3;
|
|
||||||
if(mode==3 && polyid !=0) return !backfacing;
|
|
||||||
//another reasonable possibility is that we should be forcing back faces to draw (mariokart doesnt use them)
|
|
||||||
//and then only using a single bit buffer (but a cursory test of this doesnt actually work)
|
|
||||||
|
|
||||||
switch((val>>6)&3) {
|
switch((val>>6)&3) {
|
||||||
case 0: return false;
|
case 0: return false;
|
||||||
case 1: return backfacing;
|
case 1: return backfacing;
|
||||||
|
@ -571,20 +564,12 @@ public:
|
||||||
{
|
{
|
||||||
if(polyAttr.polyid == 0)
|
if(polyAttr.polyid == 0)
|
||||||
{
|
{
|
||||||
//that's right! stencil buffers, despite reports to the contrary, must be more than 1 bit
|
|
||||||
//this is necessary to make these cases work all at once.
|
|
||||||
//1. sm64 (standing near signs and blocks)
|
|
||||||
//2. mariokart (no glitches in shadow shape in kart selector)
|
|
||||||
//3. mariokart (no junk beneath platform in kart selector / no shadow beneath grate floor in bowser stage)
|
|
||||||
//(specifically, the shadows in mario kart are complicated concave shapes)
|
|
||||||
destFragment.stencil++;
|
|
||||||
goto rejected_fragment;
|
goto rejected_fragment;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(destFragment.stencil)
|
if(destFragment.stencil==0)
|
||||||
{
|
{
|
||||||
destFragment.stencil--;
|
|
||||||
goto rejected_fragment;
|
goto rejected_fragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,9 +646,22 @@ public:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//shadow cases: (need multi-bit stencil buffer to cope with all of these, especially the mariokart compelx shadows)
|
||||||
|
//1. sm64 (standing near signs and blocks)
|
||||||
|
//2. mariokart (no glitches in shadow shape in kart selector)
|
||||||
|
//3. mariokart (no junk beneath platform in kart selector / no shadow beneath grate floor in bowser stage)
|
||||||
|
//(specifically, the shadows in mario kart are complicated concave shapes)
|
||||||
|
|
||||||
|
goto done;
|
||||||
depth_fail:
|
depth_fail:
|
||||||
|
if(shader.mode == 3 && polyAttr.polyid == 0)
|
||||||
|
destFragment.stencil++;
|
||||||
rejected_fragment:
|
rejected_fragment:
|
||||||
|
done:
|
||||||
;
|
;
|
||||||
|
|
||||||
|
if(shader.mode == 3 && polyAttr.polyid != 0 && destFragment.stencil)
|
||||||
|
destFragment.stencil--;
|
||||||
}
|
}
|
||||||
|
|
||||||
//draws a single scanline
|
//draws a single scanline
|
||||||
|
|
Loading…
Reference in New Issue