masked.shader 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. Shader "Custom/GalaxyMask"
  2. {
  3. Properties
  4. {
  5. _MainTex("Texture", 2D) = "white" {}
  6. _MainColor("Main Color", Color) = (1,1,1,1)
  7. _MaskTex("Mask Texture", 2D) = "white" {}
  8. _MaskReplace("Mask Replace Texture", 2D) = "white" {}
  9. _MaskColor("Mask Color", Color) = (1,1,1,1)
  10. _MaskScale("Mask Scale", vector) = (1,1,1,1)
  11. _Speed("Mask Texture Speed", float) = 1.0
  12. }
  13. SubShader
  14. {
  15. // Regular color & lighting pass
  16. Pass
  17. {
  18. Tags
  19. {
  20. "LightMode" = "ForwardBase"
  21. }
  22. CGPROGRAM
  23. #pragma vertex vert
  24. #pragma fragment frag
  25. #pragma multi_compile_fwdbase
  26. #include "AutoLight.cginc"
  27. #include "UnityCG.cginc"
  28. // Properties
  29. sampler2D _MainTex;
  30. sampler2D _MaskTex;
  31. sampler2D _MaskReplace;
  32. float4 _MaskScale;
  33. float4 _MaskColor;
  34. float4 _MainColor;
  35. float _Speed;
  36. float4 _LightColor0; // provided by Unity
  37. struct vertexInput
  38. {
  39. float4 vertex : POSITION;
  40. float3 normal : NORMAL;
  41. float3 texCoord : TEXCOORD0;
  42. };
  43. struct vertexOutput
  44. {
  45. float4 pos : SV_POSITION;
  46. float3 normal : NORMAL;
  47. float3 texCoord : TEXCOORD0;
  48. LIGHTING_COORDS(1,2)
  49. };
  50. vertexOutput vert(vertexInput input)
  51. {
  52. vertexOutput output;
  53. output.pos = UnityObjectToClipPos(input.vertex);
  54. output.normal = UnityObjectToWorldNormal(input.normal);
  55. output.texCoord = input.texCoord;
  56. return output;
  57. }
  58. float4 frag(vertexOutput input) : COLOR
  59. {
  60. // lighting
  61. float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
  62. float lightDot = saturate(dot(input.normal, lightDir));
  63. float3 lighting = lightDot * _LightColor0.rgb;
  64. lighting += ShadeSH9(half4(input.normal,1)); // ambient lighting
  65. // albedo
  66. float4 albedo = tex2D(_MainTex, input.texCoord.xy);
  67. // mask
  68. float isMask = tex2D(_MaskTex, input.texCoord.xy); // == _MaskColor;
  69. // screen-space coordinates
  70. float2 screenPos = ComputeScreenPos(input.pos).xy / _ScreenParams.xy;
  71. // convert to texture-space coordinates
  72. float2 maskPos = screenPos * _MaskScale;
  73. // scroll sample position
  74. maskPos += _Time * _Speed;
  75. // sample galaxy texture
  76. float4 mask = tex2D(_MaskReplace, maskPos);
  77. albedo = (1-isMask)*(albedo+_MainColor) + isMask*mask;
  78. lighting = (1-isMask)*lighting + isMask*float4(1,1,1,1);
  79. // final
  80. float3 rgb = albedo.rgb * lighting;
  81. return float4(rgb, 1.0);
  82. }
  83. ENDCG
  84. }
  85. }
  86. Fallback "Diffuse"
  87. }