看图文吧,不能复制只能发图,
其实我也想写出来,让大家直接复制,就是没有办法只能截图了。
效果如下:
一个是水里的效果
一个是冰的效果
有相关开关
透明度图,其实是透明的物体折射,不透明的物体没有折射效果。就这个作用
算法主要从热浪材质再进行自我修改,使用自创的渲染法。不过这是手机用的效果一般,算法简单清明。
思维如下:
水就是一个costime与sintime的法图对向流动
冰是静态的冰效果,是法线求折射图。其实是一个假折,其实可以优化,做出深度感。日后更新
///
分切线(下面是升级内容)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
多做两种效果,一种是冰下的混动,一种是水里的混动,冰内就是多加一个法线.
第二种水方法,就是混动,上面有点像热浪
这里再多加了冰内的混动
下是记忆的代码,因为公司源代码不能外流,我也没有办法,就随手再写了一个
Shader "NOrrr/my_distortion" {
Properties {
_NoiseTex ("Normal Texture", 2D) = "white"
{}
_MainTex ("(Alpha)A", 2D) = "white" {}
_Speed ("speed", range (0,3)) = 1
_WaterForce ("Water Force", range (0,0.1)) = 0.1
[KeywordEnum(Off,On)]_isWater("is water",float)=1
_Power("noWater Power",Range(0.01,2))=1
[KeywordEnum(Off,On)]_isWaterB("waterB",float)=1
[KeywordEnum(Off,On)]_isIceMov("Ice move",float)=1
_CtrlBWater("waterb ctrl",Vector)=(.01,0.01,5,5)
}
Category {
Tags { "Queue"="Transparent+1" "RenderType"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest Greater .01
Cull Back Lighting Off ZWrite Off
SubShader {
GrabPass {
Name "BASE"
Tags { "LightMode" = "Always" }
}
Pass {
Name "BASE"
Tags { "LightMode" = "Always" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _ISWATER_OFF _ISWATER_ON
#pragma multi_compile _ISWATERB_OFF _ISWATERB_ON
#pragma multi_compile _ISICEMOV_OFF _ISICEMOV_ON
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
fixed4
color:COLOR;
float2 texcoord:
TEXCOORD0;
};
struct v2f {
float4 vertex : POSITION;
float4 uvgrab :
TEXCOORD0;
float2 uvmain :
TEXCOORD1;
};
float _WaterForce;
float _Speed;
float _Power;
float4 _NoiseTex_ST;
sampler2D _NoiseTex;
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _GrabTexture;
float4 _CtrlBWater;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
#if UNITY_UV_STARTS_AT_TOP // Direct3D类似平台scale为-1;OpenGL类似平台为1。
float scale = -1.0;
#else
float scale = 1.0;
#endif
o.uvgrab.xy = (float2(o.vertex.x,
o.vertex.y * scale) + o.vertex.w) * 0.5;
o.uvgrab.zw = o.vertex.zw;
o.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
half4 frag( v2f i ) :
COLOR
{
#if _ISWATER_ON
#if _ISWATERB_OFF
float2 tc2 =i.uvmain;
tc2.x+=_SinTime*_Speed;
tc2.y-=_CosTime*_Speed;
float4 wiggle=tex2D(_NoiseTex,tc2);
i.uvgrab.x-=wiggle.r*_WaterForce;
i.uvgrab.y+=wiggle.g*_WaterForce*1.5;
#endif
#if _ISWATERB_ON
float2 tc2=i.uvmain;
float time =_Time.y*_Speed;
float
xAngle=time+tc2.y*_CtrlBWater.y;
float
yAngle=time+tc2.x*_CtrlBWater.x;
#if _ISICEMOV_ON
float3 wiggle=UnpackNormal(tex2D(_NoiseTex,tc2);
float2 distortOffset=float2(sin(xAngle),sin(yAngle))*float2(_CtrlBWater.z,_CtrlBWater.w)+wiggle.rg;
#endif
#if _ISICEMOV_OFF
float2 distortOffset=float2(sin(xAngle),sin(yAngle))*float2(_CtrlBWater.z,_CtrlBWater.w);
#endif
//i.uvgragb.xy+=distortOffset;
#endif
#endif
#if _ISWATER_OFF
float3 wiggle=UnpackNormal(tex2D(_NoiseTex,i.uvmain))*_Power;
i.uvgrab.x+=wiggle.r;
i.uvgrab.y+=wiggle.g;
#endif
half4 myCol = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
half4 tint = tex2D(_MainTex, i.uvmain);
return myCol * tint;
}
ENDCG
}//end pass
}//end subshader
SubShader {
Blend DstColor Zero
Pass {
Name "BASE"
SetTexture [_MainTex] { combine texture }
}
}
}
}
下面的sur shader的制作方法,相对于之前有很大的不同
Shader "MY_surDist" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
_Shininess ("Shininess", Range (0.03, 1)) = 0.3
_MainTex ("Base (RGB)", 2D) = "white" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
_DistAmt ("Distortion", range (0,128)) = 10
}
SubShader {
GrabPass { }
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma exclude_renderers gles
#pragma surface surf BlinnPhong vertex:vert
#include "UnityCG.cginc"
float4 _Color;
float _Shininess;
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _GrabTexture;
float _DistAmt;
float4 _GrabTexture_TexelSize;
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float4 proj : TEXCOORD;
};
void vert (inout appdata_full v,out Input o) {
UNITY_INITIALIZE_OUTPUT(Input,o);
float4 oPos = UnityObjectToClipPos(v.vertex);
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
o.proj.xy = (float2(oPos.x, oPos.y*scale) + oPos.w) * 0.5;
o.proj.zw = oPos.zw;
}
void surf (Input IN, inout SurfaceOutput o) {
half3 nor = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
float2 offset = nor * _DistAmt * _GrabTexture_TexelSize.xy;
IN.proj.xy = offset * IN.proj.z + IN.proj.xy;
half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(IN.proj));
half4 tex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = tex.rgb * _Color.rgb * col.rgb;
o.Normal = nor.rgb;
o.Specular = _Shininess;
o.Gloss = tex.a;
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}