MaterialManager.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace VLB
  4. {
  5. public static class MaterialManager
  6. {
  7. public static MaterialPropertyBlock materialPropertyBlock = new MaterialPropertyBlock();
  8. public enum BlendingMode
  9. {
  10. Additive,
  11. SoftAdditive,
  12. TraditionalTransparency,
  13. Count
  14. }
  15. public enum Noise3D
  16. {
  17. Off,
  18. On,
  19. Count
  20. }
  21. public enum DepthBlend
  22. {
  23. Off,
  24. On,
  25. Count
  26. }
  27. public enum ColorGradient
  28. {
  29. Off,
  30. MatrixLow,
  31. MatrixHigh,
  32. Count
  33. }
  34. public enum DynamicOcclusion
  35. {
  36. Off,
  37. ClippingPlane,
  38. DepthTexture,
  39. Count
  40. }
  41. public enum MeshSkewing
  42. {
  43. Off,
  44. On,
  45. Count
  46. }
  47. public enum ShaderAccuracy
  48. {
  49. Fast,
  50. High,
  51. Count
  52. }
  53. static readonly UnityEngine.Rendering.BlendMode[] BlendingMode_SrcFactor = new UnityEngine.Rendering.BlendMode[(int)BlendingMode.Count]
  54. {
  55. UnityEngine.Rendering.BlendMode.One, // Additive
  56. UnityEngine.Rendering.BlendMode.OneMinusDstColor, // SoftAdditive
  57. UnityEngine.Rendering.BlendMode.SrcAlpha, // TraditionalTransparency
  58. };
  59. static readonly UnityEngine.Rendering.BlendMode[] BlendingMode_DstFactor = new UnityEngine.Rendering.BlendMode[(int)BlendingMode.Count]
  60. {
  61. UnityEngine.Rendering.BlendMode.One, // Additive
  62. UnityEngine.Rendering.BlendMode.One, // SoftAdditive
  63. UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha, // TraditionalTransparency
  64. };
  65. static readonly bool[] BlendingMode_AlphaAsBlack = new bool[(int)BlendingMode.Count]
  66. {
  67. true, // Additive
  68. true, // SoftAdditive
  69. false, // TraditionalTransparency
  70. };
  71. static int kStaticPropertiesCount = (int)BlendingMode.Count * (int)Noise3D.Count * (int)DepthBlend.Count * (int)ColorGradient.Count * (int)DynamicOcclusion.Count * (int)MeshSkewing.Count * (int)ShaderAccuracy.Count;
  72. public class StaticProperties
  73. {
  74. public BlendingMode blendingMode;
  75. public Noise3D noise3D;
  76. public DepthBlend depthBlend;
  77. public ColorGradient colorGradient;
  78. public DynamicOcclusion dynamicOcclusion;
  79. public MeshSkewing meshSkewing;
  80. public ShaderAccuracy shaderAccuracy;
  81. int blendingModeID { get { return (int)blendingMode; } }
  82. int noise3DID { get { return Config.Instance.featureEnabledNoise3D ? (int)noise3D : 0; } }
  83. int depthBlendID { get { return Config.Instance.featureEnabledDepthBlend ? (int)depthBlend : 0; } }
  84. int colorGradientID { get { return Config.Instance.featureEnabledColorGradient != FeatureEnabledColorGradient.Off ? (int)colorGradient : 0; } }
  85. int dynamicOcclusionID { get { return Config.Instance.featureEnabledDynamicOcclusion ? (int)dynamicOcclusion : 0; } }
  86. int meshSkewingID { get { return Config.Instance.featureEnabledMeshSkewing ? (int)meshSkewing : 0; } }
  87. int shaderAccuracyID { get { return Config.Instance.featureEnabledShaderAccuracyHigh ? (int)shaderAccuracy : 0; } }
  88. public int materialID
  89. {
  90. get
  91. {
  92. return (((((((blendingModeID)
  93. * (int)Noise3D.Count + noise3DID)
  94. * (int)DepthBlend.Count + depthBlendID)
  95. * (int)ColorGradient.Count + colorGradientID)
  96. * (int)DynamicOcclusion.Count + dynamicOcclusionID)
  97. * (int)MeshSkewing.Count + meshSkewingID)
  98. * (int)ShaderAccuracy.Count + shaderAccuracyID)
  99. ;
  100. }
  101. }
  102. public void ApplyToMaterial(Material mat)
  103. {
  104. mat.SetKeywordEnabled(ShaderKeywords.AlphaAsBlack, BlendingMode_AlphaAsBlack[(int)blendingMode]);
  105. mat.SetKeywordEnabled(ShaderKeywords.ColorGradientMatrixLow, colorGradient == ColorGradient.MatrixLow);
  106. mat.SetKeywordEnabled(ShaderKeywords.ColorGradientMatrixHigh, colorGradient == ColorGradient.MatrixHigh);
  107. mat.SetKeywordEnabled(ShaderKeywords.DepthBlend, depthBlend == DepthBlend.On);
  108. mat.SetKeywordEnabled(ShaderKeywords.Noise3D, noise3D == Noise3D.On);
  109. mat.SetKeywordEnabled(ShaderKeywords.OcclusionClippingPlane, dynamicOcclusion == DynamicOcclusion.ClippingPlane);
  110. mat.SetKeywordEnabled(ShaderKeywords.OcclusionDepthTexture, dynamicOcclusion == DynamicOcclusion.DepthTexture);
  111. mat.SetKeywordEnabled(ShaderKeywords.MeshSkewing, meshSkewing == MeshSkewing.On);
  112. mat.SetKeywordEnabled(ShaderKeywords.ShaderAccuracyHigh, shaderAccuracy == ShaderAccuracy.High);
  113. mat.SetInt(ShaderProperties.BlendSrcFactor, (int)BlendingMode_SrcFactor[(int)blendingMode]);
  114. mat.SetInt(ShaderProperties.BlendDstFactor, (int)BlendingMode_DstFactor[(int)blendingMode]);
  115. }
  116. }
  117. public static Material NewMaterialTransient(bool gpuInstanced)
  118. {
  119. var material = NewMaterialPersistent(Config.Instance.beamShader, gpuInstanced);
  120. if (material)
  121. {
  122. material.hideFlags = Consts.ProceduralObjectsHideFlags;
  123. material.renderQueue = Config.Instance.geometryRenderQueue;
  124. }
  125. return material;
  126. }
  127. public static Material NewMaterialPersistent(Shader shader, bool gpuInstanced)
  128. {
  129. if (!shader)
  130. {
  131. Debug.LogError("Invalid VLB Shader. Please try to reset the VLB Config asset or reinstall the plugin.");
  132. return null;
  133. }
  134. var material = new Material(shader);
  135. BatchingHelper.SetMaterialProperties(material, gpuInstanced);
  136. return material;
  137. }
  138. class MaterialsGroup
  139. {
  140. public Material[] materials = new Material[kStaticPropertiesCount];
  141. }
  142. static Hashtable ms_MaterialsGroup = new Hashtable(1);
  143. public static Material GetInstancedMaterial(uint groupID, StaticProperties staticProps)
  144. {
  145. MaterialsGroup group = (MaterialsGroup)ms_MaterialsGroup[groupID];
  146. if (group == null)
  147. {
  148. group = new MaterialsGroup();
  149. ms_MaterialsGroup[groupID] = group;
  150. }
  151. int matID = staticProps.materialID;
  152. Debug.Assert(matID < kStaticPropertiesCount);
  153. var mat = group.materials[matID];
  154. if (mat == null)
  155. {
  156. mat = NewMaterialTransient(gpuInstanced:true);
  157. if(mat)
  158. {
  159. group.materials[matID] = mat;
  160. staticProps.ApplyToMaterial(mat);
  161. }
  162. }
  163. return mat;
  164. }
  165. }
  166. }