/// <summary> /// Get the color for the pixel /// </summary> /// <param name="intersection">The last point of intersection</param> /// <param name="scene">The scene description</param> /// <param name="depth">The current depth of recursion</param> /// <returns>The color of the pixel</returns> private Color Shade(Intersection intersection, Scene scene, int depth) { var direction = intersection.Ray.Direction; var position = (intersection.Distance * intersection.Ray.Direction) + intersection.Ray.Start; var normal = intersection.Element.Normal(position); var reflectDir = direction - (2 * normal.Dot(direction) * normal); var ret = Color.DefaultColor; ret = ret + this.GetNaturalColor(intersection.Element, position, normal, reflectDir, scene); if (depth >= MaxDepth) { return ret + new Color(.5, .5, .5); } return ret + this.GetReflectionColor(intersection.Element, position + 0.001 * reflectDir, normal, reflectDir, scene, depth); }
/// <summary> /// Get the color of an object at a point of intersection /// </summary> /// <param name="intersection">The last point of intersection</param> /// <param name="scene">The scene description</param> /// <param name="depth">The current depth of recursion</param> /// <returns>The color of the pixel</returns> private Color Shade(Intersection intersection, Scene scene, int depth) { // Use Fresnel's law to calculate the direction of the reflected light ray // R = 2(N.L)*N - L // R = reflection direction // N = Normal at point of intersection // L = -I // I = direction of ray var direction = -1 * intersection.Ray.Direction; var position = (intersection.Distance * intersection.Ray.Direction) + intersection.Ray.Start; var normal = intersection.Element.Normal(position); var reflectDir = (2 * normal.Dot(direction) * normal) - direction; var ret = Color.DefaultColor; ret = ret + this.GetNaturalColor(intersection.Element, position, normal, reflectDir, scene); if (depth >= MaxDepth) { return ret + new Color(.5, .5, .5); } // The color at this point is equal to the color of the object + any color reflecting on to it return ret + this.GetReflectionColor(intersection.Element, position + 0.001 * reflectDir, normal, reflectDir, scene, depth); }