private void ProcessScanLine(ScanLine data, Vertex va, Vertex vb, Vertex vc, Vertex vd, Color4 color) { Vector3 pointA = va.Coordinates; Vector3 pointB = vb.Coordinates; Vector3 pointC = vc.Coordinates; Vector3 pointD = vd.Coordinates; var gradient1 = pointA.Y != pointB.Y ? (data.CurrentY - pointA.Y) / (pointB.Y - pointA.Y) : 1; var gradient2 = pointC.Y != pointD.Y ? (data.CurrentY - pointC.Y) / (pointD.Y - pointC.Y) : 1; int sx = (int)Interpolate(pointA.X, pointB.X, gradient1); int ex = (int)Interpolate(pointC.X, pointD.X, gradient2); double z1 = Interpolate(pointA.Z, pointB.Z, gradient1); double z2 = Interpolate(pointC.Z, pointD.Z, gradient2); ShadingAlgorithm.InterpolateValue(data, gradient1, gradient2); // var snl = Interpolate(data.NormalAndLightDotProductA, data.NormalAndLightDotProductB, gradient1); // var enl = Interpolate(data.NormalAndLightDotProductC, data.NormalAndLightDotProductD, gradient2); for (var x = sx; x < ex; x++) { double gradient = (x - sx) / (double)(ex - sx); var z = Interpolate(z1, z2, gradient); var ndotl = ShadingAlgorithm.ComputeShadingCoefficient(gradient, data); var shaded = color * (float)ndotl; var I = (float)PhongReflection.PhongReflectionValue; var illuminated = new Color4(Check(shaded.Red + I), Check(shaded.Green + I), Check(shaded.Blue + I), shaded.Alpha); DrawPoint(new Vector3(x, data.CurrentY, (float)z), illuminated); } }
public void InterpolateValue(ScanLine scanLineData, float gradient1, float gradient2) { }
public double ComputeShadingCoefficient(double gradient, ScanLine scanLine) { return(scanLine.FaceNormalAndLightDotProduct); }
private void DrawTriangle(Vertex v1, Vertex v2, Vertex v3, Color4 color, Camera camera, Vector3 lightPos) { var data = new ScanLine { }; data.FaceNormal = (v1.Normal + v2.Normal + v3.Normal) / 3; var facePoint = (v1.WorldCoordinates + v2.WorldCoordinates + v3.WorldCoordinates) / 3; data.FaceNormalAndLightDotProduct = ComputeNormalAndLightDotProduct(facePoint, data.FaceNormal, lightPos); PhongReflection.ComputePhongReflection(data.FaceNormal, lightPos, facePoint, camera.Position); Vertex[] sortedVertices = SortVertices(v1, v2, v3); v1 = sortedVertices[0]; v2 = sortedVertices[1]; v3 = sortedVertices[2]; Vector3 p1 = v1.Coordinates; Vector3 p2 = v2.Coordinates; Vector3 p3 = v3.Coordinates; double nl1 = ComputeNormalAndLightDotProduct(v1.WorldCoordinates, v1.Normal, lightPos); double nl2 = ComputeNormalAndLightDotProduct(v2.WorldCoordinates, v2.Normal, lightPos); double nl3 = ComputeNormalAndLightDotProduct(v3.WorldCoordinates, v3.Normal, lightPos); var slopeP1P2 = ComputeInverseSlope(p1, p2); var slopeP1P3 = ComputeInverseSlope(p1, p3); if (slopeP1P2 > slopeP1P3) { for (var y = (int)p1.Y; y <= (int)p3.Y; y++) { data.CurrentY = y; if (y < p2.Y) { data.NormalAndLightDotProductA = nl1; data.NormalAndLightDotProductB = nl3; data.NormalAndLightDotProductC = nl1; data.NormalAndLightDotProductD = nl2; ProcessScanLine(data, v1, v3, v1, v2, color); } else { data.NormalAndLightDotProductA = nl1; data.NormalAndLightDotProductB = nl3; data.NormalAndLightDotProductC = nl2; data.NormalAndLightDotProductD = nl3; ProcessScanLine(data, v1, v3, v2, v3, color); } } } else { for (var y = (int)p1.Y; y <= (int)p3.Y; y++) { data.CurrentY = y; if (y < p2.Y) { data.NormalAndLightDotProductA = nl1; data.NormalAndLightDotProductB = nl2; data.NormalAndLightDotProductC = nl1; data.NormalAndLightDotProductD = nl3; ProcessScanLine(data, v1, v2, v1, v3, color); } else { data.NormalAndLightDotProductA = nl2; data.NormalAndLightDotProductB = nl3; data.NormalAndLightDotProductC = nl1; data.NormalAndLightDotProductD = nl3; ProcessScanLine(data, v2, v3, v1, v3, color); } } } }
public void InterpolateValue(ScanLine scanLineData, float gradient1, float gradient2) { startNormalLightDotProduct = Interpolate(scanLineData.NormalAndLightDotProductA, scanLineData.NormalAndLightDotProductB, gradient1); endNormalLightDotProduct = Interpolate(scanLineData.NormalAndLightDotProductC, scanLineData.NormalAndLightDotProductD, gradient2); }
public double ComputeShadingCoefficient(double gradient, ScanLine scanLine) { return(Interpolate(startNormalLightDotProduct, endNormalLightDotProduct, gradient)); }