示例#1
0
 public SolidMaterial(MaterialInfo mi, string name = null, int id = 0)
 {
     MaterialData = mi;
     ID = id;
     Name = name;
     bxdfs = new List<BaseBsdf>();
 }
 public MaterialInfoContainer( MaterialInfo mt, IEnumerable<MaterialInfo> mats )
 {
     this.defaultMaterial = mt;
     this.map = new Dictionary<string, int>();
     this.materials = mats == null ? new []{mt} : mats.ToArray();
     for (int index = 0; index < this.materials.Length; index++)
     {
         var materialInfo = this.materials[index];
         this.map.Add(materialInfo.Name.ToLower(), index);
     }
 }
示例#3
0
        protected BaseBxdf(ref RayHit rh, ref RayData ray, ref Normal ng, ref Normal ns, ref UV texCoord,
                MaterialInfo mi, SurfaceTextureInfo texData, bool fromLight)
        {
#if VERBOSE
            if (ng.Length > 1f || ns.Length > 1f)
            {
                Console.WriteLine("Normals in bsdf arent normalized");
            }
#endif
            this.Init(ref rh, ref ray, ref ng, ref ns, ref texCoord, mi, texData, fromLight);
        }
示例#4
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);
 }
示例#5
0
 public SceneManager(TriangleMesh[] geometry, SceneGeometryInfo sceneGeometry, MaterialInfo[] mats)
 {
     this.sceneGeometry = sceneGeometry;
     this.geometry = geometry;
     this.materials = mats.ToDictionary(item => item.Name.ToLower());
     var acc =
         //new OctreeAcceleration();
         //new BVHAccellerationStructure();
         //new BoundingVolumeHierarchyAcceleration();
         //new BottomUpBvhAccelleration();
         //new LinearBvhAccelleration();
         //new TopDownBvhAccell();
         new BoundingVolumeHierarchyAccelerationStructure();
     //new BruteForceAccellerationStructure();
     //new BspAccellerationStructure();
     acc.Init(sceneGeometry, this, geometry);
     this.accel = acc;
     this.lights = new List<ILight>();
     this.defaultMaterial = new MaterialInfo() { Kd = new RgbSpectrum(0.6f) };
     Console.WriteLine("Using {0} ", accel.GetType().Name);
 }
示例#6
0
 internal void Init(ref RayHit rh, ref RayData ray, ref Normal ng, ref Normal ns, ref UV texCoord,
     MaterialInfo mi, SurfaceTextureInfo texData, bool fromLight)
 {
     if (rh.Miss())
     {
         throw new ArgumentException("RayHit missed geometry!");
     }
     //if (HitPoint == null)
     //{
         HitPoint = new HitPointInfo
         {
             Color = RgbSpectrum.Max(ref mi.Kd, ref mi.Ks),
             HitPoint = ray.Point(rh.Distance),
             TexCoord = texCoord,
             FromDirection = -ray.Dir,
             GeoNormal = ng,
             ShadingNormal = ns,
             FromLight = fromLight
         };
     //}
     //else
     //{
     //    HitPoint.HitPoint = ray.Point(rh.Distance);
     //    HitPoint.TexCoord = texCoord;
     //    HitPoint.FromDirection = -ray.Dir;
     //    HitPoint.GeoNormal = ng;
     //    HitPoint.ShadingNormal = ns;
     //    HitPoint.FromLight = fromLight;
     //};
     this.MaterialInfo = mi;
     this.TexData = texData;
     if (Frame == null)
         this.Frame = new ONB(ref HitPoint.GeoNormal);
     else
         Frame.SetFromZ(ref HitPoint.GeoNormal);
 }
示例#7
0
        public static SurfaceMaterial CreateFrameMaterial(FrameMaterialInfo mi)
        {
            BrdfClass brdfClass;
            if (!BrdfClass.TryParse(mi.BrdfClass, true, out brdfClass))
            {
                throw new ArgumentException("Invalid brdf class");
            }

            var matInfo = new MaterialInfo()
            {
                DataFile = mi.DataFile,
                Kd = mi.Diffuse,
                Kr = mi.Specular,
                Ks = mi.Glossy,
                PhongExponent = mi.Exponent,
                Name = mi.MaterialName,
                DiffuseTexture = new ImageTextureInfo() { FilePath = mi.DiffuseTexture },
                BumpTexture = new ImageTextureInfo() { FilePath = mi.BumpTexture },
                AlphaTexture = new ImageTextureInfo() { FilePath = mi.AlphaTexture },

            };

            return CreateMaterial(brdfClass, matInfo);
        }
示例#8
0
        protected BaseMaterial(MaterialInfo mi, RayEngineScene scene)
        {
            this.mi = mi;

            this.Exponent = mi.Exponent;
            this.IndexOfRefraction = (ConstWavelengthDependentValue)mi.MediumInfo.IoR;

            if (mi.DiffuseTexture != null)
            {
                Diffuse =
                    TextureFactory.Instance.CreateImageTexture(
                        (RgbSpectrumTexture)scene.Query(mi.MaterialName, TextureType.Diffuse));
            }
            else
            {
                Diffuse = TextureFactory.Instance.CreateConstTexture(ref mi.Kd);
            }

            if (mi.Specular != null)
            {
                Specular =
                    TextureFactory.Instance.CreateImageTexture(
                        (RgbSpectrumTexture)scene.Query(mi.MaterialName, TextureType.Specular));
            }
            else
            {
                Specular = TextureFactory.Instance.CreateConstTexture(ref mi.Kr);
            }

            if (mi.AlphaTexture != null)
            {
                Alpha =
                    TextureFactory.Instance.CreateImageTexture(
                        (RgbSpectrumTexture)scene.Query(mi.MaterialName, TextureType.Alpha));            
            }

            var zeroSpectrum = RgbSpectrum.ZeroSpectrum();
            var zeroTex = TextureFactory.Instance.CreateConstTexture(ref zeroSpectrum);

            if (mi.BumpTexture != null && scene.OptTextures.Contains(mi.BumpTexture))
            {
                Bump =
                    TextureFactory.Instance.CreateImageTexture(
                        (RgbSpectrumTexture)scene.Query(mi.MaterialName, TextureType.Bump));
            }
            //else
            //{
            //    Bump = zeroTex;
            //}

            if (!mi.GlossReflectance.IsBlack())
            {
                Glossy = TextureFactory.Instance.CreateConstTexture(ref mi.Ks);
            }
            //else
            //{
            //    Glossy = zeroTex;
            //}

            if (!mi.Kt.IsBlack())
            {
                Transmission = TextureFactory.Instance.CreateConstTexture(ref mi.Kt);
            }
            //else
            //{
            //    Transmission = zeroTex;
            //}

            if (!mi.Reflectance.IsBlack())
            {
                Reflectance = TextureFactory.Instance.CreateConstTexture(ref mi.Reflectance);
            }
            //else
            //{
            //    Reflectance = zeroTex;
            //}
        }
示例#9
0
 public SolidMaterial(int id, MaterialInfo mi, RayEngineScene scn, BrdfBase brdf) : base(mi, scn)
 {
     this.Id = id;
     this.brdf = brdf;
 }
示例#10
0
        private static MaterialInfo CreateMaterial(string name, ObjMaterial material)
        {
            try
            {
                var res = new MaterialInfo()
                    {
                        Ka = material.Ka,
                        Kd = material.Kd,
                        Ks = material.Ks,
                        Ke = material.Ke,
                        Exponent = material.Ns,
                        Name = name
                    };
                if (!string.IsNullOrWhiteSpace(material.KaMap))
                {
                    res.Specular = new ImageTextureInfo()
                        {
                            FilePath = material.KaMap,
                            Name = Path.GetFileName(material.KaMap)
                        };
                }
                if (!string.IsNullOrWhiteSpace(material.KdMap))
                {
                    res.Diffuse = new ImageTextureInfo()
                        {
                            FilePath = material.KdMap,
                            Name = Path.GetFileName(material.KdMap)
                        };
                }

                if (!string.IsNullOrWhiteSpace(material.KsMap))
                {
                    res.Specular = new ImageTextureInfo()
                        {
                            FilePath = material.KsMap,
                            Name = Path.GetFileName(material.KsMap)
                        };
                }

                if (!string.IsNullOrWhiteSpace(material.BumpMap))
                {
                    res.BumpMap = new ImageTextureInfo()
                        {
                            FilePath = material.BumpMap,
                            Name = Path.GetFileName(material.BumpMap)
                        };
                }
                if (!string.IsNullOrWhiteSpace(material.AlphaMap))
                {
                    res.Alpha = new ImageTextureInfo()
                    {
                        FilePath = material.AlphaMap,
                        Name = Path.GetFileName(material.AlphaMap)
                    };
                }
                if (!string.IsNullOrWhiteSpace(material.NormalMap))
                {
                    res.NormalMap = new ImageTextureInfo()
                    {
                        FilePath = material.NormalMap,
                        Name = Path.GetFileName(material.NormalMap)
                    };
                }
                if (!string.IsNullOrWhiteSpace(material.DataMap))
                {
                    res.DataFile = material.DataMap;
                }
                return res;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
示例#11
0
文件: Bsdf.cs 项目: HungryBear/rayden
        private void Init()
        {
            var materialInfo = new MaterialInfo()
                {
                    Name = "object_materialview_test",
                    DiffuseReflectance =  new RgbSpectrum(0.6f), GlossReflectance = new RgbSpectrum(0f, 0.45f, 0.65f), PhongExponent = 50f,SpecularReflectance = new RgbSpectrum(0.75f),
                    DiffuseTexture = new ImageTextureInfo() { FilePath = @"I:\3D\Textures\Oxidated.jpg" },// { FilePath = @"I:\3D\Textures\102.png" },
                    //BumpTexture = new ImageTextureInfo() { FilePath = @"I:\3D\Textures\102bump.png" },
                    NormalMap = new ImageTextureInfo() { FilePath = @"I:\3D\Textures\Oxidated.normal.jpg" }
                };
            var secondMI = new MaterialInfo()
                {
                    Name = "smi",
                    DiffuseReflectance = new RgbSpectrum(0.75f),
                    SpecularReflectance = new RgbSpectrum(0.75f)
                };
            ObjectMaterial = new SurfaceMaterial
                (
                //new MatteMaterial(materialInfo.DiffuseReflectance) { MaterialData = materialInfo }
                new OrenNayarMaterial(materialInfo.DiffuseReflectance, 0.2f) { MaterialData = materialInfo }
                //new AnisotropicPhong(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, 10f, 10f) { MaterialData = materialInfo}
                //new GlassMaterial(materialInfo.DiffuseReflectance + 0.2f, materialInfo.GlossReflectance + 0.2f, 1.0005f, 1.5f, true, true) { MaterialData = materialInfo }
                
                //new MetalMaterial(materialInfo.DiffuseReflectance, materialInfo.PhongExponent, true){MaterialData = materialInfo}
                /*
                 */

               // new MatteMirrorMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true) { MaterialData = materialInfo }
                // new ArchGlassMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true, true) { MaterialData = materialInfo}
                    
                /*
                new DistributionBsdf(10.175f, materialInfo.DiffuseReflectance
                    //,new FresnelDielectric(1.39f, 0.6f)
                    ,new FresnelConductor(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance)
                    ) {MaterialData = materialInfo} */
                //new MirrorMaterial(materialInfo.DiffuseReflectance, true) { MaterialData = materialInfo }
                //new MatteMaterial(secondMI.DiffuseReflectance) { MaterialData = secondMI }
                //new TranslucentMaterial(materialInfo.DiffuseReflectance) { MaterialData = secondMI }
                //new MatteMaterial(materialInfo.DiffuseReflectance){ MaterialData = materialInfo }
                /*
                new MatteMaterial(materialInfo.DiffuseReflectance){ MaterialData = materialInfo }
                 * 
                new MirrorMaterial(secondMI.DiffuseReflectance, true) { MaterialData = secondMI }*/
              //new AlloyMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, materialInfo.PhongExponent, 0.5f, true) {MaterialData = materialInfo}
                    );

            var planeMI = new MaterialInfo()
                {
                    Name = "plane_material",
                    DiffuseReflectance = new RgbSpectrum(0.7f),
                    DiffuseTexture = new ImageTextureInfo() { FilePath = "Finishes.Flooring.Tile.Diamond.Red.jpg" },
                    //{ FilePath = @"I:\3D\Textures\CEDFENCE.jpg" },
                    //BumpTexture = new ImageTextureInfo() { FilePath = @"I:\3D\Textures\102bump.png" },
                    BumpMap = new ImageTextureInfo() { FilePath = "Finishes.Flooring.Tile.Diamond.Red.bump.jpg" }
                    
                    //{ FilePath = @"I:\3D\Textures\CEDFENCE.Normal.jpg" }

                };
            PlaneMaterial = new SurfaceMaterial(

                new MatteMaterial(planeMI.DiffuseReflectance) 

                // new DistributionBsdf(1.175f, materialInfo.DiffuseReflectance ,new FresnelDielectric(1.39f, 0.6f))
                { MaterialData = planeMI});

        }
示例#12
0
 public UberMaterial(MaterialInfo data) : base(data)
 {
 }
示例#13
0
 protected MaterialImplementation(MaterialInfo data) {
     this.MaterialData = data;
 }
示例#14
0
 public MaterialInfo[] LoadMaterials(string fileName, params string[] paths)
 {
     return this.materials.Select(
         mat =>
         {
             var result = new MaterialInfo()
             {
                 Name = mat.Key,
                 Ka = new RgbSpectrum(mat.Value.Ambient),
                 Kd = new RgbSpectrum(mat.Value.Diffuse),
                 Ks = new RgbSpectrum(mat.Value.Specular),
                 Exponent = mat.Value.Shininess
             };
             if (mat.Value.Textures.Any())
             {
                 result.Diffuse = new ImageTextureInfo() { FilePath = mat.Value.Textures[0] };
             }
             return
                 result;
         }
         ).ToArray();
 }
示例#15
0
        public OptixMaterialInfo CreateMaterial(MaterialInfo mi, BrdfClass type)
        {
            var result = new OptixMaterialInfo()
            {
                Name = mi.Name.ToLower(),
                Info = mi,
                Type = type
            };
            result.Node = new Material(context);
            result.Node.SetSurfaceProgram(0, new SurfaceProgram(context, RayHitType.Closest, classKernelMap[result.Type].Item1, classKernelMap[result.Type].Item2));
            result.Node.SetSurfaceProgram(1, new SurfaceProgram(context, RayHitType.Any, classKernelMap[result.Type].Item1, classKernelMap[result.Type].Item3));
            /*
            switch (result.Type)
            {
                case BrdfClass.DiffuseLambert:
                    

                    break;

            }*/
            return result;
        }
示例#16
0
 public SpecularReflectionBrdf(ref RayHit rh, ref RayData ray, ref Normal ng, ref Normal ns, ref UV texCoord, MaterialInfo mi, SurfaceTextureInfo texData, bool fromLight)
     : base(ref rh, ref ray, ref ng, ref ns, ref texCoord, mi, texData, fromLight)
 {
 }
示例#17
0
 public MatteLambertBrdf(ref RayHit rh, ref RayData ray, ref Normal ng, ref Normal ns, ref UV texCoord, MaterialInfo mi, SurfaceTextureInfo texData, bool fromLight)
     : base(ref rh, ref ray, ref ng, ref ns, ref texCoord, mi, texData, fromLight)
 {
 }
示例#18
0
        private static SurfaceMaterial CreateMaterial(BrdfClass cl, MaterialInfo materialInfo)
        {

            switch (cl)
            {

                case BrdfClass.Measured:
                    return new SurfaceMaterial(
                        new RegularHalfangleBRDF(materialInfo.DataFile ?? @"F:\3D\Brdfs\merl\two-layer-silver.binary")
                        )
                    {
                        Name = materialInfo.Name.ToLower(),
                        Type = BrdfType.Glossy
                    }; ;
                case BrdfClass.ArchGlass:
                    return new SurfaceMaterial(
                          new ArchGlassMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true, true)
                          {
                              MaterialData = materialInfo
                          })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Type = BrdfType.Specular
                    };
                case BrdfClass.Glass:
                    return new SurfaceMaterial(
                        //new CanonicalGlassMaterial(materialInfo.Kd + 0.5f , materialInfo.GlossReflectance + 0.1f, MediumInfo.Glass)
                               new GlassMaterial(materialInfo.Kd + 1f, materialInfo.GlossReflectance + 0.1f, 1.0005f, 1.2f, true, true)
                               {
                                   MaterialData = materialInfo
                               })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Type = BrdfType.Specular
                    };
                case BrdfClass.GlossyMetal:
                    return new SurfaceMaterial(
                   new MetalMaterial(materialInfo.DiffuseReflectance, materialInfo.PhongExponent, true)
                   {
                       MaterialData = materialInfo
                   })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Type = BrdfType.Glossy
                    };
                case BrdfClass.Alloy:
                    return new SurfaceMaterial(
                        //new AnisotropicPhong(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, 20f, 20f)
                        //new PhongMaterial(RgbSpectrum.Max(ref materialInfo.Kd, ref materialInfo .Ks), materialInfo.PhongExponent)

                    new AlloyMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, materialInfo.PhongExponent, 0.5f, true)
                    {
                        MaterialData = materialInfo
                    }) { Name = materialInfo.Name.ToLower(), Type = BrdfType.Glossy };
                case BrdfClass.Mirror:
                    return new SurfaceMaterial(
                   new MirrorMaterial(materialInfo.DiffuseReflectance, true) { MaterialData = materialInfo })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Type = BrdfType.Specular
                    };
                case BrdfClass.MatteMirror:
                    return new SurfaceMaterial(
                        new MatteMirrorMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true) { MaterialData = materialInfo })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Type = BrdfType.Glossy
                    };
                case BrdfClass.Distribution:
                    //             return new RoughMatte(ref materialInfo.Kd) {Type = BrdfType.Diffuse};
                    return new SurfaceMaterial(
                        //new GlassMaterial(materialInfo.GlossReflectance, materialInfo.DiffuseReflectance + 0.1f, 1.0005f, 1.5f, true, true)
                        //new AnisotropicPhong(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance , 10f, 10f)
                        //new PhongMaterial(materialInfo.Kd, materialInfo.Ks, materialInfo.PhongExponent)
                        //new FresnelBlend(materialInfo.Kd, materialInfo.Ks, materialInfo.PhongExponent)
                        //new MatteMaterial(materialInfo.DiffuseReflectance)
                        //new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter())
                        //new MatteMaterial(materialInfo.DiffuseReflectance) 
                        //new MatteMirrorMaterial( materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true)
                        //new MirrorMaterial(materialInfo.DiffuseReflectance,true)
                        //new DistributionBsdf(materialInfo.PhongExponent, materialInfo.Kd)
               new DistributionBsdf(materialInfo.PhongExponent, materialInfo.Kd + 0.5f, new FresnelConductor(new RgbSpectrum(0.5f), new RgbSpectrum(0.025f)))
                        //new ArchGlassMaterial(materialInfo.Kd, materialInfo.Ks, true, true) { MaterialData = materialInfo }
                        //new AlloyMaterial(materialInfo.Kd, materialInfo.Ks, materialInfo.Exponent, 0.5f, true)

               //new MetalMaterial(materialInfo.Kd, materialInfo.Exponent, true) { MaterialData = materialInfo }
                        //new MatteMaterial(materialInfo.Kd) { MaterialData = materialInfo }
             )
                    {
                        Name = materialInfo.Name,
                        Type = BrdfType.Glossy | BrdfType.Diffuse,

                    };
                case BrdfClass.DiffuseLambert:
                    return new SurfaceMaterial(
                        //new DistributionBsdf(materialInfo.Exponent, materialInfo.Kd)
                        //new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter())
                  new MatteMaterial(materialInfo.DiffuseReflectance) { MaterialData = materialInfo })
                    {
                        Name = materialInfo.Name,
                        Type = BrdfType.Diffuse,

                    };
                default:
                    return new SurfaceMaterial(
                        //new DistributionBsdf(materialInfo.Exponent, materialInfo.Kd)
                  new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter()) { MaterialData = materialInfo })

                  //new MatteMaterial(materialInfo.DiffuseReflectance) { MaterialData = materialInfo })
                    {
                        Name = materialInfo.Name,
                        Type = BrdfType.Diffuse,
                    };
            }
        }
示例#19
0
 public DiffuseMaterial(MaterialInfo data) : base(data)
 {
 }
示例#20
0
        public static SurfaceMaterial CreateMaterial(MaterialInfo materialInfo)
        {
            var mat = CreateMaterialInternal(materialInfo);

            return mat;
        }
示例#21
0
 public IMaterialLibrary<ISurfaceMaterial> GetLibrary(MaterialInfo[] materials)
 {
     var library = new OptimizedBsdfLibrary();
     library.Populate(materials);
     return library;
 }
示例#22
0
        //TODO Eval by mapper only elementary brdf - single return with variable parameters
        private static SurfaceMaterial CreateMaterialInternal(MaterialInfo materialInfo)
        {
            try
            {
                if (materialInfo.Name.ToLowerInvariant().StartsWith("mb") && materialInfo.Name.Length < 5)
                {
                    var index = int.Parse(materialInfo.Name.Substring(2, materialInfo.Name.Length - 2));
                    var mbData = SampledSpectrum.macbethSpectra[index].Select(i => (float)i).ToArray();
                    float[] mRes = new float[81];
                    for (int i = 0; i < 81; i++)
                    {
                        mRes[i] = (float)SampledSpectrum.macbethSpectra[i][index - 1];
                    }
                    SampledSpectrum spd =
                        SampledSpectrum.FromSampled(SampledSpectrum.macbeth_lambda.Select(o => (float)o).ToArray(),
                                                    mRes);
                    materialInfo.Reflectance = spd;
                    return new SurfaceMaterial(
                        //new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter())
                                new SpectralMatteMaterial(spd) { MaterialData = materialInfo })
                                    {
                                        Name = materialInfo.Name,
                                        Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                                        Type = BrdfType.Diffuse,
                                    };
                }
            }
            catch { }

            if (materialInfo.Name.Contains("translucent"))
            {
                if (materialInfo.Name.Contains("alloy"))
                {
                    return new SurfaceMaterial(
                        new BrdfToBtdf(
                            new AlloyMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance,
                                materialInfo.PhongExponent,
                                materialInfo.DiffuseReflectance.y() / materialInfo.GlossReflectance.y(), false)
                            {
                                MaterialData = materialInfo
                            }))
                    {
                        Name = materialInfo.Name.ToLower(),
                        Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                        Type = BrdfType.Glossy | BrdfType.Refractive
                    };
                }
                return new SurfaceMaterial(
                    new BrdfToBtdf(new MatteMirrorMaterial(materialInfo.DiffuseReflectance,
                        materialInfo.GlossReflectance, false) { MaterialData = materialInfo }))
                    {
                        Name = materialInfo.Name.ToLower(),
                        Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                        Type = BrdfType.Glossy
                    };

            }

            if (materialInfo.Name.NameContains("water"))
            {
                return new SurfaceMaterial(
                       new GlassMaterial(new RgbSpectrum(0f, 0.1f, 0.7f), materialInfo.GlossReflectance + 0.1f, 1.0005f, 1.31f, true, true)
                       {
                           MaterialData = materialInfo
                       })
                {
                    Name = materialInfo.Name.ToLower(),
                    Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                    Type = BrdfType.Specular | BrdfType.Refractive
                };
            }

            switch (BrdfClassNameMapper.GetMaterialClass(materialInfo))
            {

                case BrdfClass.Measured:
                    return new SurfaceMaterial(
                        new RegularHalfangleBRDF(materialInfo.DataFile ?? @"F:\3D\Brdfs\merl\two-layer-silver.binary")
                        )
                        {
                            Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                            Name = materialInfo.Name.ToLower(),
                            Type = BrdfType.Glossy
                        }; ;
                case BrdfClass.ArchGlass:
                    return new SurfaceMaterial(
                          new ArchGlassMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true, true)
                          {
                              MaterialData = materialInfo
                          })
                            {
                                Name = materialInfo.Name.ToLower(),
                                Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                                Type = BrdfType.Specular | BrdfType.Refractive
                            };
                case BrdfClass.Glass:
                   
                    return new SurfaceMaterial(
                        //new CanonicalGlassMaterial(materialInfo.Kd + 0.5f , materialInfo.GlossReflectance + 0.1f, MediumInfo.Glass)

                               new GlassMaterial(materialInfo.Kd + 1f, materialInfo.GlossReflectance + 0.1f, 1.0005f, materialInfo.Name.NameContains("flint") ? 1.98f : Math.Max(materialInfo.MediumInfo.IoR,1.5f), true, true)
                               //new DispersiveGlassMaterial(materialInfo.Kd + 1f, materialInfo.GlossReflectance + 0.1f, 1.0005f, 1.2f, true, true)

                          //new ArchGlassMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true, true)

                               {
                                   MaterialData = materialInfo
                               })
                                {
                                    Name = materialInfo.Name.ToLower(),
                                    Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                                    Type = BrdfType.Specular | BrdfType.Refractive
                                };
                case BrdfClass.GlossyMetal:
                    return new SurfaceMaterial(
                   new MetalMaterial(materialInfo.DiffuseReflectance, materialInfo.PhongExponent, true)
                   {
                       MaterialData = materialInfo
                   })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                        Type = BrdfType.Glossy
                    };
                case BrdfClass.Alloy:
                    bool specular = !materialInfo.Name.NameContains("dull");
                    return new SurfaceMaterial(
                        //new AnisotropicPhong(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, 20f, 20f)
                        //new PhongMaterial(RgbSpectrum.Max(ref materialInfo.Kd, ref materialInfo .Ks), materialInfo.PhongExponent)

                    new AlloyMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, materialInfo.PhongExponent, materialInfo.DiffuseReflectance.y() / materialInfo.GlossReflectance.y(), specular)
                        {
                            MaterialData = materialInfo
                        })
                        {
                            Name = materialInfo.Name.ToLower(),
                            Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                            Type = BrdfType.Glossy
                        };
                case BrdfClass.Mirror:
                    return new SurfaceMaterial(
                   new MirrorMaterial(materialInfo.DiffuseReflectance, true) { MaterialData = materialInfo })
                   {
                       Name = materialInfo.Name.ToLower(),
                       Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                       Type = BrdfType.Specular
                   };
                case BrdfClass.MatteMirror:
                    return new SurfaceMaterial(
                        new MatteMirrorMaterial(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true) { MaterialData = materialInfo })
                    {
                        Name = materialInfo.Name.ToLower(),
                        Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                        Type = BrdfType.Glossy
                    };
                case BrdfClass.Distribution:
                    //             return new RoughMatte(ref materialInfo.Kd) {Type = BrdfType.Diffuse};
                    return new SurfaceMaterial(
                        //new GlassMaterial(materialInfo.GlossReflectance, materialInfo.DiffuseReflectance + 0.1f, 1.0005f, 1.5f, true, true)
                        //new AnisotropicPhong(materialInfo.DiffuseReflectance, materialInfo.GlossReflectance , 10f, 10f)
                        //new PhongMaterial(materialInfo.Kd, materialInfo.Ks, materialInfo.PhongExponent)
                        //new FresnelBlend(materialInfo.Kd, materialInfo.Ks, materialInfo.PhongExponent)
                        //new MatteMaterial(materialInfo.DiffuseReflectance)
                        //new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter())
                        //new MatteMaterial(materialInfo.DiffuseReflectance) 
                        //new MatteMirrorMaterial( materialInfo.DiffuseReflectance, materialInfo.GlossReflectance, true)
                        //new MirrorMaterial(materialInfo.DiffuseReflectance,true)
                        //new DistributionBsdf(materialInfo.PhongExponent, materialInfo.Kd)
               new DistributionBsdf(materialInfo.PhongExponent, materialInfo.Kd + 0.5f, new FresnelConductor(new RgbSpectrum(0.5f), new RgbSpectrum(0.025f)))
                        //new ArchGlassMaterial(materialInfo.Kd, materialInfo.Ks, true, true) { MaterialData = materialInfo }
                        //new AlloyMaterial(materialInfo.Kd, materialInfo.Ks, materialInfo.Exponent, 0.5f, true)

               //new MetalMaterial(materialInfo.Kd, materialInfo.Exponent, true) { MaterialData = materialInfo }
                        //new MatteMaterial(materialInfo.Kd) { MaterialData = materialInfo }
             )
           {
               Name = materialInfo.Name,
               Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
               Type = BrdfType.Glossy | BrdfType.Diffuse,

           };
                case BrdfClass.DiffuseLambert:
                    return new SurfaceMaterial(
                        //new DistributionBsdf(materialInfo.Exponent, materialInfo.Kd)
                        //new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter())
                  new MatteMaterial(materialInfo.DiffuseReflectance) { MaterialData = materialInfo })
                  {
                      Name = materialInfo.Name,
                      Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                      Type = BrdfType.Diffuse,

                  };
                default:
                    return new SurfaceMaterial(
                        //new DistributionBsdf(materialInfo.Exponent, materialInfo.Kd)
                        //new OrenNayarMaterial(materialInfo.DiffuseReflectance, materialInfo.Kd.Filter()) { MaterialData = materialInfo })

                  new MatteMaterial(materialInfo.DiffuseReflectance) { MaterialData = materialInfo })
                  {
                      Name = materialInfo.Name,
                      Class = BrdfClassNameMapper.GetMaterialClass(materialInfo),
                      Type = BrdfType.Diffuse,
                  };
            }
        }
示例#23
0
        public static BrdfClass GetMaterialClass(MaterialInfo materialInfo)
        {

            if (materialInfo.Name.NameContains("orennayar", "oren_nayar", "_M_OR"))
            {
                return BrdfClass.OrenNayar;
            }


            if (materialInfo.Name.NameContains1("anisotropicphong", 
                "_M_AS"))
            {
                return BrdfClass.AnisotropicPhong;
            }

            if (materialInfo.Name.NameContains("measured"
                , "head_mat"
                , "_M_RHA_"))
            {
                return BrdfClass.Measured;
            }

            if (materialInfo.Name.NameContains("experimental", "_M_XP"))
            {
                return BrdfClass.Experimental;
            }

            if (materialInfo.Name.NameContains(
                "Ruby",
                "Emerald",
                                   "bunny",
                                  "garg_mat",
                                  "cornell_exp_mat",
                                            "glass",
                                            "wire_135059008",
                                               "wire_060134005",
                                               "staklo",
                                               "wire_140088225",
                                               "wire_154215229",
                                               "wire_228153184",
                                               "wire_057008136",
                                               "__SILVER",
                                               "simple_metal_1",
                                               "wire_000000000",
                                               "wire_200157056",
                                               "wire_113134006",
                                               "wire_134110008",
                                               "water",
                                               "_M_GLS",
                    "wire_141182235"))
            {

                return BrdfClass.Glass;
            }

            if (materialInfo.Name.NameContains(
                "Saphire",
                "arch",
                "_M_AGLS",
                "wire_008061138", "wire_213228166", "wire_134110008", "wire_028149177",
                "Material__29"))
            {
                return BrdfClass.ArchGlass;
            }
            if (!materialInfo.GlossReflectance.IsBlack() && materialInfo.Name.NameContains("metal",
                "wire_028089177",
                "_M_MTL",
                "chrome",
                "inside", 
                "reflection",
                 "wire_177088026", "wire_153228184", "wire_153228214", "wire_028089177"
            ))
            {
                return BrdfClass.GlossyMetal;
            }
            if (!materialInfo.GlossReflectance.IsBlack() && materialInfo.Name.NameContains("alloy"
                 , "mmix",
                 "_M_ALO",
                 "porcelain",
                 "marble",
                 "gloss",
                 "plastic",
                 "ceramic",
                  "wire_008008136"
                ))
            {
                return BrdfClass.Alloy;
            }
            if (materialInfo.Name.NameContains("mirror",
                "_M_MIR",
                "wire_154154229"))
            {
                return BrdfClass.Mirror;
            }
            if (materialInfo.Name.NameContains("matmir",
                "_M_MMR",
                "wire_087224087"))
            {
                return BrdfClass.MatteMirror;
            }

            if (materialInfo.Name.NameContains("MaterialView_Test",
                //"phong",
               "mitsuba",
               "blinn",
                 "_M_DST",
                "wire_088144225"

                ))
            {
                return BrdfClass.Distribution;
            }


            if (materialInfo.Name.NameContains("wire_229166215", "wire_060134005"))
            {
                return BrdfClass.ArchGlass;
            }
            return BrdfClass.DiffuseLambert;
        }
示例#24
0
 public IMaterialLibrary<ISurfaceMaterial> GetMaterialPlugin(MaterialInfo[] m)
 {
     return new MaterialPlugin().GetLibrary(m);
 }