| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- Shader "Lineage/URP/ice"
- {
- Properties
- {
- [Header(Texture)]
- [Enum(Off,0,On,1)]_Zwrite("Zwrite",int)=0
- _MainTex("RGB(diffuse)),A:(OA))", 2D) = "white" {}
- [Normal]_Normal("normal",2D)="bump"{}
- _SpecTex("RGB(SpecTex),A(SpecTex_pow)",2D)="white"{}
- _EmiTex("RGB:emisstion",2D)="black"{}
- _Cubmap("Cubmap",Cube)="_skybox"{}
- [Header(Diffuse)]
- [HDR]_MainCol("diffuseColor",color) = (1,1,1,1)
- _EnvDiffInt("EnvDiffInt",range(0,1))=0.2
- _EnvUpCol("topColor",color)=(1,1,1,1)
- _EnvSideCol("SideColor",color)=(0.5,0.5,0.5,1)
- _EnvDownCol("DownColor",color)=(1,1,1,1)
- [Header(specular)]
- [PowerSlider(0.5)]_SpecPow("SpecPow",range(1,200))=10
- _EnvSpecInt("EnvSpecInt",range(0,5))=1
- _FresnelPow("FresnelPow",range(0,10))=1
- _CubemapMip("CubemapMip",range(1,7))=0
- [Header(Emission)]
- [HDR] _EmiCol("emission",color)=(1,1,1,1)
- _EmitInt("emissionIntensity",Range(1,10))=1
- _mask("mask",2D) = "white" {}
- // // _dissolve("溶解贴图",2D) = "white" {}
- // // _CutOffIntensity("溶解强度",range(0,1))=0
- // _CufOffSoft("软硬",range(0,0.5))=0
- _NormalScale("normalScale",range(0,1.5))=1
- _Light("LightPosition",vector)=(0,0,0,0)
- _distor("distorIntensity ",range(0,1))=0
- }
- SubShader
- {
- Tags { "Queue"="Transparent" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" }
- LOD 100
- //
- Blend SrcAlpha OneMinusSrcAlpha
- Pass
- {
- // Tags{"LightMode"="ShadowCaster"}
- ZWrite [_Zwrite]
- // ZTest LEqual
- HLSLPROGRAM
- // Required to compile gles 2.0 with standard srp library
- #pragma prefer_hlslcc gles
- #pragma exclude_renderers d3d11_9x
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_fog
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
- struct Attributes
- {
- float4 positionOS : POSITION;
- float2 uv : TEXCOORD0;
- float4 normal :NORMAL;
- float4 tangent:TANGENT;
- };
- struct Varyings
- {
- float4 positionCS : SV_POSITION;
- float4 uv : TEXCOORD0;
- float4 posWS : TEXCOORD1;//世界空间顶点坐标
- float4 nDirWS : TEXCOORD2;//法线
- float3 tDirWS : TEXCOORD3;//切线
- float3 bDirWS : TEXCOORD4;//负切线
- float4 uv2:TEXCOORD5;
- float2 normaluv:TEXCOORD6;
- };
- CBUFFER_START(UnityPerMaterial)
- float4 _MainTex_ST,_dissolve_ST,_Normal_ST,_EmiTex_ST;
- half4 _MainCol,_EnvUpCol,_EnvSideCol,_EnvDownCol,_EmiCol;
- half _EnvDiffInt,_CubemapMip;
- half4 _Light;
- float _SpecPow,_EnvSpecInt,_FresnelPow,_EmitInt,_CutOffIntensity,_distor,_NormalScale;
- CBUFFER_END
- TEXTURE2D (_MainTex);SAMPLER(sampler_MainTex);
- TEXTURE2D (_Normal);SAMPLER(sampler_Normal);
- TEXTURE2D (_SpecTex);SAMPLER(sampler_SpecTex);
- TEXTURE2D (_mask);SAMPLER(sampler_mask);
- TEXTURE2D (_dissolve);SAMPLER(sampler_dissolve);
- TEXTURE2D (_CameraOpaqueTexture); SAMPLER(sampler_CameraOpaqueTexture); //
-
-
- TEXTURE2D (_EmiTex);SAMPLER(sampler_EmiTex);
- TEXTURECUBE (_Cubmap);SAMPLER(sampler_Cubmap);
-
- Varyings vert(Attributes v)
- {
- Varyings o = (Varyings)0;
- o.uv2.xy=v.uv;
- o.uv2.zw= v.uv;
- o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
- o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
- o.uv.zw=TRANSFORM_TEX(v.uv, _EmiTex);
- o.normaluv=TRANSFORM_TEX(v.uv, _Normal);
- o.posWS.xyz=TransformObjectToWorld(v.positionOS.xyz);//位置OS>WS
- o.nDirWS.xyz=TransformObjectToWorldNormal(v.normal.xyz);
- o.tDirWS.xyz = TransformObjectToWorldDir(v.tangent.xyz);//本地切线>世界
- half sign = v.tangent.w * GetOddNegativeScale();
- o.bDirWS.xyz =normalize (cross(o.nDirWS.xyz, o.tDirWS) * sign);
- return o;
- }
- half4 frag(Varyings i) : SV_Target
- {
- //采样扭曲
- i.uv2.xy+=_Time.y*0.01;
- half distor = SAMPLE_TEXTURE2D(_SpecTex, sampler_SpecTex, i.uv2.xy).r;
- half2 distorintensity=lerp(i.uv.xy,i.uv.xy*distor.r,_distor);
- //向量准备
- //法线采样解码 TBN矩阵将切线空间法线转世界空间
- // UnpackNormalScale 区别于 UnpackNormal 多了个参数调节发现强度
- half3 normalMap = UnpackNormalScale(SAMPLE_TEXTURE2D(_Normal, sampler_Normal, i.normaluv),_NormalScale);
- half3 normalWS = mul(normalMap,half3x3(i.tDirWS.xyz, i.bDirWS.xyz, i.nDirWS.xyz));
-
- float2 ScreenUV=i.positionCS.xy/_ScreenParams.xy;
- float3 VdirWS=normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
- float3 VRdirWS=reflect(-VdirWS,normalWS);//反射
- //获取光源
- Light mainLight = GetMainLight();
- // half3 lDirWS=normalize(mainLight.direction);//灯光位置
- half3 lDirWS= _Light.xyz;
- half3 lrDirWS=reflect(-lDirWS,normalWS); //根据入射光方向向量 I ,和顶点法向量 N ,计算反射光方向
- //准备点击
- float NdotL=dot(normalWS,lDirWS);//漫反射
- float vDotr=dot(VdirWS,lrDirWS);//phong 高光
- float vDotN=dot(VdirWS,normalWS);//菲尼尔
- //纹理采样
-
- half4 mask = SAMPLE_TEXTURE2D(_mask,sampler_mask, i.uv.xy);
- half4 var_MainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, distorintensity);
- half4 var_SpecTex = SAMPLE_TEXTURE2D(_SpecTex, sampler_SpecTex, i.uv.xy);
- half2 GrafTexRUV=ScreenUV+ScreenUV*normalWS.xy*_Light.w;
- half4 GrafTexR=SAMPLE_TEXTURE2D(_CameraOpaqueTexture,sampler_CameraOpaqueTexture,GrafTexRUV);
- half4 A;
- // A= lerp(GrafTexR,var_MainTex,mask*_Light.w);
- // return GrafTexR*var_SpecTex;
- half4 var_EmiTex = SAMPLE_TEXTURE2D(_EmiTex, sampler_EmiTex, distorintensity);
- // return var_EmiTex.x;
- half3 var_Cubmap = SAMPLE_TEXTURECUBE_LOD(_Cubmap, sampler_Cubmap, VRdirWS,lerp(_CubemapMip,0,var_SpecTex.a)).rgb;//lerp(_CubemapMip,0,var_SpecTex.a
- //光照模型(直接光照)
- float3 baseCol=var_MainTex.xyz*_MainCol.xyz;
- float3 speCol=var_SpecTex.rgb;
- float lambert=max(00.2,NdotL);
- float specPow=lerp(1,_SpecPow,var_SpecTex.a);
- // specPow*=_EmiCol;
- var_Cubmap*=var_SpecTex.a;
- //高光
- float phong=pow(max(0,vDotr),specPow);
- float3 dirLighting=((baseCol*lambert+phong*speCol)*mainLight.color);// *****mainLight.color灯光颜色亮度*****
- //环境光
- float upMask=max(0,normalWS.g);
- float downMask=max(0,-normalWS.g);
- float sideMask=1-upMask-downMask;
- float3 encCol=_EnvUpCol.rgb*upMask+_EnvSideCol.rgb*sideMask+_EnvDownCol.rgb*downMask;
- float3 envDiff=baseCol*encCol*_EnvDiffInt;
- // return half4(envDiff,1);
- //环境镜面反射
- float frsnel= pow(max(0,1-vDotN),_FresnelPow);
- float3 envSpec=var_Cubmap*frsnel*_EnvSpecInt;// 地裂不需要
- // float3 envSpec=0;
- //漫反射 镜面反射混合
- float occlusion=var_MainTex.a;//环境遮挡
-
- float3 envLighting=(envDiff+envSpec)*occlusion;
- //自发光
- float emisSinTime=(sin((_Time.z))+1.5);
- float3 emission=var_EmiTex.rgb*_EmitInt*_EmiCol.rgb*emisSinTime*(envSpec);
- //溶解 -0.2为了让面板0 到1 更好看
- // float alpha2=smoothstep((_CutOffIntensity-0.2),_CutOffIntensity-0.2+_CufOffSoft,cutoffTex.r);
- //最终混合
- float3 finaRGB=dirLighting+envLighting+emission*1;
- half4 c=1;
- c.rgb=finaRGB+frsnel;
- // return saturate(max(0.4,frsnel*var_SpecTex.a));
- half GrabLerp=saturate(max(0.6,frsnel*var_SpecTex.a*mask.r));
- c.rgb=lerp(c.rgb,GrafTexR.rgb,GrabLerp);
- // c.a*=alpha2;
- return c;
- }
- ENDHLSL
- }
- }
- }
|