VFX_ice.shader 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. Shader "Lineage/URP/ice"
  2. {
  3. Properties
  4. {
  5. [Header(Texture)]
  6. [Enum(Off,0,On,1)]_Zwrite("Zwrite",int)=0
  7. _MainTex("RGB(diffuse)),A:(OA))", 2D) = "white" {}
  8. [Normal]_Normal("normal",2D)="bump"{}
  9. _SpecTex("RGB(SpecTex),A(SpecTex_pow)",2D)="white"{}
  10. _EmiTex("RGB:emisstion",2D)="black"{}
  11. _Cubmap("Cubmap",Cube)="_skybox"{}
  12. [Header(Diffuse)]
  13. [HDR]_MainCol("diffuseColor",color) = (1,1,1,1)
  14. _EnvDiffInt("EnvDiffInt",range(0,1))=0.2
  15. _EnvUpCol("topColor",color)=(1,1,1,1)
  16. _EnvSideCol("SideColor",color)=(0.5,0.5,0.5,1)
  17. _EnvDownCol("DownColor",color)=(1,1,1,1)
  18. [Header(specular)]
  19. [PowerSlider(0.5)]_SpecPow("SpecPow",range(1,200))=10
  20. _EnvSpecInt("EnvSpecInt",range(0,5))=1
  21. _FresnelPow("FresnelPow",range(0,10))=1
  22. _CubemapMip("CubemapMip",range(1,7))=0
  23. [Header(Emission)]
  24. [HDR] _EmiCol("emission",color)=(1,1,1,1)
  25. _EmitInt("emissionIntensity",Range(1,10))=1
  26. _mask("mask",2D) = "white" {}
  27. // // _dissolve("溶解贴图",2D) = "white" {}
  28. // // _CutOffIntensity("溶解强度",range(0,1))=0
  29. // _CufOffSoft("软硬",range(0,0.5))=0
  30. _NormalScale("normalScale",range(0,1.5))=1
  31. _Light("LightPosition",vector)=(0,0,0,0)
  32. _distor("distorIntensity ",range(0,1))=0
  33. }
  34. SubShader
  35. {
  36. Tags { "Queue"="Transparent" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" }
  37. LOD 100
  38. //
  39. Blend SrcAlpha OneMinusSrcAlpha
  40. Pass
  41. {
  42. // Tags{"LightMode"="ShadowCaster"}
  43. ZWrite [_Zwrite]
  44. // ZTest LEqual
  45. HLSLPROGRAM
  46. // Required to compile gles 2.0 with standard srp library
  47. #pragma prefer_hlslcc gles
  48. #pragma exclude_renderers d3d11_9x
  49. #pragma vertex vert
  50. #pragma fragment frag
  51. #pragma multi_compile_fog
  52. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
  53. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  54. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  55. struct Attributes
  56. {
  57. float4 positionOS : POSITION;
  58. float2 uv : TEXCOORD0;
  59. float4 normal :NORMAL;
  60. float4 tangent:TANGENT;
  61. };
  62. struct Varyings
  63. {
  64. float4 positionCS : SV_POSITION;
  65. float4 uv : TEXCOORD0;
  66. float4 posWS : TEXCOORD1;//世界空间顶点坐标
  67. float4 nDirWS : TEXCOORD2;//法线
  68. float3 tDirWS : TEXCOORD3;//切线
  69. float3 bDirWS : TEXCOORD4;//负切线
  70. float4 uv2:TEXCOORD5;
  71. float2 normaluv:TEXCOORD6;
  72. };
  73. CBUFFER_START(UnityPerMaterial)
  74. float4 _MainTex_ST,_dissolve_ST,_Normal_ST,_EmiTex_ST;
  75. half4 _MainCol,_EnvUpCol,_EnvSideCol,_EnvDownCol,_EmiCol;
  76. half _EnvDiffInt,_CubemapMip;
  77. half4 _Light;
  78. float _SpecPow,_EnvSpecInt,_FresnelPow,_EmitInt,_CutOffIntensity,_distor,_NormalScale;
  79. CBUFFER_END
  80. TEXTURE2D (_MainTex);SAMPLER(sampler_MainTex);
  81. TEXTURE2D (_Normal);SAMPLER(sampler_Normal);
  82. TEXTURE2D (_SpecTex);SAMPLER(sampler_SpecTex);
  83. TEXTURE2D (_mask);SAMPLER(sampler_mask);
  84. TEXTURE2D (_dissolve);SAMPLER(sampler_dissolve);
  85. TEXTURE2D (_CameraOpaqueTexture); SAMPLER(sampler_CameraOpaqueTexture); //
  86. TEXTURE2D (_EmiTex);SAMPLER(sampler_EmiTex);
  87. TEXTURECUBE (_Cubmap);SAMPLER(sampler_Cubmap);
  88. Varyings vert(Attributes v)
  89. {
  90. Varyings o = (Varyings)0;
  91. o.uv2.xy=v.uv;
  92. o.uv2.zw= v.uv;
  93. o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
  94. o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
  95. o.uv.zw=TRANSFORM_TEX(v.uv, _EmiTex);
  96. o.normaluv=TRANSFORM_TEX(v.uv, _Normal);
  97. o.posWS.xyz=TransformObjectToWorld(v.positionOS.xyz);//位置OS>WS
  98. o.nDirWS.xyz=TransformObjectToWorldNormal(v.normal.xyz);
  99. o.tDirWS.xyz = TransformObjectToWorldDir(v.tangent.xyz);//本地切线>世界
  100. half sign = v.tangent.w * GetOddNegativeScale();
  101. o.bDirWS.xyz =normalize (cross(o.nDirWS.xyz, o.tDirWS) * sign);
  102. return o;
  103. }
  104. half4 frag(Varyings i) : SV_Target
  105. {
  106. //采样扭曲
  107. i.uv2.xy+=_Time.y*0.01;
  108. half distor = SAMPLE_TEXTURE2D(_SpecTex, sampler_SpecTex, i.uv2.xy).r;
  109. half2 distorintensity=lerp(i.uv.xy,i.uv.xy*distor.r,_distor);
  110. //向量准备
  111. //法线采样解码 TBN矩阵将切线空间法线转世界空间
  112. // UnpackNormalScale 区别于 UnpackNormal 多了个参数调节发现强度
  113. half3 normalMap = UnpackNormalScale(SAMPLE_TEXTURE2D(_Normal, sampler_Normal, i.normaluv),_NormalScale);
  114. half3 normalWS = mul(normalMap,half3x3(i.tDirWS.xyz, i.bDirWS.xyz, i.nDirWS.xyz));
  115. float2 ScreenUV=i.positionCS.xy/_ScreenParams.xy;
  116. float3 VdirWS=normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
  117. float3 VRdirWS=reflect(-VdirWS,normalWS);//反射
  118. //获取光源
  119. Light mainLight = GetMainLight();
  120. // half3 lDirWS=normalize(mainLight.direction);//灯光位置
  121. half3 lDirWS= _Light.xyz;
  122. half3 lrDirWS=reflect(-lDirWS,normalWS); //根据入射光方向向量 I ,和顶点法向量 N ,计算反射光方向
  123. //准备点击
  124. float NdotL=dot(normalWS,lDirWS);//漫反射
  125. float vDotr=dot(VdirWS,lrDirWS);//phong 高光
  126. float vDotN=dot(VdirWS,normalWS);//菲尼尔
  127. //纹理采样
  128. half4 mask = SAMPLE_TEXTURE2D(_mask,sampler_mask, i.uv.xy);
  129. half4 var_MainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, distorintensity);
  130. half4 var_SpecTex = SAMPLE_TEXTURE2D(_SpecTex, sampler_SpecTex, i.uv.xy);
  131. half2 GrafTexRUV=ScreenUV+ScreenUV*normalWS.xy*_Light.w;
  132. half4 GrafTexR=SAMPLE_TEXTURE2D(_CameraOpaqueTexture,sampler_CameraOpaqueTexture,GrafTexRUV);
  133. half4 A;
  134. // A= lerp(GrafTexR,var_MainTex,mask*_Light.w);
  135. // return GrafTexR*var_SpecTex;
  136. half4 var_EmiTex = SAMPLE_TEXTURE2D(_EmiTex, sampler_EmiTex, distorintensity);
  137. // return var_EmiTex.x;
  138. half3 var_Cubmap = SAMPLE_TEXTURECUBE_LOD(_Cubmap, sampler_Cubmap, VRdirWS,lerp(_CubemapMip,0,var_SpecTex.a)).rgb;//lerp(_CubemapMip,0,var_SpecTex.a
  139. //光照模型(直接光照)
  140. float3 baseCol=var_MainTex.xyz*_MainCol.xyz;
  141. float3 speCol=var_SpecTex.rgb;
  142. float lambert=max(00.2,NdotL);
  143. float specPow=lerp(1,_SpecPow,var_SpecTex.a);
  144. // specPow*=_EmiCol;
  145. var_Cubmap*=var_SpecTex.a;
  146. //高光
  147. float phong=pow(max(0,vDotr),specPow);
  148. float3 dirLighting=((baseCol*lambert+phong*speCol)*mainLight.color);// *****mainLight.color灯光颜色亮度*****
  149. //环境光
  150. float upMask=max(0,normalWS.g);
  151. float downMask=max(0,-normalWS.g);
  152. float sideMask=1-upMask-downMask;
  153. float3 encCol=_EnvUpCol.rgb*upMask+_EnvSideCol.rgb*sideMask+_EnvDownCol.rgb*downMask;
  154. float3 envDiff=baseCol*encCol*_EnvDiffInt;
  155. // return half4(envDiff,1);
  156. //环境镜面反射
  157. float frsnel= pow(max(0,1-vDotN),_FresnelPow);
  158. float3 envSpec=var_Cubmap*frsnel*_EnvSpecInt;// 地裂不需要
  159. // float3 envSpec=0;
  160. //漫反射 镜面反射混合
  161. float occlusion=var_MainTex.a;//环境遮挡
  162. float3 envLighting=(envDiff+envSpec)*occlusion;
  163. //自发光
  164. float emisSinTime=(sin((_Time.z))+1.5);
  165. float3 emission=var_EmiTex.rgb*_EmitInt*_EmiCol.rgb*emisSinTime*(envSpec);
  166. //溶解 -0.2为了让面板0 到1 更好看
  167. // float alpha2=smoothstep((_CutOffIntensity-0.2),_CutOffIntensity-0.2+_CufOffSoft,cutoffTex.r);
  168. //最终混合
  169. float3 finaRGB=dirLighting+envLighting+emission*1;
  170. half4 c=1;
  171. c.rgb=finaRGB+frsnel;
  172. // return saturate(max(0.4,frsnel*var_SpecTex.a));
  173. half GrabLerp=saturate(max(0.6,frsnel*var_SpecTex.a*mask.r));
  174. c.rgb=lerp(c.rgb,GrafTexR.rgb,GrabLerp);
  175. // c.a*=alpha2;
  176. return c;
  177. }
  178. ENDHLSL
  179. }
  180. }
  181. }