public GpuImplSoft() { TriangleRasterizer = new TriangleRasterizer <Triangle>((int y, ref RasterizerResult a, ref RasterizerResult b, ref Triangle triangle) => { //Console.WriteLine($"{a.Ratio} {b.Ratio} {triangle.P0.Color} : {triangle.P1.IColor}"); var P0 = triangle.P0; var P1 = triangle.P1; var P2 = triangle.P2; var C0 = P0.Color; var C1 = P1.Color; var C2 = P2.Color; //Console.WriteLine(triangle.P0.T); if (VertexType.HasTexture) { var texA = LerpRatios(P0.T, P1.T, P2.T, a.Ratios); var texB = LerpRatios(P0.T, P1.T, P2.T, b.Ratios); //Console.WriteLine($"{P0.T} {P1.T} {P2.T} {a.Ratios} {b.Ratios} {texA} {texB}"); DrawRowFastTextureLookup(y, a.X, b.X, texA, texB); } else if (C0 == C1 && C0 == C2) { DrawRowFastSingleColor(y, a.X, b.X, triangle.P0.RgbaColor); } else { var colorA = LerpRatios(C0, C1, C2, a.Ratios).Clamp(0, 1); var colorB = LerpRatios(C0, C1, C2, b.Ratios).Clamp(0, 1); //Console.WriteLine($"{a.Ratio0}, {a.Ratio1}, {a.Ratio2}"); DrawRowFastInterpolateTwoColors(y, a.X, b.X, colorA, colorB); } }, 0, 271, 0, 511); }
public void TestRasterization() { const int dimension = 192; var buffer = new byte[dimension * dimension]; Span <Vector2> vertices = stackalloc Vector2[3] { new Vector2(5.5f, 10.2f), new Vector2(5.5f + 16, 10.2f + 5.0f), new Vector2(5.5f - 5, 10.2f + 5.0f) }; TriangleRasterizer.Rasterize(dimension, dimension, buffer, vertices, 0xFF); using var image = Image.LoadPixelData <L8>(buffer, dimension, dimension); ImageComparison.AssertImagesEqual(image, "FogOfWar/tesselated_expected.png"); } }