142 lines
4.2 KiB
HLSL
142 lines
4.2 KiB
HLSL
// Fantasy Adventure Environment
|
|
// staggart.xyz
|
|
|
|
float4 _WindDirection;
|
|
float _TrunkWindSpeed;
|
|
float _TrunkWindSwinging;
|
|
float _TrunkWindWeight;
|
|
float _WindSpeed;
|
|
float _WindAmplitude;
|
|
float _WindStrength;
|
|
|
|
TEXTURE2D(_WindVectors); SAMPLER(sampler_WindVectors);
|
|
|
|
float WindSpeed() {
|
|
return _WindSpeed * _TimeParameters.x * 0.25; //10x faster than legacy _Time.x
|
|
}
|
|
|
|
float3 WindDirection() {
|
|
return _WindDirection.xyz + 0.001;
|
|
}
|
|
void GetGlobalParams_float(out float3 windDir, out float trunkSpeed, out float trunkSwinging, out float trunkWeight, out float windSpeed)
|
|
{
|
|
windDir = WindDirection().xyz;
|
|
trunkSpeed = _TrunkWindSpeed ;
|
|
trunkSwinging = _TrunkWindSwinging;
|
|
trunkWeight = _TrunkWindWeight;
|
|
windSpeed = WindSpeed();
|
|
};
|
|
|
|
void GetLocalParams_float(in float3 wPos, in float windFreqMult, out float3 windDir, out float trunkSpeed, out float trunkSwinging, out float trunkWeight, out float windSpeed, out float windFreq, out float windStrength)
|
|
{
|
|
windDir = WindDirection().xyz;
|
|
trunkSpeed = _TrunkWindSpeed;
|
|
trunkSwinging = _TrunkWindSwinging;
|
|
trunkWeight = _TrunkWindWeight;
|
|
windSpeed = WindSpeed();
|
|
windFreq = length(wPos.xz * 0.01) * (_WindAmplitude * windFreqMult);
|
|
windStrength = _WindStrength;
|
|
};
|
|
|
|
float3 GetPivotPos() {
|
|
return float3(UNITY_MATRIX_M[0][3], UNITY_MATRIX_M[1][3] + 0.25, UNITY_MATRIX_M[2][3]);
|
|
}
|
|
|
|
float ObjectPosRand01() {
|
|
return frac(UNITY_MATRIX_M[0][3] + UNITY_MATRIX_M[1][3] + UNITY_MATRIX_M[2][3]);
|
|
}
|
|
|
|
void ApplyFoliageWind_float(in float3 wPos, in float maxStrength, in float mask, in float leafFlutter, in float globalMotion, in float swinging, in float freqMult, in float3 positionOS, out float3 offset)
|
|
{
|
|
float speed = WindSpeed();
|
|
|
|
float2 windUV = (wPos.xz * 0.01) * _WindAmplitude * freqMult;
|
|
windUV += (WindDirection().xz * (speed));
|
|
|
|
float3 windVec = UnpackNormal(SAMPLE_TEXTURE2D_LOD(_WindVectors, sampler_WindVectors, windUV, 0)).rgb;
|
|
windVec = TransformWorldToObjectDir(windVec);
|
|
|
|
float sine = sin(ObjectPosRand01() + length(WindDirection().xz) * speed * 25);
|
|
sine = lerp(sine * 0.5 + 0.5, sine, swinging);
|
|
|
|
windVec = maxStrength * mask * ((sine * globalMotion * 0.5) + (windVec * leafFlutter));
|
|
|
|
offset = (float3(windVec.x, 0, windVec.y)) + positionOS;
|
|
};
|
|
|
|
float4 _ObstaclePosition;
|
|
float _BendingStrength;
|
|
float _BendingRadius;
|
|
|
|
void GetBendingOffset_float(in float3 positionOS, in float3 wPos, in float mask, in float influence, out float3 offsetPosition)
|
|
{
|
|
float3 dir = normalize(_ObstaclePosition.xyz - wPos);
|
|
dir = TransformWorldToObjectDir(dir);
|
|
|
|
float falloff = 1-saturate(distance(_ObstaclePosition.xyz, wPos) / _BendingRadius);
|
|
|
|
float3 offset = 0;
|
|
offset.xz = dir.xz * (_BendingStrength * 0.1);
|
|
offset *= -(falloff * influence) * mask;
|
|
|
|
offsetPosition = positionOS + offset;
|
|
}
|
|
|
|
void SampleWind_float(in float2 wPos, out float3 vec)
|
|
{
|
|
float2 v = SAMPLE_TEXTURE2D_LOD(_WindVectors, sampler_WindVectors, wPos, 0).rg ;
|
|
|
|
vec = float3(v.x, 0, v.y);
|
|
};
|
|
|
|
void ApplyLODCrossfade_float(in float4 screenPos, in float alpha, out float dithered)
|
|
{
|
|
#ifndef UNIVERSAL_SHADOW_CASTER_PASS_INCLUDED
|
|
#if LOD_FADE_CROSSFADE
|
|
float hash = GenerateHashedRandomFloat(screenPos.xy * _ScreenParams.xy);
|
|
float sign = CopySign(hash, unity_LODFade.x);
|
|
|
|
clip(unity_LODFade.x - sign);
|
|
#endif
|
|
#endif
|
|
dithered = alpha;
|
|
}
|
|
|
|
void GetSunColor_float(out float3 color)
|
|
{
|
|
#ifdef UNIVERSAL_LIGHTING_INCLUDED
|
|
Light mainLight = GetMainLight();
|
|
color = mainLight.color;
|
|
#else
|
|
color = 0;
|
|
#endif
|
|
}
|
|
|
|
void MainLight_half(float3 WorldPos, out half3 Direction, out half3 Color, out half DistanceAtten, out half ShadowAtten)
|
|
{
|
|
#ifdef UNIVERSAL_LIGHTING_INCLUDED
|
|
#if SHADERGRAPH_PREVIEW
|
|
Direction = half3(0.5, 0.5, 0);
|
|
Color = 1;
|
|
DistanceAtten = 1;
|
|
ShadowAtten = 1;
|
|
#else
|
|
#if SHADOWS_SCREEN
|
|
half4 clipPos = TransformWorldToHClip(WorldPos);
|
|
half4 shadowCoord = ComputeScreenPos(clipPos);
|
|
#else
|
|
half4 shadowCoord = TransformWorldToShadowCoord(WorldPos);
|
|
#endif
|
|
#endif
|
|
Light mainLight = GetMainLight(shadowCoord);
|
|
Direction = mainLight.direction;
|
|
Color = mainLight.color;
|
|
DistanceAtten = mainLight.distanceAttenuation;
|
|
ShadowAtten = mainLight.shadowAttenuation;
|
|
#else
|
|
Direction = half3(0.5, 0.5, 0);
|
|
Color = 1;
|
|
DistanceAtten = 1;
|
|
ShadowAtten = 1;
|
|
#endif
|
|
} |