_GltfMaterialBasicProperties.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Numerics;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using GLTFMATERIAL = SharpGLTF.Schema2.Material;
  8. namespace SharpGLTF.Runtime.Pipeline
  9. {
  10. internal static class _GltfMaterialBasicProperties
  11. {
  12. public static float GetAlphaLevel(GLTFMATERIAL srcMaterial)
  13. {
  14. if (srcMaterial.Alpha == Schema2.AlphaMode.OPAQUE) return 1;
  15. var baseColor = srcMaterial.FindChannel("BaseColor");
  16. if (baseColor == null) return 1;
  17. return baseColor.Value.Color.W;
  18. }
  19. public static Vector3 GetDiffuseColor(GLTFMATERIAL srcMaterial)
  20. {
  21. var diffuse = srcMaterial.FindChannel("Diffuse");
  22. if (diffuse == null) diffuse = srcMaterial.FindChannel("BaseColor");
  23. if (diffuse == null) return Vector3.One;
  24. return new Vector3(diffuse.Value.Color.X, diffuse.Value.Color.Y, diffuse.Value.Color.Z);
  25. }
  26. public static Vector3 GetSpecularColor(GLTFMATERIAL srcMaterial)
  27. {
  28. var mr = srcMaterial.FindChannel("MetallicRoughness");
  29. if (mr == null) return Vector3.One; // default value 16
  30. var diffuse = GetDiffuseColor(srcMaterial);
  31. var metallic = mr.Value.GetFactor("MetallicFactor");
  32. var roughness = mr.Value.GetFactor("RoughnessFactor");
  33. var k = Vector3.Zero;
  34. k += Vector3.Lerp(diffuse, Vector3.Zero, roughness);
  35. k += Vector3.Lerp(diffuse, Vector3.One, metallic);
  36. k *= 0.5f;
  37. return k;
  38. }
  39. public static float GetSpecularPower(GLTFMATERIAL srcMaterial)
  40. {
  41. var mr = srcMaterial.FindChannel("MetallicRoughness");
  42. if (mr == null) return 16; // default value = 16
  43. var metallic = mr.Value.GetFactor("MetallicFactor");
  44. var roughness = mr.Value.GetFactor("RoughnessFactor");
  45. return 4 + 16 * metallic;
  46. }
  47. public static Vector3 GeEmissiveColor(GLTFMATERIAL srcMaterial)
  48. {
  49. var emissive = srcMaterial.FindChannel("Emissive");
  50. if (emissive == null) return Vector3.Zero;
  51. return new Vector3(emissive.Value.Color.X, emissive.Value.Color.Y, emissive.Value.Color.Z);
  52. }
  53. }
  54. }