Beispiel #1
0
 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);
 }
Beispiel #2
0
    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");
    }
}