SimpleNoiseNode.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System.Reflection;
  2. using UnityEngine;
  3. namespace UnityEditor.ShaderGraph
  4. {
  5. [Title("Procedural", "Noise", "Simple Noise")]
  6. class NoiseNode : CodeFunctionNode
  7. {
  8. public NoiseNode()
  9. {
  10. name = "Simple Noise";
  11. }
  12. protected override MethodInfo GetFunctionToConvert()
  13. {
  14. return GetType().GetMethod("Unity_SimpleNoise", BindingFlags.Static | BindingFlags.NonPublic);
  15. }
  16. static string Unity_SimpleNoise(
  17. [Slot(0, Binding.MeshUV0)] Vector2 UV,
  18. [Slot(1, Binding.None, 500f, 500f, 500f, 500f)] Vector1 Scale,
  19. [Slot(2, Binding.None)] out Vector1 Out)
  20. {
  21. return
  22. @"
  23. {
  24. $precision t = 0.0;
  25. $precision freq = pow(2.0, $precision(0));
  26. $precision amp = pow(0.5, $precision(3-0));
  27. t += Unity_SimpleNoise_ValueNoise_$precision($precision2(UV.x*Scale/freq, UV.y*Scale/freq))*amp;
  28. freq = pow(2.0, $precision(1));
  29. amp = pow(0.5, $precision(3-1));
  30. t += Unity_SimpleNoise_ValueNoise_$precision($precision2(UV.x*Scale/freq, UV.y*Scale/freq))*amp;
  31. freq = pow(2.0, $precision(2));
  32. amp = pow(0.5, $precision(3-2));
  33. t += Unity_SimpleNoise_ValueNoise_$precision($precision2(UV.x*Scale/freq, UV.y*Scale/freq))*amp;
  34. Out = t;
  35. }
  36. ";
  37. }
  38. public override void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode)
  39. {
  40. registry.ProvideFunction($"Unity_SimpleNoise_RandomValue_{concretePrecision.ToShaderString()}", s => s.Append(@"
  41. inline $precision Unity_SimpleNoise_RandomValue_$precision ($precision2 uv)
  42. {
  43. return frac(sin(dot(uv, $precision2(12.9898, 78.233)))*43758.5453);
  44. }"));
  45. registry.ProvideFunction($"Unity_SimpleNnoise_Interpolate_{concretePrecision.ToShaderString()}", s => s.Append(@"
  46. inline $precision Unity_SimpleNnoise_Interpolate_$precision ($precision a, $precision b, $precision t)
  47. {
  48. return (1.0-t)*a + (t*b);
  49. }
  50. "));
  51. registry.ProvideFunction($"Unity_SimpleNoise_ValueNoise_{concretePrecision.ToShaderString()}", s => s.Append(@"
  52. inline $precision Unity_SimpleNoise_ValueNoise_$precision ($precision2 uv)
  53. {
  54. $precision2 i = floor(uv);
  55. $precision2 f = frac(uv);
  56. f = f * f * (3.0 - 2.0 * f);
  57. uv = abs(frac(uv) - 0.5);
  58. $precision2 c0 = i + $precision2(0.0, 0.0);
  59. $precision2 c1 = i + $precision2(1.0, 0.0);
  60. $precision2 c2 = i + $precision2(0.0, 1.0);
  61. $precision2 c3 = i + $precision2(1.0, 1.0);
  62. $precision r0 = Unity_SimpleNoise_RandomValue_$precision(c0);
  63. $precision r1 = Unity_SimpleNoise_RandomValue_$precision(c1);
  64. $precision r2 = Unity_SimpleNoise_RandomValue_$precision(c2);
  65. $precision r3 = Unity_SimpleNoise_RandomValue_$precision(c3);
  66. $precision bottomOfGrid = Unity_SimpleNnoise_Interpolate_$precision(r0, r1, f.x);
  67. $precision topOfGrid = Unity_SimpleNnoise_Interpolate_$precision(r2, r3, f.x);
  68. $precision t = Unity_SimpleNnoise_Interpolate_$precision(bottomOfGrid, topOfGrid, f.y);
  69. return t;
  70. }"));
  71. base.GenerateNodeFunction(registry, generationMode);
  72. }
  73. }
  74. }