








float3 ACESToneMapping(float3 color, float adapted_lum)
{
	const float A = 2.51;
	const float B = 0.03;
	const float C = 2.43;
	const float D = 0.59;
	const float E = 0.14;
	color *= adapted_lum;
	return (color * (A * color + B)) / (color * (C * color + D) + E);
}

 float rand( float2 X){ 
	return frac(cos(X.x + X.y *252.0) * 75.0);}

 float noise( float2 X){ 
    float2 A = floor(X); 
    float2 B = frac(X); 
    float2 C = pow(B,float2(2.0,2.0))*(3.0- 2.0*B); 
    float D = rand(A+float2(0.0,0.0));
    float E = rand(A+float2(1.0,0.0));
    float F = rand(A+float2(0.0,1.0));
    float G = rand(A+float2(1.0,1.0));
    float X1 = lerp( lerp(D, E, C.x),lerp(F, G, C.x),C.y);
	return X1;}


 float clouds( float2 Px){
float rain=clamp(1.-pow(FOG_CONTROL.y,5.),0.0,1.0);//雨天检测
    float time = TIME;
    float A = 1.5-rain*0.3;
    float B = 0.0;
   Px+=float2(1.0,2.0)*TIME*0.1;
   Px*=0.09;
   int C=0;while(C < 5){
      B+= noise(Px)/(A);
      A*= 2.2;
      Px*= 2.1;
	  Px-= time*0.1*pow(A,0.01);
	 C++;}
return pow(abs(B),10.0);}

float4 ABCcloud(float3 X) {

   float4 cloudcolor=float4(1.0,1.0,1.0,1.0);
    float J = clouds(X.xz*5.0);
   cloudcolor.a=J;
   
return cloudcolor;}



float cube(float3 P,float3 Ps){
float c = smoothstep(0.12,0.1,abs(P.y-Ps.y))*smoothstep(0.12,0.1,abs(P.x-Ps.x))*smoothstep(0.12,0.1,abs(P.z-Ps.z));
return c;
}

float nc (float2 P){
P*=1.0;
return floor(rand(floor(P))+0.3);
}


float clo(float3 P,float M){
if(P.y>0.9&&P.y<1.2){return nc(P.xz*5.0*M);}
else{return 0.0;}
}



 float yspeclouds ( float2 P){
float a;
a=clamp(noise(float2(P.x*2.0+P.y,P.y*2.0+P.x)*4.0+TIME*0.1)*2.0-1.0,0.0,1.0);
return pow(a,3.0);
}



float4 raymarching(float3 start,float3 direction,float marchingdistance){

float bottom = 0.9;
float height = 1.1;

float4 cloudcolor=float4(1.0,1.0,1.0,0.0);
float3 startpoint=start;
float3 direct=direction*marchingdistance;

float hitheight = 1.0;
bool hit = false;

int i =0;
while(i<100){
cloudcolor.a+=clo(startpoint.xyz,0.2);
startpoint+=direct;

if(cloudcolor.a>0.1){
if(!hit)hitheight=startpoint.y;
hit=true;
}

if(startpoint.y>height)break;
i=i+1;
}

cloudcolor.a=clamp(cloudcolor.a,0.0,1.0);
cloudcolor.rgb=lerp(cloudcolor.rgb,0.7,smoothstep(height,bottom,hitheight));

return cloudcolor;
}



float3 gf(float2 uv){
return TEXTURE_0.Sample(TextureSampler0, uv).rbg*2.0-1.0;
}




float waterh(float2 P)
{
P*=1.5;
float2 p2 = float2(P.x*3.0+P.y,P.y*3.0+P.x);
//P=p2;
float s = (noise(float2(P.x+TIME,P.y-TIME*2.0)*0.6)+noise(float2(P.x-TIME,P.y+TIME*2.0)*0.4));
//float s = noise(float2(P.x*2.0+P.y,P.y*2.0+P.x)+TIME)*0.08;

  return pow(smoothstep(-2.0,2.0,s),1.0)*0.05;
}



float3 getf(float3 P,float data)
{
float3 point1 =float3(P.x,waterh(P.xz),P.z);
float3 point2 =float3(P.x+data,waterh(float2(P.x+data,P.z)),P.z);
float3 point3 =float3(P.x,waterh(float2(P.x,P.z+data)),P.z+data);
float3 f1 = point1-point2;
float3 f2 = point2-point3;
return normalize(cross(f1,f2));
}









