Esempio n. 1
0
        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;
                });
            }
        }