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