Simple Displacement FX.shader 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. Shader "Lux SRP Displacement/Simple Displacement"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Displacement Source Texture", 2D) = "bump" {}
  6. [Toggle(_DYNAMICALPHA)]
  7. _DynamicAlpha ("Dynamic Alpha", Float) = 0
  8. _Alpha (" Alpha", Range(0,1)) = 1
  9. [Toggle(_NORMAL)]
  10. _RotateNormal ("Rotate Normal", Float) = 0
  11. [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend Mode", Float) = 5
  12. [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend Mode", Float) = 10
  13. }
  14. SubShader
  15. {
  16. Tags { "RenderType"="Transparent" "Queue"="Transparent" "RenderPipeline" = "UniversalPipeline" }
  17. ZWrite Off
  18. Blend [_SrcBlend] [_DstBlend]
  19. LOD 100
  20. Pass
  21. {
  22. Name "LuxGrassDisplacementFX"
  23. Tags{"LightMode" = "LuxGrassDisplacementFX"}
  24. HLSLPROGRAM
  25. #pragma vertex SimpleDisplacementFXVertex
  26. #pragma fragment SimpleDisplacementFXFragment
  27. #pragma shader_feature_local _DYNAMICALPHA
  28. #pragma shader_feature_local _NORMAL
  29. //--------------------------------------
  30. // GPU Instancing
  31. #pragma multi_compile_instancing
  32. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  33. struct VertexInput
  34. {
  35. float3 positionOS : POSITION;
  36. #if defined _NORMAL
  37. float3 normalOS : NORMAL;
  38. float4 tangentOS : TANGENT;
  39. #endif
  40. half4 color : COLOR;
  41. float2 uv : TEXCOORD0;
  42. UNITY_VERTEX_INPUT_INSTANCE_ID
  43. };
  44. struct VertexOutput
  45. {
  46. float2 uv : TEXCOORD0;
  47. #if defined _NORMAL
  48. half3 normalWS : TEXCOORD1;
  49. half3 tangentWS : TEXCOORD2;
  50. half3 bitangentWS : TEXCOORD3;
  51. #endif
  52. half4 color : TEXCOORD4;
  53. float4 vertex : SV_POSITION;
  54. UNITY_VERTEX_INPUT_INSTANCE_ID
  55. };
  56. CBUFFER_START(UnityPerMaterial)
  57. //half _Alpha;
  58. CBUFFER_END
  59. #if defined (_DYNAMICALPHA)
  60. UNITY_INSTANCING_BUFFER_START(Props)
  61. UNITY_DEFINE_INSTANCED_PROP(half, _Alpha)
  62. UNITY_INSTANCING_BUFFER_END(Props)
  63. #endif
  64. sampler2D _MainTex;
  65. VertexOutput SimpleDisplacementFXVertex (VertexInput input)
  66. {
  67. VertexOutput output = (VertexOutput)0;
  68. UNITY_SETUP_INSTANCE_ID(input);
  69. UNITY_TRANSFER_INSTANCE_ID(input, output);
  70. VertexPositionInputs vertexPosition = GetVertexPositionInputs(input.positionOS.xyz);
  71. output.vertex = vertexPosition.positionCS;
  72. output.uv = input.uv;
  73. output.color = input.color;
  74. #if defined _NORMAL
  75. VertexNormalInputs vertexTBN = GetVertexNormalInputs(input.normalOS, input.tangentOS);
  76. output.normalWS = vertexTBN.normalWS;
  77. output.tangentWS = vertexTBN.tangentWS;
  78. output.bitangentWS = vertexTBN.bitangentWS;
  79. #endif
  80. return output;
  81. }
  82. half4 SimpleDisplacementFXFragment (VertexOutput input) : SV_Target
  83. {
  84. UNITY_SETUP_INSTANCE_ID(input);
  85. half4 col = tex2D(_MainTex, input.uv);
  86. col.a *= input.color.a
  87. #if defined(_DYNAMICALPHA)
  88. * UNITY_ACCESS_INSTANCED_PROP(Props, _Alpha)
  89. #endif
  90. ;
  91. #if defined(_NORMAL)
  92. col.rgb = col.rgb * 2 - 1; // unpack
  93. col.rgb = TransformTangentToWorld(col.rgb, half3x3(input.tangentWS.xyz, input.bitangentWS.xyz, input.normalWS.xyz));
  94. col.rgb = col.rbg * 0.5 + 0.5; // swizzle to "tangent space" and repack
  95. #endif
  96. return col;
  97. }
  98. ENDHLSL
  99. }
  100. }
  101. }