protected override Color3 Indirect( Point WorldHit, Point ModelHit,
                                            Vector WorldViewer, Vector ModelViewer,
                                            SurfaceNormal Normal,
                                            Random Rng, RayTracerBase Tracer )
        {
            if ( Tracer == null )
            {
                return Color3.Black;
            }

            Vector ReverseViewer = -WorldViewer;
            Vector WorldNormal = Normal.WorldNormal;

            BrdfSample Sample = brdf.Sample( ReverseViewer, WorldNormal, Rng );

            if ( Sample.Reflectance.IsBlack() || Sample.Pdf <= 0.0f )
            {
                return Color3.Black;
            }

            Color3 Reflectance = Sample.Reflectance * Math.Abs( Vector.DotProduct( Sample.Outgoing, WorldNormal ) ) / Sample.Pdf;

            float RouletteProbability = Math.Max( Math.Max( Sample.Reflectance.R, Sample.Reflectance.G ), Sample.Reflectance.B );

            return Reflectance * Tracer.Trace( new Ray( WorldHit, Sample.Outgoing ), RouletteProbability );
        }
        protected override Color3 Indirect( Point WorldHit, Point ModelHit,
                                            Vector WorldViewer, Vector ModelViewer,
                                            SurfaceNormal Normal,
                                            Random Rng, RayTracerBase Tracer )
        {
            if ( Tracer == null || Specular.IsBlack() )
            {
                return Color3.Black;
            }

            Vector ReflectedDirection = IrisMath.Reflect( WorldViewer, Normal.NormalizedWorldNormal );
            return Specular * Tracer.Trace( new Ray( WorldHit, ReflectedDirection ) );
        }
        protected override Color3 Indirect( Point WorldHit, Point ModelHit,
                                            Vector WorldViewer, Vector ModelViewer,
                                            SurfaceNormal Normal,
                                            Random Rng, RayTracerBase Tracer )
        {
            if ( Tracer == null || Color.IsBlack() )
            {
                return Color3.Black;
            }

            Vector Direction = IrisMath.CosineSampleHemisphere( Normal.NormalizedWorldNormal, Rng );
            return Color * Tracer.Trace( new Ray( WorldHit, Direction ), RouletteProbability );
        }