Home>
Basically some mathematical algorithms
Shader part:
shader "unlit/2d-ocean"
{
properties
{
_maintex ("texture", 2d)="white" {}
_suncolor ("suncolor", color)=(1,1,1,1)
_sunroundcolor ("sunroundcolor", color)=(1,0,0,1)
_wavecolor1 ("wavecolor1", color)=(1,1,1,1)
_wavecolor2 ("wavecolor2", color)=(1,1,1,1)
_wavecolor3 ("wavecolor3", color)=(1,1,1,1)
_wavecolor4 ("wavecolor4", color)=(1,1,1,1)
_wavecolor5 ("wavecolor5", color)=(1,1,1,1)
_skycolor ("skycolor", color)=(0,1,0,1)
_cloudpos1 ("cloudpos1", vector)=(0,0,0,0)
_cloudpos2 ("cloudpos2", vector)=(0,0,0,0)
_cloudpos3 ("cloudpos3", vector)=(0,0,0,0)
_cloudpos4 ("cloudpos4", vector)=(0,0,0,0)
_cloudpos5 ("cloudpos5", vector)=(0,0,0,0)
_wavefactor1 ("wavefactor1", vector)=(0,0,0,0)
_wavefactor2 ("wavefactor2", vector)=(0,0,0,0)
_wavefactor3 ("wavefactor3", vector)=(0,0,0,0)
_wavefactor4 ("wavefactor4", vector)=(0,0,0,0)
_wavefactor5 ("wavefactor5", vector)=(0,0,0,0)
_sunpos ("sunpos", vector)=(0,0,0,0)
_sunroundfactor ("sunroundfactor", range (0.0,2.0))=0.1
_sunsize ("sunsize", range (0.0,1.0))=1.0
}
subshader
{
tags {"rendertype"="transparent"}
lod 100
blend srcalpha oneminussrcalpha
pass
{
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct appdata
{
float4 vertex:position;
float2 uv:texcoord0;
};
struct v2f
{
float2 uv:texcoord0;
float4 vertex:sv_position;
};
sampler2d _maintex;
float4 _maintex_st;
float4 _cloudpos1;
float4 _cloudpos2;
float4 _cloudpos3;
float4 _cloudpos4;
float4 _cloudpos5;
float4 _wavecolor1;
float4 _wavecolor2;
float4 _wavecolor3;
float4 _wavecolor4;
float4 _wavecolor5;
float4 _wavefactor1;
float4 _wavefactor2;
float4 _wavefactor3;
float4 _wavefactor4;
float4 _wavefactor5;
float4 _suncolor;
float4 _sunroundcolor;
float4 _sunpos;
float _sunroundfactor;
float _sunsize;
float4 _skycolor;
//Draw a single circle (uv, position, size, anti-aliasing)
float4 circle (float2 uv, float2 center, float size, float blur) {
uv=uv-center;
uv=uv/size;
float len = length (uv);
//Length greater than a radius unit transparency is 0, less than transparency is 1
float val=smoothstep (1.0,1.0-blur, len);
return float4 (1, 1, 1, val);
}
//Draw a single cloud
float4 drawcloud (float2 uv, float2 center, float size) {
uv=uv-center;
uv=uv/size;
float4 col=circle (uv, float2 (0.0, 0.0), 0.2, 1);
//Cut off the unwanted part of the circle
col=col * smoothstep (-0.1, -0.1 + 0.01, uv.y);
//The circle is placed in different positions to form a cloud
col +=circle (uv, float2 (0.15, -0.05), 0.1, 1);
col +=circle (uv, float2 (0.0, -0.1), 0.11, 1);
col +=circle (uv, float2 (-0.15, -0.1), 0.1, 1);
col +=circle (uv, float2 (-0.3, -0.08), 0.1, 1);
col +=circle (uv, float2 (-0.2, 0.0), 0.15, 1);
return col;
}
//Draw a plural cloud
float4 drawclouds (float2 uv) {
uv.x +=0.03 * _time.y;
//Make left and right continuous
uv.x=frac (uv.x + 0.5)-0.5;
float4 col=drawcloud (uv, _cloudpos1.xy, 0.1);
col +=drawcloud (uv, _cloudpos2.xy, 0.12);
col +=drawcloud (uv, _cloudpos3.xy, 0.14);
col +=drawcloud (uv, _cloudpos4.xy, 0.16);
col +=drawcloud (uv, _cloudpos5.xy, 0.18);
return col;
}
//Draw the sun halo
float4 drawsuncircle (float2 uv, float2 center, float size) {
uv=uv-center;
uv=uv/size;
//atan2 returns the angle between the point (x, y) and the x axis,Range (-π, π)
//Get the θ angle of polar coordinates
float degree=atan2 (uv.y, uv.x) + _time.y * -0.1;
//The distance of the uv vector from the center
//Get the square of r=x2 + y2 in polar coordinates
float len = length (uv);
//According to the polar coordinate rose line:r (θ)=a * sin (kθ)
//Find r;a is the diffusion amplitude,k is the number of petals * 0.5
float r=0.3 * abs (sin (degree * 5.0));
//Draw petals
//Retain all pixels whose r value is less than the distance to the center
float sunround=smoothstep (r + 0.1 + _sunroundfactor, r + _sunroundfactor, len);
return float4 (1,1,1, sunround) * _ sunroundcolor;
}
//Draw waves (parameters:uv, frequency, amplitude, overall height,Moving speed)
float4 drawwave (float2 uv, float wavefrequency, float waveamplitude, float waveheight, float speed) {
uv.x +=speed * _time.y;
uv.y +=sin (_time.y + waveheight) * 0.02;
//The transparency of uv.y greater than the sin function is 0, and the transparency of the less than 1 is 1.
float val=uv.y-sin (uv.x * wavefrequency) * waveamplitude-waveheight;
val=smoothstep (0.001,0.0, val);
return float4 (1, 1, 1, val);
}
//Draw background
float4 drawbackground (float2 uv) {
float4 val=lerp (float4 (1,1,1,1), _skycolor, uv.y);
return val;
}
//Mixed layer (b is foreground, a is background)
float4 lerpimages (float4 a, float4 b) {
return float4 (lerp (a, b, b.a) .rgb, a.a + b.a);
}
v2f vert (appdata v)
{
v2f o;
o.vertex=unityobjecttoclippos (v.vertex);
o.uv=transform_tex (v.uv, _maintex);
return o;
}
float4 frag (v2f i):sv_target
{
//Sun Center
float4 suncorecolor=circle (i.uv, _sunpos.xy, _sunsize, 0.05) * _ suncolor;
//Sun Halo
float4 sunaroundcolor=drawsuncircle (i.uv, _sunpos.xy, _sunsize);
//cloud
float4 cloudscolor=drawclouds (i.uv);
//wave
float4 wave1=drawwave (i.uv, _wavefactor1.x, _wavefactor1.y, _wavefactor1.z, _wavefactor1.w) * _ wavecolor1;
float4 wave2=drawwave (i.uv, _wavefactor2.x, _wavefactor2.y, _wavefactor2.z, _wavefactor2.w) * _ wavecolor2;
float4 wave3=drawwave (i.uv, _wavefactor3.x, _wavefactor3.y, _wavefactor3.z, _wavefactor3.w) * _ wavecolor3;
float4 wave4=drawwave (i.uv, _wavefactor4.x, _wavefactor4.y, _wavefactor4.z, _wavefactor4.w) * _ wavecolor4;
float4 wave5=drawwave (i.uv, _wavefactor5.x, _wavefactor5.y, _wavefactor5.z, _wavefactor5.w) * _ wavecolor5;
//background
float4 backgroundcolor=drawbackground (i.uv);
//Layer overlay
float4 finalcolor=lerpimages (backgroundcolor, sunaroundcolor);
finalcolor=lerpimages (finalcolor, suncorecolor);
finalcolor=lerpimages (finalcolor, wave1);
finalcolor=lerpimages (finalcolor, wave2);
finalcolor=lerpimages (finalcolor, wave3);
finalcolor=lerpimages (finalcolor, wave4);
finalcolor=lerpimages (finalcolor, wave5);
finalcolor=lerpimages (finalcolor, cloudscolor);
return finalcolor;
}
endcg
}
}
}
Related articles
Related questions
- Unity Shader achieves cutting effect
- Unity Shader realizes the fog of 2D games
- Unity Shader realizes the sketch effect
- Unity Shader implements sketch-style rendering
- Unity shader realizes the effect of vertex animation wave
- Unity shader to achieve glass refraction effect
- Unity Shader achieves dynamic fog effect
- Unity Shader achieves glass material effect
- Unity Shader intersection algorithm realizes simple anti-energy shield