public Color Shade(HitRecord record, Vector3 wi) { Color pixelColor = new Color(0, 0, 0); Vector3 normal = record.SurfaceNormal; normal.Normalize(); wi.Normalize(); float noiseCoefficient = 0f; switch (Noise) { case Noise.Turbulence: noiseCoefficient = Turbulence(record.IntersectionPoint); break; case Noise.Marble: noiseCoefficient = Marble(record.IntersectionPoint); break; case Noise.Bumb: noiseCoefficient = 1f; normal = Bump(record.IntersectionPoint, normal); break; case Noise.None: noiseCoefficient = 1f; break; default: noiseCoefficient = 1f; break; } if (BumpTexture != null) { Color displacementColor = BumpTexture.GetColorFromTexCoordinate(record.HitObject.GetTextudeCoordinates(record)); Vector3 displacementNormal = normal; displacementNormal.X = ((displacementColor.R * 2) - 1); displacementNormal.Y = ((displacementColor.G * 2) - 1); displacementNormal.Z = displacementColor.B; normal = (Vector3.Dot(displacementNormal, normal) < 0) ? -displacementNormal : displacementNormal; } float nDotL = Vector3.Dot(normal, wi); if (nDotL > 0) { Color diffuse; if (Constants.TextureMapping && ColorTexture != null && !(record.HitObject is Plane)) { diffuse = ColorTexture.GetColorFromTexCoordinate(record.HitObject.GetTextudeCoordinates(record)); } else { diffuse = Diffuse; } //add Diffuse Light pixelColor.Append(diffuse.Mult(nDotL).Mult(noiseCoefficient)); pixelColor.Append(pixelColor.Mult(1f - noiseCoefficient)); //Calculate the Blinn halfVector Vector3 h = wi; h = Vector3.Add(h, wi); h.Normalize(); float hDotN = Vector3.Dot(h, normal); if (hDotN > 0) { float pow = (float)Math.Pow(hDotN, Shininess); pixelColor.Append(Specular.Mult(pow)); } } pixelColor.Append(Ambient); pixelColor.Clamp(0f, 1f); return(pixelColor); }