예제 #1
0
 public WavelengthCluster(SpectralDistribution spd, float[] ls)
 {
     LambdaStart = ls[0];
     Values = new float[ls.Length];
     Lambdas = ls.ToArray();
     spd.Sample(ls.Length, ls, Values);
 }
예제 #2
0
 public void SetDistributions(ref RgbSpectrum kd, ref RgbSpectrum ks, ref RgbSpectrum kr, ref RgbSpectrum ke, ref RgbSpectrum kt)
 {
     this.Kd = ColorFactory.CreateRegularSpd(ref kd, SpectrumType.Reflectance);
     this.Ks = ColorFactory.CreateRegularSpd(ref ks, SpectrumType.Reflectance);
     this.Kr = ColorFactory.CreateRegularSpd(ref kr, SpectrumType.Reflectance);
     this.Kt = ColorFactory.CreateRegularSpd(ref kt, SpectrumType.Reflectance);
     this.Ke = ColorFactory.CreateRegularSpd(ref ke, SpectrumType.Reflectance);
 }
예제 #3
0
 public void SetMaterialInfo(MaterialInfo mi)
 {
     if (mi == null)
     {
         var col = new RgbSpectrum(0.5f);
         this.Kd = ColorFactory.CreateRegularSpd(ref col, SpectrumType.Reflectance);
         return;
     }
     this.MaterialInfo = mi;
     this.Kd = ColorFactory.CreateRegularSpd(ref mi.Kd, SpectrumType.Reflectance);
     this.Ks = ColorFactory.CreateRegularSpd(ref mi.Ks, SpectrumType.Reflectance);
     this.Kr = ColorFactory.CreateRegularSpd(ref mi.Kr, SpectrumType.Reflectance);
     this.Kt = ColorFactory.CreateRegularSpd(ref mi.Kt, SpectrumType.Reflectance);
     this.Ke = ColorFactory.CreateRegularSpd(ref mi.Ke, SpectrumType.Reflectance);
 }
예제 #4
0
        public static RgbSpectrum ToRgb(SpectralDistribution spd)
        {
            var c = new RgbSpectrum();
            float[] vc = new float[SampledSpectrum.nCIE];

            spd.Sample(SampledSpectrum.nCIE, SampledSpectrum.CIE_lambda, vc);
            for (var i = 0; i < SampledSpectrum.nCIE; ++i)
            {
                float v = spd.Sample(i + SampledSpectrum.CIEstart);
                vc[i] = v;
            }
            /*
            for (var i = 0; i < SampledSpectrum.nCIE; ++i)
            {
                float v = spd.Sample(i + SampledSpectrum.CIEstart);
                c.c1 += v * SampledSpectrum.CIE_X[i];
                c.c2 += v * SampledSpectrum.CIE_Y[i];
                c.c3 += v * SampledSpectrum.CIE_Z[i];
            }*/
            c = new RgbSpectrum(
            SSE.VectorDot(vc, SampledSpectrum.CIE_X, 468),
            SSE.VectorDot(vc, SampledSpectrum.CIE_Y, 468),
            SSE.VectorDot(vc, SampledSpectrum.CIE_Z, 468));

            var xyz = (c / 683f);

            float[] rgb;
            SampledSpectrum.XYZToRGB(xyz.ToArray(), out rgb);
            c = new RgbSpectrum(rgb);
            //res.GammaCorrection();
            return c;
        }
예제 #5
0
        public RgbSpectrum ToXyz(SpectralDistribution spd)
        {
            var c = new RgbSpectrum();
            for (var i = 0; i < SampledSpectrum.nCIE; ++i)
            {
                float v = spd.Sample(i + SampledSpectrum.CIEstart);
                c.c1 += v * SampledSpectrum.CIE_X[i];
                c.c2 += v * SampledSpectrum.CIE_Y[i];
                c.c3 += v * SampledSpectrum.CIE_Z[i];
            }

            var xyz = (c / 683f) * SampledSpectrum.yint;
            //(c / 300f);
            return xyz;
        }