diff options
author | Jaklyy <102590697+Jaklyy@users.noreply.github.com> | 2023-08-27 07:28:26 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-27 13:28:26 +0200 |
commit | d7369857c3884cc618c59e9bfde866431c4e1a92 (patch) | |
tree | 72029ae6b5bd525a77e12250625a99e582b400c2 | |
parent | 758b5ee7a181f0e02683b1a4b928cf3e92b03073 (diff) |
Small Fix to Anti-Aliasing + Edge Marking Behavior (#1680)
* Anti-Alias All Edges
Changing a bunch of 0x3s to 0xF since I figure if they're checking the left and right edge they wanna be checking the top and bottom too now that they're gonna be aa'd. also copy that if statement over since otherwise there won't be anything to blend with.
* small optimization
its probably a tiny bit faster?
idk id need actual benchmarking tools.
doesn't break anything at least.
-rw-r--r-- | src/GPU3D_Soft.cpp | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 6975eb4..1bd72a0 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -821,7 +821,7 @@ void SoftRenderer::RenderShadowMaskScanline(RendererPolygon* rp, s32 y) if (!fnDepthTest(DepthBuffer[pixeladdr], z, dstattr)) StencilBuffer[256*(y&0x1) + x] = 1; - if (dstattr & 0x3) + if (dstattr & 0xF) { pixeladdr += BufferSize; if (!fnDepthTest(DepthBuffer[pixeladdr], z, AttrBuffer[pixeladdr])) @@ -847,7 +847,7 @@ void SoftRenderer::RenderShadowMaskScanline(RendererPolygon* rp, s32 y) if (!fnDepthTest(DepthBuffer[pixeladdr], z, dstattr)) StencilBuffer[256*(y&0x1) + x] = 1; - if (dstattr & 0x3) + if (dstattr & 0xF) { pixeladdr += BufferSize; if (!fnDepthTest(DepthBuffer[pixeladdr], z, AttrBuffer[pixeladdr])) @@ -876,7 +876,7 @@ void SoftRenderer::RenderShadowMaskScanline(RendererPolygon* rp, s32 y) if (!fnDepthTest(DepthBuffer[pixeladdr], z, dstattr)) StencilBuffer[256*(y&0x1) + x] = 1; - if (dstattr & 0x3) + if (dstattr & 0xF) { pixeladdr += BufferSize; if (!fnDepthTest(DepthBuffer[pixeladdr], z, AttrBuffer[pixeladdr])) @@ -1053,7 +1053,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) if (!(stencil & 0x1)) pixeladdr += BufferSize; if (!(stencil & 0x2)) - dstattr &= ~0x3; // quick way to prevent drawing the shadow under antialiased edges + dstattr &= ~0xF; // quick way to prevent drawing the shadow under antialiased edges } interpX.SetX(x); @@ -1064,7 +1064,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) // against the pixel underneath if (!fnDepthTest(DepthBuffer[pixeladdr], z, dstattr)) { - if (!(dstattr & 0x3) || pixeladdr >= BufferSize) continue; + if (!(dstattr & 0xF) || pixeladdr >= BufferSize) continue; pixeladdr += BufferSize; dstattr = AttrBuffer[pixeladdr]; @@ -1122,7 +1122,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) PlotTranslucentPixel(pixeladdr, color, z, polyattr, polygon->IsShadow); // blend with bottom pixel too, if needed - if ((dstattr & 0x3) && (pixeladdr < BufferSize)) + if ((dstattr & 0xF) && (pixeladdr < BufferSize)) PlotTranslucentPixel(pixeladdr+BufferSize, color, z, polyattr, polygon->IsShadow); } } @@ -1149,7 +1149,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) if (!(stencil & 0x1)) pixeladdr += BufferSize; if (!(stencil & 0x2)) - dstattr &= ~0x3; // quick way to prevent drawing the shadow under antialiased edges + dstattr &= ~0xF; // quick way to prevent drawing the shadow under antialiased edges } interpX.SetX(x); @@ -1160,7 +1160,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) // against the pixel underneath if (!fnDepthTest(DepthBuffer[pixeladdr], z, dstattr)) { - if (!(dstattr & 0x3) || pixeladdr >= BufferSize) continue; + if (!(dstattr & 0xF) || pixeladdr >= BufferSize) continue; pixeladdr += BufferSize; dstattr = AttrBuffer[pixeladdr]; @@ -1184,6 +1184,23 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) if (alpha == 31) { u32 attr = polyattr | edge; + + if ((RenderDispCnt & (1<<4)) && (attr & 0xF)) + { + // anti-aliasing: all edges are rendered + + // set coverage to avoid black lines from anti-aliasing + attr |= (0x1F << 8); + + // push old pixel down if needed + if (pixeladdr < BufferSize) + { + ColorBuffer[pixeladdr+BufferSize] = ColorBuffer[pixeladdr]; + DepthBuffer[pixeladdr+BufferSize] = DepthBuffer[pixeladdr]; + AttrBuffer[pixeladdr+BufferSize] = AttrBuffer[pixeladdr]; + } + } + DepthBuffer[pixeladdr] = z; ColorBuffer[pixeladdr] = color; AttrBuffer[pixeladdr] = attr; @@ -1194,7 +1211,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) PlotTranslucentPixel(pixeladdr, color, z, polyattr, polygon->IsShadow); // blend with bottom pixel too, if needed - if ((dstattr & 0x3) && (pixeladdr < BufferSize)) + if ((dstattr & 0xF) && (pixeladdr < BufferSize)) PlotTranslucentPixel(pixeladdr+BufferSize, color, z, polyattr, polygon->IsShadow); } } @@ -1224,7 +1241,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) if (!(stencil & 0x1)) pixeladdr += BufferSize; if (!(stencil & 0x2)) - dstattr &= ~0x3; // quick way to prevent drawing the shadow under antialiased edges + dstattr &= ~0xF; // quick way to prevent drawing the shadow under antialiased edges } interpX.SetX(x); @@ -1235,7 +1252,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) // against the pixel underneath if (!fnDepthTest(DepthBuffer[pixeladdr], z, dstattr)) { - if (!(dstattr & 0x3) || pixeladdr >= BufferSize) continue; + if (!(dstattr & 0xF) || pixeladdr >= BufferSize) continue; pixeladdr += BufferSize; dstattr = AttrBuffer[pixeladdr]; @@ -1293,7 +1310,7 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) PlotTranslucentPixel(pixeladdr, color, z, polyattr, polygon->IsShadow); // blend with bottom pixel too, if needed - if ((dstattr & 0x3) && (pixeladdr < BufferSize)) + if ((dstattr & 0xF) && (pixeladdr < BufferSize)) PlotTranslucentPixel(pixeladdr+BufferSize, color, z, polyattr, polygon->IsShadow); } } @@ -1448,7 +1465,7 @@ void SoftRenderer::ScanlineFinalPass(s32 y) // fog for lower pixel // TODO: make this code nicer, but avoid using a loop - if (!(attr & 0x3)) continue; + if (!(attr & 0xF)) continue; pixeladdr += BufferSize; attr = AttrBuffer[pixeladdr]; @@ -1487,7 +1504,7 @@ void SoftRenderer::ScanlineFinalPass(s32 y) u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x; u32 attr = AttrBuffer[pixeladdr]; - if (!(attr & 0x3)) continue; + if (!(attr & 0xF)) continue; u32 coverage = (attr >> 8) & 0x1F; if (coverage == 0x1F) continue; |