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); }); }); }
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; } }); }); }
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); }