DiffuseAndSpecularFromMetallicNode.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using System;
  4. using UnityEditor;
  5. namespace AmplifyShaderEditor
  6. {
  7. [Serializable]
  8. [NodeAttributes( "Diffuse And Specular From Metallic", "Miscellaneous", "Computes Diffuse and Specular color values from Base Color and Metallic." )]
  9. public class DiffuseAndSpecularFromMetallicNode : ParentNode
  10. {
  11. private const string FuncHeader = "ASEComputeDiffuseAndFresnel0( {0}, {1}, {2}, {3} )";
  12. private readonly string[] FuncBody =
  13. {
  14. "float3 ASEComputeDiffuseAndFresnel0( float3 baseColor, float metallic, out float3 specularColor, out float oneMinusReflectivity )\n",
  15. "{\n",
  16. "\t#ifdef UNITY_COLORSPACE_GAMMA\n",
  17. "\t\tconst float dielectricF0 = 0.220916301;\n",
  18. "\t#else\n",
  19. "\t\tconst float dielectricF0 = 0.04;\n",
  20. "\t#endif\n",
  21. "\tspecularColor = lerp( dielectricF0.xxx, baseColor, metallic );\n",
  22. "\toneMinusReflectivity = 1.0 - metallic;\n",
  23. "\treturn baseColor * oneMinusReflectivity;\n",
  24. "}\n"
  25. };
  26. protected override void CommonInit( int uniqueId )
  27. {
  28. base.CommonInit( uniqueId );
  29. AddInputPort( WirePortDataType.FLOAT3, false, "Base Color" );
  30. AddInputPort( WirePortDataType.FLOAT, false, "Metallic" );
  31. AddOutputPort( WirePortDataType.FLOAT3, "Diffuse Color" );
  32. AddOutputPort( WirePortDataType.FLOAT3, "Specular Color" );
  33. AddOutputPort( WirePortDataType.FLOAT, "One Minus Reflectivity" );
  34. m_previewShaderGUID = "c7c4485750948a045b5dab0985896e17";
  35. }
  36. public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
  37. {
  38. if ( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) )
  39. {
  40. return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory );
  41. }
  42. string baseColor = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
  43. string metallic = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector );
  44. string specularColorVar = "specularColor" + OutputId;
  45. string oneMinusReflectivityVar = "oneMinusReflectivity" + OutputId;
  46. string diffuseColorVar = "diffuseColor" + OutputId;
  47. dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, specularColorVar, "(0).xxx" );
  48. dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, oneMinusReflectivityVar, "0" );
  49. dataCollector.AddFunction( FuncBody[ 0 ], FuncBody, false );
  50. RegisterLocalVariable( 0, string.Format( FuncHeader, baseColor, metallic, specularColorVar, oneMinusReflectivityVar ), ref dataCollector, diffuseColorVar );
  51. m_outputPorts[ 0 ].SetLocalValue( diffuseColorVar, dataCollector.PortCategory );
  52. m_outputPorts[ 1 ].SetLocalValue( specularColorVar, dataCollector.PortCategory );
  53. m_outputPorts[ 2 ].SetLocalValue( oneMinusReflectivityVar, dataCollector.PortCategory );
  54. return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory );
  55. }
  56. }
  57. }