void FillTriangle(Vertex v1, Vertex v2, Vertex v3, Bitmap texture) { var screenSpace = Matrix4Utils.ScreenSpace(Width / 2, Height / 2); Matrix4 iden = Matrix4.Identity; Vertex minYVert = v1.Transform(screenSpace, iden).PerspectiveDivide(); Vertex midYVert = v2.Transform(screenSpace, iden).PerspectiveDivide(); Vertex maxYVert = v3.Transform(screenSpace, iden).PerspectiveDivide(); if (minYVert.TriangleAreaTimesTwo(maxYVert, midYVert) >= 0) { return; } if (maxYVert.Y < midYVert.Y) { Swap(ref maxYVert, ref midYVert); } if (midYVert.Y < minYVert.Y) { Swap(ref midYVert, ref minYVert); } if (maxYVert.Y < midYVert.Y) { Swap(ref maxYVert, ref midYVert); } float a = minYVert.TriangleAreaTimesTwo(maxYVert, midYVert); ScanTriangle(minYVert, midYVert, maxYVert, a >= 0, texture); }