示例#1
0
 public void  InitializeZBuffer(int width, int height)
 {
     _zBuffer  = new float[width, height];
     arguments = new ShadingArguments[width, height];
     Parallel.For(0, width, i =>
     {
         Parallel.For(0, height, j =>
         {
             _zBuffer[i, j]  = float.PositiveInfinity;
             arguments[i, j] = new ShadingArguments(null, Vector4.Zero, Vector4.Zero, Vector4.Zero);
         });
     });
 }
示例#2
0
        public void FinalFill()
        {
            Parallel.For(minX, maxX + 1, i =>
            {
                Parallel.For(minY, maxY + 1, j =>
                {
                    ShadingArguments shadingArguments = arguments[i, j];
                    if (shadingArguments.Camera != null)
                    {
                        Color finalColor = Shader.FragmentShader(shadingArguments.Camera, shadingArguments.Point,
                                                                 shadingArguments.Normal, shadingArguments.IO);

                        DirectBitmap.SetPixel(i, j, finalColor);
                        arguments[i, j] = new ShadingArguments(null, Vector4.Zero, Vector4.Zero, Vector4.Zero);
                        _zBuffer[i, j]  = float.PositiveInfinity;
                    }
                });
            });
        }
示例#3
0
        private FilledTriangle PrepareForFilling(FilledTriangle triangle, Camera camera, int j, int y, int y1, Vector3 barycentricCoords, float zp)
        {
            Vector4 normal = Vector4.Zero;
            Vector4 point  = Vector4.Zero;

            ;
            Vector4 IO = Vector4.One;

            if (Shader.Settings.IsPhong == true)
            {
                normal = CalculateNormal(barycentricCoords, triangle);
                point  = CalculatePoint(barycentricCoords, triangle);
                IO     = triangle.Vertices[0].Color;
            }
            else
            {
                IO = CalculateColor(barycentricCoords, triangle);
            }

            arguments[j, y - 1] = new ShadingArguments(camera, point, normal, IO);

            _zBuffer[j, y1 - 1] = zp;

            if (j <= minX)
            {
                minX = j;
            }
            if (j >= maxX)
            {
                maxX = j;
            }
            if (y - 1 <= minY)
            {
                minY = y - 1;
            }
            if (y - 1 >= maxY)
            {
                maxY = y - 1;
            }
            return(triangle);
        }