예제 #1
0
        private void DrawClipTriangle(Triangle tri, DirectBitmap b, float[] depthBuffer, Vector3 normal, FragmentShaderDelegate frag)
        {
            Fragment fragment = new Fragment();
            float    zBuf;
            int      padding = 5;
            int      minX = int.MaxValue, maxX = int.MinValue, minY = int.MaxValue, maxY = int.MinValue;

            foreach (Vector2 v in tri.Points) //Get bounding box
            {
                if (v.x > maxX)
                {
                    maxX = (int)(v.x + 1);//Round up
                }
                if (v.x < minX)
                {
                    minX = (int)(v.x);
                }
                if (v.y > maxY)
                {
                    maxY = (int)(v.y + 1);
                }
                if (v.y < minY)
                {
                    minY = (int)(v.y);
                }
            }
            if (maxX > camera.renderWidth)
            {
                maxX = camera.renderWidth;
            }
            if (minX < 0)
            {
                minX = 0;
            }
            if (maxY > camera.renderHeight)
            {
                maxY = camera.renderHeight;
            }
            if (minY < 0)
            {
                minY = 0;
            }
            Vector2 pt = new Vector2();

            maxX = (maxX + padding > camera.renderWidth - 1 ? camera.renderWidth - 1 : maxX + padding);
            maxY = (maxY + padding > camera.renderHeight - 1 ? camera.renderHeight - 1 : maxY + padding);
            minX = (minX - padding < 0 ? 0 : minX - padding);
            minY = (minY - padding < 0 ? 0 : minY - padding);
            float z;

            for (int i = minX; i < maxX; i++)
            {
                for (int j = minY + 1; j <= maxY; j++)
                {
                    pt.x = i + 0.5f;
                    pt.y = j + 0.5f;
                    Vector3 baryCoords = tri.GetBarycentricCoordinates(pt, out bool inside);
                    if (inside)
                    {
                        //Do some interpolation with the z-buffer here
                        z    = tri.ZAt(baryCoords);
                        zBuf = depthBuffer[(i) + (camera.renderHeight * (camera.renderHeight - j))];

                        if (zBuf == 0 || z < zBuf)
                        {
                            fragment.uv         = tri.UVAt(baryCoords);
                            fragment.normal     = tri.NormalAt(baryCoords);
                            fragment.color      = Color.HotPink;
                            fragment.triangle   = tri;
                            fragment.faceNormal = normal;
                            fragment.camera     = camera;
                            fragment.thisMesh   = mesh;
                            fragment.x          = i;
                            fragment.y          = j;
                            fragment.z          = z;
                            frag(fragment);


                            b.SetPixel(fragment.x, camera.renderHeight - fragment.y, fragment.color);
                            depthBuffer[(fragment.x) + (camera.renderHeight * (camera.renderHeight - fragment.y))] = fragment.z;
                        }
                    }
                }
            }
        }
예제 #2
0
        public void SmoothShader(Fragment f)
        {
            float fac = Vector3.Dot(f.normal, -f.camera.transform.Forward);

            f.color = Color.FromArgb(albedo.A, (byte)(fac * albedo.R), (byte)(fac * albedo.G), (byte)(fac * albedo.B));
        }