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))); }
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)); }
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); }); }
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 )); }
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 )); }
private static BRDF PhongBRDF(ColorProbability diffuseProbabilities, ColorProbability specularProbabilities) { return(SumBRDFs(new[] { DiffuseBRDF(diffuseProbabilities), SpecularBRDF(specularProbabilities) })); }