136 lines
5.1 KiB
HLSL
136 lines
5.1 KiB
HLSL
|
|
#ifndef COZY_INCLUDED
|
|
#define COZY_INCLUDED
|
|
|
|
uniform float4 CZY_FogColor1;
|
|
uniform float4 CZY_FogColor2;
|
|
uniform float4 CZY_FogColor3;
|
|
uniform float4 CZY_FogColor4;
|
|
uniform float4 CZY_FogColor5;
|
|
|
|
uniform float CZY_FogColorStart1;
|
|
uniform float CZY_FogColorStart2;
|
|
uniform float CZY_FogColorStart3;
|
|
uniform float CZY_FogColorStart4;
|
|
|
|
uniform half CZY_FogDepthMultiplier;
|
|
|
|
uniform float4 CZY_LightColor;
|
|
uniform float3 CZY_SunDirection;
|
|
uniform half CZY_LightIntensity;
|
|
uniform half CZY_LightFalloff;
|
|
|
|
uniform float CZY_FogSmoothness;
|
|
uniform float CZY_FogOffset;
|
|
uniform float CZY_FogIntensity;
|
|
|
|
inline float4 ASE_ComputeGrabScreenPos(float4 pos)
|
|
{
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
float scale = -1.0;
|
|
#else
|
|
float scale = 1.0;
|
|
#endif
|
|
float4 o = pos;
|
|
o.y = pos.w * 0.5f;
|
|
o.y = (pos.y - o.y) * _ProjectionParams.x * scale + o.y;
|
|
return o;
|
|
}
|
|
|
|
|
|
float3 HSVToRGB(float3 c)
|
|
{
|
|
float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
|
float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
|
|
return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y);
|
|
}
|
|
|
|
|
|
float3 RGBToHSV(float3 c)
|
|
{
|
|
float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
|
float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
|
|
float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));
|
|
float d = q.x - min(q.w, q.y);
|
|
float e = 1.0e-10;
|
|
return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
|
|
}
|
|
|
|
float4 Debug(float4 input) {
|
|
|
|
return CZY_FogColor3;
|
|
|
|
}
|
|
|
|
float4 BlendStylizedFog(float3 worldPos, float4 inColor) {
|
|
|
|
|
|
|
|
//float4 ase_screenPos = float4(i.screenPos.xyz, i.screenPos.w + 0.00000000001);
|
|
//float4 ase_screenPosNorm = ase_screenPos / ase_screenPos.w;
|
|
//ase_screenPosNorm.z = (UNITY_NEAR_CLIP_VALUE >= 0) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5;
|
|
float eyeDepth = distance(worldPos, _WorldSpaceCameraPos);
|
|
|
|
|
|
float fogDepth = (CZY_FogDepthMultiplier * sqrt(eyeDepth));
|
|
|
|
float4 lerpResult28_g2 = lerp(CZY_FogColor1, CZY_FogColor2, saturate((fogDepth / CZY_FogColorStart1)));
|
|
float4 lerpResult41_g2 = lerp(saturate(lerpResult28_g2), CZY_FogColor3, saturate(((CZY_FogColorStart1 - fogDepth) / (CZY_FogColorStart1 - CZY_FogColorStart2))));
|
|
float4 lerpResult35_g2 = lerp(lerpResult41_g2, CZY_FogColor4, saturate(((CZY_FogColorStart2 - fogDepth) / (CZY_FogColorStart2 - CZY_FogColorStart3))));
|
|
float4 lerpResult113_g2 = lerp(lerpResult35_g2, CZY_FogColor5, saturate(((CZY_FogColorStart3 - fogDepth) / (CZY_FogColorStart3 - CZY_FogColorStart4))));
|
|
|
|
float4 tempFogColor = lerpResult113_g2;
|
|
float3 hsvTorgb31_g1 = RGBToHSV(CZY_LightColor.rgb);
|
|
float3 hsvTorgb32_g1 = RGBToHSV(tempFogColor.rgb);
|
|
float3 hsvTorgb39_g1 = HSVToRGB(float3(hsvTorgb31_g1.x, hsvTorgb31_g1.y, (hsvTorgb31_g1.z * hsvTorgb32_g1.z)));
|
|
float3 normalizeResult5_g1 = normalize((worldPos - _WorldSpaceCameraPos));
|
|
float dotResult6_g1 = dot(normalizeResult5_g1, CZY_SunDirection);
|
|
half lightMask = saturate(pow(abs(((dotResult6_g1 * 0.5 + 0.5) * CZY_LightIntensity)), CZY_LightFalloff));
|
|
|
|
float alpha = saturate(((1.0 - saturate(((((worldPos - _WorldSpaceCameraPos).y * 0.1) * (1.0 / CZY_FogSmoothness)) + (1.0 - CZY_FogOffset)))) * CZY_FogIntensity));
|
|
float finalFogDensity = (tempFogColor.a * saturate(fogDepth)) * alpha;
|
|
float4 lerpResult43_g1 = lerp(tempFogColor, float4(hsvTorgb39_g1, 0.0), saturate((lightMask * (1.5 * finalFogDensity))));
|
|
float4 lerpResult46_g1 = lerp(inColor, lerpResult43_g1, finalFogDensity);
|
|
|
|
|
|
return lerpResult46_g1;
|
|
|
|
|
|
}
|
|
|
|
|
|
float GetStylizedFogDensity(float3 worldPos) {
|
|
|
|
|
|
|
|
//float4 ase_screenPos = float4(i.screenPos.xyz, i.screenPos.w + 0.00000000001);
|
|
//float4 ase_screenPosNorm = ase_screenPos / ase_screenPos.w;
|
|
//ase_screenPosNorm.z = (UNITY_NEAR_CLIP_VALUE >= 0) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5;
|
|
float eyeDepth = distance(worldPos, _WorldSpaceCameraPos);
|
|
|
|
|
|
float fogDepth = (CZY_FogDepthMultiplier * sqrt(eyeDepth));
|
|
|
|
float4 lerpResult28_g2 = lerp(CZY_FogColor1, CZY_FogColor2, saturate((fogDepth / CZY_FogColorStart1)));
|
|
float4 lerpResult41_g2 = lerp(saturate(lerpResult28_g2), CZY_FogColor3, saturate(((CZY_FogColorStart1 - fogDepth) / (CZY_FogColorStart1 - CZY_FogColorStart2))));
|
|
float4 lerpResult35_g2 = lerp(lerpResult41_g2, CZY_FogColor4, saturate(((CZY_FogColorStart2 - fogDepth) / (CZY_FogColorStart2 - CZY_FogColorStart3))));
|
|
float4 lerpResult113_g2 = lerp(lerpResult35_g2, CZY_FogColor5, saturate(((CZY_FogColorStart3 - fogDepth) / (CZY_FogColorStart3 - CZY_FogColorStart4))));
|
|
|
|
float4 tempFogColor = lerpResult113_g2;
|
|
float3 hsvTorgb31_g1 = RGBToHSV(CZY_LightColor.rgb);
|
|
float3 hsvTorgb32_g1 = RGBToHSV(tempFogColor.rgb);
|
|
float3 hsvTorgb39_g1 = HSVToRGB(float3(hsvTorgb31_g1.x, hsvTorgb31_g1.y, (hsvTorgb31_g1.z * hsvTorgb32_g1.z)));
|
|
float3 normalizeResult5_g1 = normalize((worldPos - _WorldSpaceCameraPos));
|
|
float dotResult6_g1 = dot(normalizeResult5_g1, CZY_SunDirection);
|
|
half lightMask = saturate(pow(abs(((dotResult6_g1 * 0.5 + 0.5) * CZY_LightIntensity)), CZY_LightFalloff));
|
|
|
|
float alpha = saturate(((1.0 - saturate(((((worldPos - _WorldSpaceCameraPos).y * 0.1) * (1.0 / CZY_FogSmoothness)) + (1.0 - CZY_FogOffset)))) * CZY_FogIntensity));
|
|
float finalFogDensity = (tempFogColor.a * saturate(fogDepth)) * alpha;
|
|
|
|
|
|
|
|
return finalFogDensity;
|
|
|
|
|
|
}
|
|
#endif |