Skybox Gradient.shader 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. Shader "Skybox Gradient"
  2. {
  3. Properties
  4. {
  5. _Top("Top", Color) = (1,1,1,0)
  6. _Bottom("Bottom", Color) = (0,0,0,0)
  7. _mult("mult", Float) = 1
  8. _pwer("pwer", Float) = 1
  9. [Toggle(_SCREENSPACE_ON)] _Screenspace("Screen space", Float) = 0
  10. }
  11. SubShader
  12. {
  13. Tags { "RenderType"="Opaque" }
  14. LOD 100
  15. CGINCLUDE
  16. #pragma target 3.0
  17. ENDCG
  18. Blend Off
  19. Cull Back
  20. ColorMask RGBA
  21. ZWrite On
  22. ZTest LEqual
  23. Offset 0 , 0
  24. Pass
  25. {
  26. Name "Unlit"
  27. Tags { "LightMode"="ForwardBase" }
  28. CGPROGRAM
  29. #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
  30. #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
  31. #endif
  32. #pragma vertex vert
  33. #pragma fragment frag
  34. #pragma multi_compile_instancing
  35. #include "UnityCG.cginc"
  36. #pragma shader_feature_local _SCREENSPACE_ON
  37. struct appdata
  38. {
  39. float4 vertex : POSITION;
  40. float4 color : COLOR;
  41. UNITY_VERTEX_INPUT_INSTANCE_ID
  42. };
  43. struct v2f
  44. {
  45. float4 vertex : SV_POSITION;
  46. #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
  47. float3 worldPos : TEXCOORD0;
  48. #endif
  49. UNITY_VERTEX_INPUT_INSTANCE_ID
  50. UNITY_VERTEX_OUTPUT_STEREO
  51. float4 ase_texcoord1 : TEXCOORD1;
  52. float4 ase_texcoord2 : TEXCOORD2;
  53. };
  54. uniform float4 _Bottom;
  55. uniform float4 _Top;
  56. uniform float _mult;
  57. uniform float _pwer;
  58. v2f vert ( appdata v )
  59. {
  60. v2f o;
  61. UNITY_SETUP_INSTANCE_ID(v);
  62. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  63. UNITY_TRANSFER_INSTANCE_ID(v, o);
  64. float4 ase_clipPos = UnityObjectToClipPos(v.vertex);
  65. float4 screenPos = ComputeScreenPos(ase_clipPos);
  66. o.ase_texcoord2 = screenPos;
  67. o.ase_texcoord1 = v.vertex;
  68. float3 vertexValue = float3(0, 0, 0);
  69. #if ASE_ABSOLUTE_VERTEX_POS
  70. vertexValue = v.vertex.xyz;
  71. #endif
  72. vertexValue = vertexValue;
  73. #if ASE_ABSOLUTE_VERTEX_POS
  74. v.vertex.xyz = vertexValue;
  75. #else
  76. v.vertex.xyz += vertexValue;
  77. #endif
  78. o.vertex = UnityObjectToClipPos(v.vertex);
  79. #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
  80. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  81. #endif
  82. return o;
  83. }
  84. fixed4 frag (v2f i ) : SV_Target
  85. {
  86. UNITY_SETUP_INSTANCE_ID(i);
  87. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  88. fixed4 finalColor;
  89. #ifdef ASE_NEEDS_FRAG_WORLD_POSITION
  90. float3 WorldPosition = i.worldPos;
  91. #endif
  92. float4 screenPos = i.ase_texcoord2;
  93. float4 ase_screenPosNorm = screenPos / screenPos.w;
  94. ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5;
  95. #ifdef _SCREENSPACE_ON
  96. float staticSwitch13 = ase_screenPosNorm.y;
  97. #else
  98. float staticSwitch13 = i.ase_texcoord1.xyz.y;
  99. #endif
  100. float4 lerpResult3 = lerp( _Bottom , _Top , pow( saturate( ( staticSwitch13 * _mult ) ) , _pwer ));
  101. finalColor = lerpResult3;
  102. return finalColor;
  103. }
  104. ENDCG
  105. }
  106. }
  107. }