Пример #1
0
        public Material(
            ColorProbability diffuseProbabilities,
            ColorProbability specularProbabilities,
            ColorProbability refractiveProbabilities,
            Probability diffuseReflectionProbability,
            Probability specularReflectionProbability,
            Probability refractionProbability,

            BRDF brdf,
            Light emmissiveLight,
            RefractiveIndex refractiveIndex
            )
        {
            DiffuseProbabilities    = diffuseProbabilities;
            SpecularProbabilities   = specularProbabilities;
            RefractiveProbabilities = refractiveProbabilities;

            DiffuseReflectionProbability  = diffuseReflectionProbability;
            SpecularReflectionProbability = specularReflectionProbability;
            RefractionProbability         = refractionProbability;

            BRDF            = brdf;
            EmmissiveLight  = emmissiveLight;
            RefractiveIndex = refractiveIndex;
        }
        public static Probability ProportionOfAdditions(ColorProbability cpa, ColorProbability cpb)
        {
            var aSum = cpa.Red.Value + cpa.Green.Value + cpa.Blue.Value;
            var bSum = cpb.Red.Value + cpb.Green.Value + cpb.Blue.Value;

            return(new Probability(aSum / (aSum + bSum)));
        }
Пример #3
0
 private static BRDF DiffuseBRDF(ColorProbability colorProbability)
 {
     return((
                Light incomingLight,
                UnitVector incomingVector,
                UnitVector outgoingVector,
                UnitVector surfaceNormal,
                Point surfacePosition
                ) => incomingLight *colorProbability *Vector.DotProduct(outgoingVector, surfaceNormal));
 }
        public static Probability MaxOfAdditions(ColorProbability cpa, ColorProbability cpb)
        {
            var ar = cpa.Red;
            var ag = cpa.Green;
            var ab = cpa.Blue;

            var br = cpb.Red;
            var bg = cpb.Green;
            var bb = cpb.Blue;

            return(Probability.Max(ar + br, ag + bg, ab + bb));
        }
Пример #5
0
        private static BRDF SpecularBRDF(ColorProbability colorProbability)
        {
            return((
                       Light incomingLight,
                       UnitVector incomingVector,
                       UnitVector outgoingVector,
                       UnitVector surfaceNormal,
                       Point surfacePosition
                       ) =>
            {
                var reflectionVector = surfaceNormal * Vector.DotProduct(surfaceNormal * 2.0, incomingVector) - incomingVector;

                return incomingLight * colorProbability * Vector.DotProduct(outgoingVector, reflectionVector);
            });
        }
Пример #6
0
        public static Material CreateDiffuseSpecular(ColorProbability diffuseProbabilities, ColorProbability specularProbabilities)
        {
            var drdgdb   = diffuseProbabilities.SumComponents();
            var srsgsb   = specularProbabilities.SumComponents();
            var pReflect = ColorProbability.MaxOfAdditions(diffuseProbabilities, specularProbabilities);
            var pDiffuse = pReflect * drdgdb / (drdgdb + srsgsb);

            return(new Material(
                       diffuseProbabilities,
                       specularProbabilities,
                       ColorProbability.Zero,
                       pDiffuse,
                       pReflect - pDiffuse,
                       Probability.Zero,
                       PhongBRDF(diffuseProbabilities, specularProbabilities),
                       Light.None,
                       RefractiveIndex.Vacuum
                       ));
        }
Пример #7
0
        public static Material CreateRefractive(
            ColorProbability specularProbabilities,
            ColorProbability refractiveProbabilities,
            RefractiveIndex refractiveIndex
            )
        {
            var sr = specularProbabilities.Red;
            var sg = specularProbabilities.Green;
            var sb = specularProbabilities.Blue;

            var rr = refractiveProbabilities.Red;
            var rg = refractiveProbabilities.Green;
            var rb = refractiveProbabilities.Blue;

            var pReflect = ColorProbability.MaxOfAdditions(specularProbabilities, refractiveProbabilities);
            var pRefract = ColorProbability.ProportionOfAdditions(specularProbabilities, refractiveProbabilities);

            return(new Material(
                       ColorProbability.Zero, specularProbabilities, refractiveProbabilities,
                       Probability.Zero, pReflect, pRefract,
                       PhongBRDF(ColorProbability.Zero, specularProbabilities),
                       Light.None, refractiveIndex
                       ));
        }
Пример #8
0
 private static BRDF PhongBRDF(ColorProbability diffuseProbabilities, ColorProbability specularProbabilities)
 {
     return(SumBRDFs(new[] { DiffuseBRDF(diffuseProbabilities), SpecularBRDF(specularProbabilities) }));
 }