Przeglądaj źródła

Added an example to create a material with clear coat extension.

Vicente Penades 5 lat temu
rodzic
commit
f8571c6569

+ 4 - 0
src/SharpGLTF.Toolkit/Materials/MaterialEnums.cs

@@ -25,5 +25,9 @@ namespace SharpGLTF.Materials
 
         Diffuse,
         SpecularGlossiness,
+
+        ClearCoat,
+        ClearCoatNormal,
+        ClearCoatRoughness,
     }
 }

+ 8 - 1
src/SharpGLTF.Toolkit/Schema2/MaterialExtensions.cs

@@ -233,6 +233,7 @@ namespace SharpGLTF.Schema2
             {
                 dstMaterial.WithMetallicRoughnessShader();
                 srcMaterial.CopyChannelsTo(dstMaterial, "BaseColor", "MetallicRoughness");
+                srcMaterial.CopyChannelsTo(dstMaterial, "ClearCoat", "ClearCoatRoughness", "ClearCoatNormal");
             }
 
             if (srcMaterial.FindChannel("Diffuse") != null || srcMaterial.FindChannel("SpecularGlossiness") != null)
@@ -313,6 +314,10 @@ namespace SharpGLTF.Schema2
             dstMaterial.AlphaCutoff = srcMaterial.AlphaCutoff;
             dstMaterial.DoubleSided = srcMaterial.DoubleSided;
 
+            var hasClearCoat = srcMaterial.GetChannel("ClearCoat") != null
+                || srcMaterial.GetChannel("ClearCoatRoughness") != null
+                || srcMaterial.GetChannel("ClearCoatNormal") != null;
+
             srcMaterial.CopyChannelsTo(dstMaterial, "Normal", "Occlusion", "Emissive");
 
             Materials.MaterialBuilder defMaterial = null;
@@ -326,7 +331,8 @@ namespace SharpGLTF.Schema2
 
             if (srcMaterial.ShaderStyle == "PBRMetallicRoughness")
             {
-                dstMaterial.InitializePBRMetallicRoughness();
+                if (hasClearCoat) dstMaterial.InitializePBRMetallicRoughnessClearCoat();
+                else dstMaterial.InitializePBRMetallicRoughness();
                 defMaterial = srcMaterial;
             }
 
@@ -341,6 +347,7 @@ namespace SharpGLTF.Schema2
             {
                 if (defMaterial.ShaderStyle != "PBRMetallicRoughness") throw new ArgumentException(nameof(srcMaterial.CompatibilityFallback.ShaderStyle));
                 srcMaterial.CopyChannelsTo(dstMaterial, "BaseColor", "MetallicRoughness");
+                srcMaterial.CopyChannelsTo(dstMaterial, "ClearCoat", "ClearCoatRoughness", "ClearCoatNormal");
             }
         }
 

+ 40 - 5
tests/SharpGLTF.Tests/Schema2/Authoring/ExtensionsCreationTests.cs

@@ -78,12 +78,47 @@ namespace SharpGLTF.Schema2.Authoring
                 , (new Vector3(-10, -10, 0), new Vector2(1, 1))
                 );
 
-            var model = ModelRoot.CreateModel();
-            var scene = model.UseScene("Default");
-            var rnode = scene.CreateNode("RootNode").WithMesh(model.CreateMesh(mesh));
+            var scene = new Scenes.SceneBuilder();
+            scene.AddMesh(mesh, Matrix4x4.Identity);
+
+            scene.AttachToCurrentTest("result.glb");
+            scene.AttachToCurrentTest("result.gltf");
+        }
+
+        [Test(Description = "Creates a quad mesh with a complex material")]
+        public void CreateSceneWithClearCoatExtension()
+        {
+            TestContext.CurrentContext.AttachShowDirLink();
+            TestContext.CurrentContext.AttachGltfValidatorLinks();
+
+            var basePath = System.IO.Path.Combine(TestFiles.RootDirectory, "glTF-Sample-Models", "2.0", "SpecGlossVsMetalRough", "glTF");
+
+            // first, create a default material
+            var material = new Materials.MaterialBuilder("material")
+                .WithMetallicRoughnessShader()
+                .WithChannelImage(Materials.KnownChannel.Normal, System.IO.Path.Combine(basePath, "WaterBottle_normal.png"))
+                .WithChannelImage(Materials.KnownChannel.Emissive, System.IO.Path.Combine(basePath, "WaterBottle_emissive.png"))
+                .WithChannelImage(Materials.KnownChannel.Occlusion, System.IO.Path.Combine(basePath, "WaterBottle_occlusion.png"))
+                .WithChannelImage(Materials.KnownChannel.BaseColor, System.IO.Path.Combine(basePath, "WaterBottle_baseColor.png"))
+                .WithChannelImage(Materials.KnownChannel.MetallicRoughness, System.IO.Path.Combine(basePath, "WaterBottle_roughnessMetallic.png"))
+                .WithChannelImage(Materials.KnownChannel.ClearCoat, System.IO.Path.Combine(basePath, "WaterBottle_emissive.png"))
+                .WithChannelParam(Materials.KnownChannel.ClearCoat, new Vector4(0.5f, 0, 0, 0))
+                .WithChannelImage(Materials.KnownChannel.ClearCoatRoughness, System.IO.Path.Combine(basePath, "WaterBottle_roughnessMetallic.png"))
+                .WithChannelImage(Materials.KnownChannel.ClearCoatNormal, System.IO.Path.Combine(basePath, "WaterBottle_normal.png"));
+
+            var mesh = new Geometry.MeshBuilder<VPOS, VTEX>("mesh1");
+            mesh.UsePrimitive(material).AddQuadrangle
+                ((new Vector3(-10, 10, 0), new Vector2(1, 0))
+                , (new Vector3(10, 10, 0), new Vector2(0, 0))
+                , (new Vector3(10, -10, 0), new Vector2(0, 1))
+                , (new Vector3(-10, -10, 0), new Vector2(1, 1))
+                );
+
+            var scene = new Scenes.SceneBuilder();
+            scene.AddMesh(mesh, Matrix4x4.Identity);
 
-            model.AttachToCurrentTest("result.glb");
-            model.AttachToCurrentTest("result.gltf");
+            scene.AttachToCurrentTest("result.glb");
+            scene.AttachToCurrentTest("result.gltf");
         }
 
         [TestCase("shannon-dxt5.dds")]