65 lines
1.6 KiB
HLSL
65 lines
1.6 KiB
HLSL
|
#ifndef OVERHEAD_CLOUD_INCLUDED
|
||
|
#define OVERHEAD_CLOUD_INCLUDED
|
||
|
|
||
|
#include "JCommon.cginc"
|
||
|
|
||
|
void CalculateOverheadCloudColor(
|
||
|
float4 localPos,
|
||
|
fixed4 cloudColor,
|
||
|
fixed cloudAltitude,
|
||
|
fixed cloudSize, fixed cloudStep,
|
||
|
fixed animationSpeed,
|
||
|
fixed flowX, fixed flowZ,
|
||
|
fixed remapMin, fixed remapMax,
|
||
|
out fixed4 color)
|
||
|
{
|
||
|
fixed3 rayDir = localPos.xyz;
|
||
|
float3 cloudPlaneOrigin = float3(0, cloudAltitude, 0);
|
||
|
float3 cloudPlaneNormal = float3(0, 1, 0);
|
||
|
|
||
|
float rayLength = dot(cloudPlaneOrigin, cloudPlaneNormal) / (dot(rayDir, cloudPlaneNormal) + 0.000001);
|
||
|
float3 intersectionPoint = rayDir * rayLength;
|
||
|
|
||
|
fixed loop;
|
||
|
#if SHADER_API_MOBILE
|
||
|
loop = 1;
|
||
|
#else
|
||
|
loop = 2;
|
||
|
#endif
|
||
|
|
||
|
fixed noise = 0;
|
||
|
fixed sample = 0;
|
||
|
fixed noiseSize = cloudSize * 1000 + 0.0001;
|
||
|
fixed noiseAmp = 1;
|
||
|
fixed sign = -1;
|
||
|
fixed2 span = fixed2(flowX, flowZ) * animationSpeed * _Time.y * 0.0001;
|
||
|
for (fixed i = 0; i < loop; ++i)
|
||
|
{
|
||
|
sample = CloudTexLod0((intersectionPoint.xz) / noiseSize + sign * span) * noiseAmp;
|
||
|
noise += sample;
|
||
|
noiseSize *= 0.5;
|
||
|
noiseAmp *= 0.5;
|
||
|
sign *= -1;
|
||
|
}
|
||
|
noise = noise * 0.5 + 0.5;
|
||
|
noise = noise * cloudColor.a;
|
||
|
noise = lerp(remapMin, remapMax, noise);
|
||
|
noise = saturate(noise);
|
||
|
|
||
|
#if ALLOW_STEP_EFFECT
|
||
|
noise = StepValue(noise, cloudStep);
|
||
|
#endif
|
||
|
|
||
|
color = fixed4(cloudColor.rgb, noise);
|
||
|
|
||
|
float sqrCloudDiscRadius = 100000000;
|
||
|
float sqrDistanceToCloudPlaneOrigin = SqrDistance(intersectionPoint, cloudPlaneOrigin);
|
||
|
|
||
|
fixed fDistance = saturate(1 - InverseLerpUnclamped(0, sqrCloudDiscRadius, sqrDistanceToCloudPlaneOrigin));
|
||
|
color.a *= fDistance * fDistance;
|
||
|
|
||
|
fixed4 clear = fixed4(0, 0, 0, 0);
|
||
|
color = lerp(clear, color, localPos.y > 0);
|
||
|
}
|
||
|
|
||
|
#endif
|