public void Draw(Buffer <float> depth, Buffer <vec4> buffer, T[] vertices, int[] triangles) { var shaded = vertices.Select(x => vertexShader.ShadeVertex(x)).ToArray(); for (int i = 0; i < triangles.Length; i += 3) { var a = shaded[triangles[i]]; var b = shaded[triangles[i + 1]]; var c = shaded[triangles[i + 2]]; var screenA = ClipSpaceToScreenSpace(buffer.Width, buffer.Height, a.ClipPos); var screenB = ClipSpaceToScreenSpace(buffer.Width, buffer.Height, b.ClipPos); var screenC = ClipSpaceToScreenSpace(buffer.Width, buffer.Height, c.ClipPos); Rasterization.FillTriangle(screenA, screenB, screenC, buffer.Width, buffer.Height, (p, bcc) => { var newDepth = ((bcc.x * a.ClipPos) + (bcc.y * b.ClipPos) + (bcc.z * c.ClipPos)).z; var oldDepth = depth[p.x, p.y]; if (newDepth < oldDepth) { return; } depth[p.x, p.y] = newDepth; var vertexData = a.Combine(b, c, bcc.x, bcc.y, bcc.z); var color = fragmentShader.ShadeFragment(vertexData); buffer[p.x, p.y] = color; }); } }