javaee论坛

普通会员

225648

帖子

332

回复

346

积分

楼主
发表于 2019-11-03 06:55:52 | 查看: 1066 | 回复: 2

UnityShader窗前雨滴效果窗前雨滴效果(截图)实现过程0.栅格化1.绘制主要雨滴2.绘制尾迹3.尾迹塑形4.融合大雨滴和尾迹,并给雨滴添加模拟法线5.把雨滴法线用于采样背景贴图6.让整个雨滴动起来7.让雨滴滚动起来更有节奏8.加点基于格子的随机值9.添加斜率的变化,模拟风的效果10.多加几层不同大小的雨滴C#源码Shader源码

窗前雨滴效果(截图)

实现过程0.栅格化floataspectRatio=4.0;//每一行雨滴的宽高比floattileNum=5;//平铺数量uv*=fixed2(tileNum*aspectRatio,tileNum);//栅格化uvuv=frac(uv);uv-=0.5;1.绘制主要雨滴floatr=length(uv);r=smoothstep(0.2,0.1,r);returnfloat2(r,0.);uv.y*=aspectRatio;2.绘制尾迹//添加尾迹floattailTileNum=3.0;float2tailUV=uv*float2(1.0,tailTileNum);tailUV.y=frac(tailUV.y)-0.5;tailUV.x*=tailTileNum;floatrtail=length(tailUV);rtail=smoothstep(0.2,0.1,rtail);3.尾迹塑形//在雨滴上面总共有floatrtail=length(tailUV);//尾迹塑形rtail*=uv.y;//上面的y值大使得雨滴形状变小rtail=smoothstep(0.2,0.1,rtail);//切除掉大雨滴下面的部分rtail*=smoothstep(0.2,0.3,uv.y);//0.2以下的部分雨滴太大,切掉4.融合大雨滴和尾迹,并给雨滴添加模拟法线float2allUV=float2(rtail*tailUV+r*uv);5.把雨滴法线用于采样背景贴图fixed4finalColor=tex2D(_MainTex,uv+Rain(uv)*2.);6.让整个雨滴动起来fixed4finalColor=tex2D(_MainTex,uv+Rain(uv)*2.);7.让雨滴滚动起来更有节奏//这里是屏幕空间uv.y+=time*PI2/period/tileNum*0.45*0.55;//加点y轴移动//othercodefloatperiod=5;//secondpercirclefloatt=time*PI2/period;//这里是格子空间//此处uv值范围为(-0.5,0.5)uv.y+=sin(t+sin(t+sin(t)*0.55))*0.45;uv.y*=aspectRatio;8.加点基于格子的随机值fixed2idRand=Rand22(floor(uv));t+=idRand.x*PI2;//添加Y随机值/////uv.x+=(idRand.x-.5)*.6;//添加x轴随机偏移9.添加斜率的变化,模拟风的效果flaotDEG2RAD=3.14159/180;flaotratoteDeg=20.0*DEG2RAD;floats=sin(ratoteDeg);floatc=cos(ratoteDeg);float2x2rot=float2x2(c,-s,s,c);uv=mul(rot,uv);10.多加几层不同大小的雨滴rainUV+=Rains(uv,152.12,moveSpd);rainUV+=Rains(uv*2.32,25.23,moveSpd);C#源码usingUnityEngine;publicclassScreenRain:MonoBehaviour{[Range(0,1)]publicfloatblend=1;[Range(0,1)]publicfloatmoreRainAmount=1;publicboolwipe=true;[Range(0.1f,20f)]publicfloatwipeSizeX=0.8f;[Range(0.1f,20f)]publicfloatwipeSizeY=8.5f;publicbooldebugWipe=false;privateMaterialmtrl=null;privateintsrcTexPropId=0;privateintblendPropId=0;privateintwipeRTPropId=0;privateintwipeRTCanvasPropId=0;privateintwipeRTCanvas2PropId=0;privateintwipeScreenPosPropId=0;privateintwipeScreenSizePropId=0;privateintwipeSizePropId=0;privateintmoreRainAmountPropId=0;privateRenderTexturewipeRT=null;privateRenderTexturewipeRTCanvas=null;privateRenderTexturewipeRTCanvas2=null;privateVector2wipeScreenPos;privatevoidAwake(){mtrl=newMaterial(Shader.Find("Hidden/ScreenRain"));srcTexPropId=Shader.PropertyToID("_SrcTex");blendPropId=Shader.PropertyToID("_Blend");wipeRTPropId=Shader.PropertyToID("_WipeTex");wipeRTCanvasPropId=Shader.PropertyToID("_WipeCanvasTex");wipeRTCanvas2PropId=Shader.PropertyToID("_WipeCanvas2Tex");wipeScreenPosPropId=Shader.PropertyToID("_WipeScreenPos");wipeScreenSizePropId=Shader.PropertyToID("_WipeScreenSize");wipeSizePropId=Shader.PropertyToID("_WipeSize");moreRainAmountPropId=Shader.PropertyToID("_MoreRainAmount");wipeScreenPos=Vector2.one*-9000;}privatevoidUpdate(){if(wipe){if(Input.GetMouseButton(0)){//if(camera.gameObject.Instance.SetCamRainState==0){//return;//}wipeScreenPos=Input.mousePosition;}else{wipeScreenPos=Vector2.one*-9000;}}}privatevoidOnRenderImage(RenderTexturesrc,RenderTexturedest){if(mtrl==null||mtrl.shader==null||!mtrl.shader.isSupported){enabled=false;return;}if(wipe){if(wipeRT==null||!wipeRT.IsCreated()){DestroyWipeRT();wipeRT=newRenderTexture(src.width,src.height,0,RenderTextureFormat.Default);Graphics.Blit(Texture2D.blackTexture,wipeRT);}if(wipeRTCanvas==null||!wipeRTCanvas.IsCreated()){DestroyWipeRTCanvas();wipeRTCanvas=newRenderTexture(src.width,src.height,0,RenderTextureFormat.Default);wipeRTCanvas2=newRenderTexture(src.width,src.height,0,RenderTextureFormat.Default);Graphics.Blit(Texture2D.blackTexture,wipeRTCanvas);}mtrl.SetTexture(wipeRTPropId,wipeRT);mtrl.SetTexture(wipeRTCanvasPropId,wipeRTCanvas);mtrl.SetTexture(wipeRTCanvas2PropId,wipeRTCanvas2);mtrl.SetVector(wipeScreenPosPropId,wipeScreenPos);mtrl.SetVector(wipeScreenSizePropId,newVector4(Screen.width,Screen.height,0,0));mtrl.SetVector(wipeSizePropId,newVector4(wipeSizeX,wipeSizeY,0,0));Graphics.Blit(null,wipeRT,mtrl,2);Graphics.Blit(null,wipeRTCanvas,mtrl,3);Graphics.Blit(null,wipeRTCanvas2,mtrl,4);Graphics.Blit(wipeRTCanvas2,wipeRTCanvas);mtrl.EnableKeyword("WIPE");}else{DestroyWipeRT();DestroyWipeRTCanvas();mtrl.DisableKeyword("WIPE");}mtrl.SetFloat(moreRainAmountPropId,moreRainAmount);mtrl.SetTexture(srcTexPropId,src);mtrl.SetFloat(blendPropId,blend);intrtSizeScale=1;#ifUNITY_EDITORrtSizeScale=2;#elsertSizeScale=3;//性能更好#endifRenderTexturesrcRT=RenderTexture.GetTemporary(src.width/rtSizeScale,src.height/rtSizeScale,0,src.format);RenderTexturedestRT=RenderTexture.GetTemporary(srcRT.width,srcRT.height,0,srcRT.format);Graphics.Blit(src,srcRT);Graphics.Blit(srcRT,destRT,mtrl,0);Graphics.Blit(destRT,dest,mtrl,1);RenderTexture.ReleaseTemporary(srcRT);RenderTexture.ReleaseTemporary(destRT);}#ifUNITY_EDITOR//DebugprivatevoidOnGUI(){if(debugWipe){if(wipeRT!=null){GUI.DrawTexture(newRect(0,0,wipeRT.width/4,wipeRT.height/4),wipeRT,ScaleMode.ScaleAndCrop,false);}if(wipeRTCanvas!=null){GUI.DrawTexture(newRect(0,wipeRTCanvas.height/4,wipeRTCanvas.width/4,wipeRTCanvas.height/4),wipeRTCanvas,ScaleMode.ScaleAndCrop,false);}}}#endifprivatevoidOnDestroy(){if(mtrl!=null){DestroyImmediate(mtrl);mtrl=null;}DestroyWipeRT();DestroyWipeRTCanvas();}privatevoidOnDisable(){DestroyWipeRT();DestroyWipeRTCanvas();}privatevoidDestroyWipeRT(){if(wipeRT!=null){Destroy(wipeRT);wipeRT=null;}}privatevoidDestroyWipeRTCanvas(){if(wipeRTCanvas!=null){Destroy(wipeRTCanvas);wipeRTCanvas=null;}if(wipeRTCanvas2!=null){Destroy(wipeRTCanvas2);wipeRTCanvas2=null;}}}Shader源码Shader"Hidden/ScreenRain"{Properties{_MainTex("Texture",2D)="white"{}}SubShader{CullOffZWriteOffZTestAlwaysPass{CGPROGRAM#pragmavertexvert#pragmafragmentfrag#pragmatarget3.0#pragmamulti_compile_WIPE#include"UnityCG.cginc"structappdata{float4vertex:POSITION;};structv2f{float4pos:SV_POSITION;float4scrPos:TEXCOORD0;};sampler2D_MainTex;sampler2D_SrcTex;sampler2D_WipeCanvasTex;uniformhalf_MoreRainAmount;float3N13(floatp){float3p3=frac(float3(p,p,p)*float3(.1031,.11369,.13787));p3+=dot(p3,p3.yzx+19.19);returnfrac(float3((p3.x+p3.y)*p3.z,(p3.x+p3.z)*p3.y,(p3.y+p3.z)*p3.x));}float4N14(floatt){returnfrac(sin(t*float4(123.,1024.,1456.,264.))*float4(6547.,345.,8799.,1564.));}floatN(floatt){returnfrac(sin(t*12345.564)*7658.76);}floatSaw(floatb,floatt){returnsmoothstep(0.,b,t)*smoothstep(1.,b,t);}float2DropLayer2(float2uv,floatt){float2UV=uv;uv.y+=t*0.75;float2a=float2(6.,1.);float2grid=a*2.;float2id=floor(uv*grid);floatcolShift=N(id.x);uv.y+=colShift;id=floor(uv*grid);float3n=N13(id.x*35.2+id.y*2376.1);float2st=frac(uv*grid)-float2(.5,0);floatx=n.x-.5;floaty=UV.y*20.;floatwiggle=sin(y+sin(y));x+=wiggle*(.5-abs(x))*(n.z-.5);x*=.7;floatti=frac(t+n.z);y=(Saw(.85,ti)-.5)*.9+.5;float2p=float2(x,y);floatd=length((st-p)*a.yx);floatmainDrop=smoothstep(.4,.0,d);floatr=sqrt(smoothstep(1.,y,st.y));floatcd=abs(st.x-x);floattrail=smoothstep(.23*r,.15*r*r,cd);floattrailFront=smoothstep(-.02,.02,st.y-y);trail*=trailFront*r*r;y=UV.y;floattrail2=smoothstep(.2*r,.0,cd);floatdroplets=max(0.,(sin(y*(1.-y)*120.)-st.y))*trail2*trailFront*n.z;y=frac(y*10.)+(st.y-.5);floatdd=length(st-float2(x,y));droplets=smoothstep(.3,0.,dd);floatm=mainDrop+droplets*r*trailFront;returnfloat2(m,trail);}floatStaticDrops(float2uv,floatt){uv*=40.;float2id=floor(uv);uv=frac(uv)-.5;float3n=N13(id.x*107.45+id.y*3543.654);float2p=(n.xy-.5)*.7;floatd=length(uv-p);floatfade=Saw(.025,frac(t+n.z));floatc=smoothstep(.3,0.,d)*frac(n.z*10.)*fade;returnc;}float2Drops(float2uv,floatt,floatl0,floatl1,floatl2){floats=StaticDrops(uv,t)*l0;float2m1=DropLayer2(uv,t)*l1;float2m2=DropLayer2(uv*1.85,t)*l2;floatc=s+m1.x+m2.x;c=smoothstep(.3,1.,c);returnfloat2(c,max(m1.y*l0,m2.y*l1));}float2DropsDynamic(float2uv,floatt,floatl1,floatl2){float2m1=DropLayer2(uv,t)*l1;float2m2=DropLayer2(uv*1.75,t)*l2;floatc=m1.x+m2.x;c=smoothstep(.4,1.,c);returnfloat2(c,max(0,m2.y*l1));}v2fvert(appdatav){v2fo;o.pos=UnityObjectToClipPos(v.vertex);o.scrPos=ComputeScreenPos(o.pos);returno;}fixed4frag(v2f_iParam):SV_Target{float2fragCoord=(_iParam.scrPos.xy/_iParam.scrPos.w)*_ScreenParams.xy;float4fragColor=0;float2uv=(fragCoord.xy-.5*_ScreenParams.xy)/_ScreenParams.y;float2UV=fragCoord.xy/_ScreenParams.xy;float3M=2;floatT=_Time.y+M.x*2.;floatt=T*(.2+0.1*_MoreRainAmount);floatrainAmount=M.y;uv*=0.5;floatstaticDrops=smoothstep(-.5,1.,rainAmount)*2.;floatlayer1=smoothstep(.25,.75,rainAmount);floatlayer2=smoothstep(.0,.5,rainAmount);float2n=float2(0,0);float2c=Drops(uv,t,staticDrops,layer1,layer2);float2e=float2(.001,0.);floatcx=Drops(uv+e,t,staticDrops,layer1,layer2).x;floatcy=Drops(uv+e.yx,t,staticDrops,layer1,layer2).x;n+=float2(cx-c.x,cy-c.x);floatmoreRainAmount=1.25+1.25*_MoreRainAmount;for(floati=1.25;i<moreRainAmount;i+=0.25){float2_c=DropsDynamic(uv,t*i,layer1,layer2);float_cx=DropsDynamic(uv+e,t*i,layer1,layer2).x;float_cy=DropsDynamic(uv+e.yx,t*i,layer1,layer2).x;n+=float2(_cx-_c.x,_cy-_c.x);}floatblend=(n.x+n.y)*(1.75+_MoreRainAmount);#ifdefined(WIPE)floatwipe=tex2D(_WipeCanvasTex,UV).r;wipe=saturate(pow(wipe,0.2));float3col=tex2D(_MainTex,UV+n*(1-wipe)).rgb;#elsefloat3col=tex2D(_MainTex,UV+n).rgb;#endiffragColor=float4(col,blend);returnfragColor;}ENDCG}Pass{CGPROGRAM#pragmavertexvert#pragmafragmentfrag#include"UnityCG.cginc"structappdata{float4vertex:POSITION;float2uv:TEXCOORD0;};structv2f{float2uv:TEXCOORD0;float4vertex:SV_POSITION;};v2fvert(appdatav){v2fo;o.vertex=UnityObjectToClipPos(v.vertex);o.uv=v.uv;returno;}sampler2D_SrcTex;sampler2D_MainTex;half_Blend;fixed4frag(v2fi):SV_Target{fixed4rainC=tex2D(_MainTex,i.uv);fixed4mainC=tex2D(_SrcTex,i.uv);fixedblend=rainC.a*_Blend;mainC.rgb=rainC.rgb*blend+mainC.rgb*(1-blend);returnmainC;}ENDCG}Pass{CGPROGRAM#pragmavertexvert#pragmafragmentfrag#include"UnityCG.cginc"float4_WipeScreenPos;float4_WipeScreenSize;float4_WipeSize;structappdata{float4vertex:POSITION;float2uv:TEXCOORD0;};structv2f{float2uv:TEXCOORD0;float4vertex:SV_POSITION;};v2fvert(appdatav){v2fo;o.vertex=UnityObjectToClipPos(v.vertex);o.uv=v.uv;returno;}fixed4frag(v2fi):SV_Target{float2currScreenPos=i.uv*_WipeScreenSize;float4wipeSize=float4(100,100,0,0)*_WipeSize.xyzw;wipeSize.xy=float2(1,1)/float2(dot(wipeSize.xz,wipeSize.xz),dot(wipeSize.yw,wipeSize.yw));float4radius=float4(_WipeScreenPos.xy-currScreenPos.xy,0,0);radius.xy=float2(dot(radius.xz,radius.xz),dot(radius.yw,radius.yw));floatinside=1-min(dot(radius.xy,wipeSize.xy),1);returninside;}ENDCG}Pass{BlendOneOneCGPROGRAM#pragmavertexvert#pragmafragmentfrag#include"UnityCG.cginc"sampler2D_WipeTex;structappdata{float4vertex:POSITION;float2uv:TEXCOORD0;};structv2f{float2uv:TEXCOORD0;float4vertex:SV_POSITION;};v2fvert(appdatav){v2fo;o.vertex=UnityObjectToClipPos(v.vertex);o.uv=v.uv;returno;}fixed4frag(v2fi):SV_Target{returntex2D(_WipeTex,i.uv);}ENDCG}Pass{CGPROGRAM#pragmavertexvert#pragmafragmentfrag#include"UnityCG.cginc"sampler2D_WipeCanvasTex;structappdata{float4vertex:POSITION;float2uv:TEXCOORD0;};structv2f{float2uv:TEXCOORD0;float4vertex:SV_POSITION;};v2fvert(appdatav){v2fo;o.vertex=UnityObjectToClipPos(v.vertex);o.uv=v.uv;returno;}float4frag(v2fi):SV_Target{float4c=tex2D(_WipeCanvasTex,i.uv);returnc-0.005f;}ENDCG}}}

普通会员

0

帖子

336

回复

340

积分
沙发
发表于 2019-11-30 16:15:18

记录一下

普通会员

1

帖子

348

回复

357

积分
板凳
发表于 2023-09-15 08:39:02

我喜欢

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017