Ниже приложил оба шейдера:
Raindrop Shader:
Синтаксис:
Используется csharp
Shader "Custom/Raindrop" {
Properties {
_Texture("Rain", 2D) = "white" {}
_RainIntensity("Rain Intensity", Range(0,0.5)) = 0.4
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Pass{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _Texture;
#define S(a, b, t) smoothstep(a, b, t)
//#define CHEAP_NORMALS
float _RainIntensity;
float3 N13(float p) {
float3 p3 = frac(float3(p, p, p) * float3(.1031, .11369, .13787));
p3 += dot(p3, p3.yzx + 19.19);
return frac(float3((p3.x + p3.y)*p3.z, (p3.x + p3.z)*p3.y, (p3.y + p3.z)*p3.x));
}
float4 N14(float t) {
return frac(sin(t*float4(123., 1024., 1456., 264.))*float4(6547., 345., 8799., 1564.));
}
float N(float t) {
return frac(sin(t*12345.564)*7658.76);
}
float Saw(float b, float t) {
return S(0., b, t)*S(1., b, t);
}
float2 DropLayer2(float2 uv, float t) {
float2 UV = uv;
uv.y += t*0.75;
float2 a = float2(6., 1.);
float2 grid = a*2.;
float2 id = floor(uv*grid);
float colShift = N(id.x);
uv.y += colShift;
id = floor(uv*grid);
float3 n = N13(id.x*35.2 + id.y*2376.1);
float2 st = frac(uv*grid) - float2(.5, 0);
float x = n.x - .5;
float y = UV.y*20.;
float wiggle = sin(y + sin(y));
x += wiggle*(.5 - abs(x))*(n.z - .5);
x *= .7;
float ti = frac(t + n.z);
y = (Saw(.85, ti) - .5)*.9 + .5;
float2 p = float2(x, y);
float d = length((st - p)*a.yx);
float mainDrop = S(.4, .0, d);
float r = sqrt(S(1., y, st.y));
float cd = abs(st.x - x);
float trail = S(.23*r, .15*r*r, cd);
float trailFront = S(-.02, .02, st.y - y);
trail *= trailFront*r*r;
y = UV.y;
float trail2 = S(.2*r, .0, cd);
float droplets = max(0., (sin(y*(1. - y)*120.) - st.y))*trail2*trailFront*n.z;
y = frac(y*10.) + (st.y - .5);
float dd = length(st - float2(x, y));
droplets = S(.3, 0., dd);
float m = mainDrop + droplets*r*trailFront;
return float2(m, trail);
}
float StaticDrops(float2 uv, float t) {
uv *= 50.;
float2 id = floor(uv);
uv = frac(uv) - .5;
float3 n = N13(id.x*107.45 + id.y*3543.654);
float2 p = (n.xy - .5)*.7;
float d = length(uv - p);
float fade = Saw(.015, frac(t + n.z));
float c = S(.3, 0., d)*frac(n.z*10.)*fade;
return c;
}
float2 Drops(float2 uv, float t, float l0, float l1, float l2) {
float s = StaticDrops(uv, t)*l0;
float2 m1 = DropLayer2(uv, t)*l1;
float2 m2 = DropLayer2(uv*3.85, t)*l2;
float c = s + m1.x + m2.x;
c = S(.3, 1., c);
return float2(c, max(m1.y*l0, m2.y*l1));
}
fixed4 frag(v2f_img i) : SV_Target{
float2 uv = ((i.uv * _ScreenParams.xy) - .5*_ScreenParams.xy) / _ScreenParams.y;
float2 UV = i.uv.xy;
float3 M = float3(0.0, 0.0, 0.0);
float T = _Time.y + M.x*2.;
float t = T*.2;
float rainAmount = _RainIntensity;
float maxBlur = lerp(3., 6., rainAmount);
float minBlur = 2.;
float staticDrops = S(-.5, 1., rainAmount)*2.;
float layer1 = S(.25, .75, rainAmount);
float layer2 = S(.0, .5, rainAmount);
float2 c = Drops(uv, t, staticDrops, layer1, layer2);
#ifdef CHEAP_NORMALS
float2 n = float2(dFdx(c.x), dFdy(c.x)); // cheap normals (3x cheaper, but 2 times S***tier <img src="./images/smilies/71.gif" alt=";))" title="Hi hi hi" />
#else
float2 e = float2(.001, 0.);
float cx = Drops(uv + e, t, staticDrops, layer1, layer2).x;
float cy = Drops(uv + e.yx, t, staticDrops, layer1, layer2).x;
float2 n = float2(cx - c.x, cy - c.x); // expensive normals
#endif
//float4 texCoord = float4(UV.x + n.x, UV.y + n.y, 0, 0);
float4 texCoord = float4(n.x, n.y, 0, 0);
float4 lod = tex2Dlod(_Texture, texCoord);
float3 col = lod.rgb;
return fixed4(col, 1);
}
ENDCG
}
}
FallBack "Reflective/Diffuse"
}
Properties {
_Texture("Rain", 2D) = "white" {}
_RainIntensity("Rain Intensity", Range(0,0.5)) = 0.4
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Pass{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _Texture;
#define S(a, b, t) smoothstep(a, b, t)
//#define CHEAP_NORMALS
float _RainIntensity;
float3 N13(float p) {
float3 p3 = frac(float3(p, p, p) * float3(.1031, .11369, .13787));
p3 += dot(p3, p3.yzx + 19.19);
return frac(float3((p3.x + p3.y)*p3.z, (p3.x + p3.z)*p3.y, (p3.y + p3.z)*p3.x));
}
float4 N14(float t) {
return frac(sin(t*float4(123., 1024., 1456., 264.))*float4(6547., 345., 8799., 1564.));
}
float N(float t) {
return frac(sin(t*12345.564)*7658.76);
}
float Saw(float b, float t) {
return S(0., b, t)*S(1., b, t);
}
float2 DropLayer2(float2 uv, float t) {
float2 UV = uv;
uv.y += t*0.75;
float2 a = float2(6., 1.);
float2 grid = a*2.;
float2 id = floor(uv*grid);
float colShift = N(id.x);
uv.y += colShift;
id = floor(uv*grid);
float3 n = N13(id.x*35.2 + id.y*2376.1);
float2 st = frac(uv*grid) - float2(.5, 0);
float x = n.x - .5;
float y = UV.y*20.;
float wiggle = sin(y + sin(y));
x += wiggle*(.5 - abs(x))*(n.z - .5);
x *= .7;
float ti = frac(t + n.z);
y = (Saw(.85, ti) - .5)*.9 + .5;
float2 p = float2(x, y);
float d = length((st - p)*a.yx);
float mainDrop = S(.4, .0, d);
float r = sqrt(S(1., y, st.y));
float cd = abs(st.x - x);
float trail = S(.23*r, .15*r*r, cd);
float trailFront = S(-.02, .02, st.y - y);
trail *= trailFront*r*r;
y = UV.y;
float trail2 = S(.2*r, .0, cd);
float droplets = max(0., (sin(y*(1. - y)*120.) - st.y))*trail2*trailFront*n.z;
y = frac(y*10.) + (st.y - .5);
float dd = length(st - float2(x, y));
droplets = S(.3, 0., dd);
float m = mainDrop + droplets*r*trailFront;
return float2(m, trail);
}
float StaticDrops(float2 uv, float t) {
uv *= 50.;
float2 id = floor(uv);
uv = frac(uv) - .5;
float3 n = N13(id.x*107.45 + id.y*3543.654);
float2 p = (n.xy - .5)*.7;
float d = length(uv - p);
float fade = Saw(.015, frac(t + n.z));
float c = S(.3, 0., d)*frac(n.z*10.)*fade;
return c;
}
float2 Drops(float2 uv, float t, float l0, float l1, float l2) {
float s = StaticDrops(uv, t)*l0;
float2 m1 = DropLayer2(uv, t)*l1;
float2 m2 = DropLayer2(uv*3.85, t)*l2;
float c = s + m1.x + m2.x;
c = S(.3, 1., c);
return float2(c, max(m1.y*l0, m2.y*l1));
}
fixed4 frag(v2f_img i) : SV_Target{
float2 uv = ((i.uv * _ScreenParams.xy) - .5*_ScreenParams.xy) / _ScreenParams.y;
float2 UV = i.uv.xy;
float3 M = float3(0.0, 0.0, 0.0);
float T = _Time.y + M.x*2.;
float t = T*.2;
float rainAmount = _RainIntensity;
float maxBlur = lerp(3., 6., rainAmount);
float minBlur = 2.;
float staticDrops = S(-.5, 1., rainAmount)*2.;
float layer1 = S(.25, .75, rainAmount);
float layer2 = S(.0, .5, rainAmount);
float2 c = Drops(uv, t, staticDrops, layer1, layer2);
#ifdef CHEAP_NORMALS
float2 n = float2(dFdx(c.x), dFdy(c.x)); // cheap normals (3x cheaper, but 2 times S***tier <img src="./images/smilies/71.gif" alt=";))" title="Hi hi hi" />
#else
float2 e = float2(.001, 0.);
float cx = Drops(uv + e, t, staticDrops, layer1, layer2).x;
float cy = Drops(uv + e.yx, t, staticDrops, layer1, layer2).x;
float2 n = float2(cx - c.x, cy - c.x); // expensive normals
#endif
//float4 texCoord = float4(UV.x + n.x, UV.y + n.y, 0, 0);
float4 texCoord = float4(n.x, n.y, 0, 0);
float4 lod = tex2Dlod(_Texture, texCoord);
float3 col = lod.rgb;
return fixed4(col, 1);
}
ENDCG
}
}
FallBack "Reflective/Diffuse"
}
CarPaint Shader:
Синтаксис:
Используется csharp
Shader "Car/CarPain" {
Properties {
_Color("Diffuse Color", Color) = (1, 1, 1,1)
_SpecColor("Specular Color", Color) = (1,1,1,1)
_AmbientColor("Metalic Color", Color) = (1,1,1, 1)
_AmbientColor2("Candy Color", Color) = (1,1,1, 1)
_ReflectionColor("Reflection Color", Color) = (1,1,1, 1)
_Shininess("Glossiness", Range(0.1,2) ) = 0.5
_MainTex("Diffuse", 2D) = "white" {}
_FlakeTex("Flakes", 2D) = "white" {}
_FlakeDens("Flakes Tile", Range(1,40) ) = 2
_Cube("Reflection Cubemap", Cube) = "" { TexGen CubeReflect }
_FresnelScale ("Fresnel Intensity", Range(0,2) ) = 0
_FresnelPower ("Fresnel Power", Range(0.1,3) ) = 0
_MetalicScale ("Metalic Intensity", Range(0.0,4.0)) = 0
_MetalicPower ("Metalic Power", Range(0.0,20.0)) = 0
_CandyScale ("Candy Intensity", Range(0.0,4.0)) = 0
_CandyPower ("Candy Power", Range(0.0,20.0)) = 0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 400
Cull Back
ZWrite On
ZTest Lequal
ColorMask RGBA
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
float2 uv_FlakeTex;
float3 worldRefl;
float3 viewDir;
float3 lightDir;
float3 normal;
INTERNAL_DATA
};
sampler2D _MainTex;
sampler2D _FlakeTex;
samplerCUBE _Cube;
float4 _Color;
float4 _AmbientColor;
float4 _AmbientColor2;
float4 _ReflectionColor;
float _Shininess;
float _FlakeDens;
float _FresnelScale;
float _FresnelPower;
float _MetalicScale;
float _MetalicPower;
float _CandyScale;
float _CandyPower;
void surf (Input IN, inout SurfaceOutput o){
o.Normal = normalize(float3(0.0,0.0,1.0));
// 0. Vectors
float3 worldRefl = WorldReflectionVector (IN, o.Normal);
float3 normEyeVec = normalize (IN.viewDir);
float3 worldLight = normalize (IN.lightDir);
float dotEyeVecNormal = abs(dot(normEyeVec, o.Normal));
// 1. Difuse (Texture + Color)
float4 Tex1 = tex2D( _MainTex,IN.uv_MainTex );
float specularmask = Tex1.a ;
float4 Diffuse = ((_Color* (specularmask) )* Tex1) + (Tex1*(1-specularmask));
// 2. GlossMap / Sparks
float4 Tex2 = tex2D( _FlakeTex, IN.uv_FlakeTex*_FlakeDens );
float4 Specular = (_Shininess * Tex2) + Tex2;
// 3. Emission (Reflections with Fresnel)
float4 TexCUBE = texCUBE( _Cube,worldRefl) * _ReflectionColor;
float4 fresnel = (1.0 - dot( normEyeVec,o.Normal ));
float4 emmission = _FresnelScale * TexCUBE * pow(fresnel,_FresnelPower);
// 4. Special (Metalic & Candy)
float metalic = (specularmask*_MetalicScale) * pow(dotEyeVecNormal,_MetalicPower);
float candy = _CandyScale * pow(dotEyeVecNormal,_CandyPower);
o.Albedo = Diffuse * ((metalic+(1-specularmask)+((1-Tex2)*(specularmask))) + (_AmbientColor.rgb*specularmask) ) + (candy * _AmbientColor2.rgb * specularmask*(1-Tex2));
o.Specular = Specular;
o.Gloss = _SpecColor * specularmask;
o.Emission = emmission * emmission * specularmask;
}
ENDCG
}
FallBack "Reflective/Diffuse"
}
Properties {
_Color("Diffuse Color", Color) = (1, 1, 1,1)
_SpecColor("Specular Color", Color) = (1,1,1,1)
_AmbientColor("Metalic Color", Color) = (1,1,1, 1)
_AmbientColor2("Candy Color", Color) = (1,1,1, 1)
_ReflectionColor("Reflection Color", Color) = (1,1,1, 1)
_Shininess("Glossiness", Range(0.1,2) ) = 0.5
_MainTex("Diffuse", 2D) = "white" {}
_FlakeTex("Flakes", 2D) = "white" {}
_FlakeDens("Flakes Tile", Range(1,40) ) = 2
_Cube("Reflection Cubemap", Cube) = "" { TexGen CubeReflect }
_FresnelScale ("Fresnel Intensity", Range(0,2) ) = 0
_FresnelPower ("Fresnel Power", Range(0.1,3) ) = 0
_MetalicScale ("Metalic Intensity", Range(0.0,4.0)) = 0
_MetalicPower ("Metalic Power", Range(0.0,20.0)) = 0
_CandyScale ("Candy Intensity", Range(0.0,4.0)) = 0
_CandyPower ("Candy Power", Range(0.0,20.0)) = 0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 400
Cull Back
ZWrite On
ZTest Lequal
ColorMask RGBA
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
float2 uv_FlakeTex;
float3 worldRefl;
float3 viewDir;
float3 lightDir;
float3 normal;
INTERNAL_DATA
};
sampler2D _MainTex;
sampler2D _FlakeTex;
samplerCUBE _Cube;
float4 _Color;
float4 _AmbientColor;
float4 _AmbientColor2;
float4 _ReflectionColor;
float _Shininess;
float _FlakeDens;
float _FresnelScale;
float _FresnelPower;
float _MetalicScale;
float _MetalicPower;
float _CandyScale;
float _CandyPower;
void surf (Input IN, inout SurfaceOutput o){
o.Normal = normalize(float3(0.0,0.0,1.0));
// 0. Vectors
float3 worldRefl = WorldReflectionVector (IN, o.Normal);
float3 normEyeVec = normalize (IN.viewDir);
float3 worldLight = normalize (IN.lightDir);
float dotEyeVecNormal = abs(dot(normEyeVec, o.Normal));
// 1. Difuse (Texture + Color)
float4 Tex1 = tex2D( _MainTex,IN.uv_MainTex );
float specularmask = Tex1.a ;
float4 Diffuse = ((_Color* (specularmask) )* Tex1) + (Tex1*(1-specularmask));
// 2. GlossMap / Sparks
float4 Tex2 = tex2D( _FlakeTex, IN.uv_FlakeTex*_FlakeDens );
float4 Specular = (_Shininess * Tex2) + Tex2;
// 3. Emission (Reflections with Fresnel)
float4 TexCUBE = texCUBE( _Cube,worldRefl) * _ReflectionColor;
float4 fresnel = (1.0 - dot( normEyeVec,o.Normal ));
float4 emmission = _FresnelScale * TexCUBE * pow(fresnel,_FresnelPower);
// 4. Special (Metalic & Candy)
float metalic = (specularmask*_MetalicScale) * pow(dotEyeVecNormal,_MetalicPower);
float candy = _CandyScale * pow(dotEyeVecNormal,_CandyPower);
o.Albedo = Diffuse * ((metalic+(1-specularmask)+((1-Tex2)*(specularmask))) + (_AmbientColor.rgb*specularmask) ) + (candy * _AmbientColor2.rgb * specularmask*(1-Tex2));
o.Specular = Specular;
o.Gloss = _SpecColor * specularmask;
o.Emission = emmission * emmission * specularmask;
}
ENDCG
}
FallBack "Reflective/Diffuse"
}