un-hardcode fog config

This commit is contained in:
2023-08-17 21:17:28 +10:00
parent 2c5547320d
commit d045560ef5
7 changed files with 218 additions and 63 deletions

View File

@@ -88,7 +88,14 @@ uniform vec4 u_cameraPosition;
#ifdef fogFlag
uniform vec4 u_fogColor;
varying float v_fog;
#if defined(fogLinearFlag) || defined(fogSmoothFlag) || defined(fogInvSquareFlag)
uniform float u_fogNear;
uniform float u_fogFar;
#elif defined(fogExpFlag) || defined(fogExp2Flag)
uniform float u_fogDensity;
#endif
#endif // fogFlag
uniform mat4 u_projViewTrans;
@@ -174,68 +181,42 @@ void main()
fragment = diffuse.rgb;
#endif // lightingFlag
#ifdef fogFlag
#define fogDistance
//#define fogDepth
#ifdef fogOriginalFlag
vec3 fogVec = u_cameraPosition.xyz - v_worldPosition.xyz;
float fogDist = dot(fogVec, fogVec);
float fog = min(fogDist * u_cameraPosition.w, 1.0);
#elif defined(fogDistanceFlag)
float fogDist = length(v_worldPosition.xyz - u_cameraPosition.xyz);
#elif defined(fogDepthFlag)
float fogDist = gl_FragCoord.z / gl_FragCoord.w;
#endif // fogOriginalFlag || fogDistanceFlag || fogDepthFlag
//#define fogOriginal
//#define fogLinear
#define fogSmooth
//#define fogInvSquare
//#define fogExp
//#define fogExp2
#if defined(fogLinear) || defined(fogSmooth) || defined(fogInvSquare)
float near = 1.5;
float far = 20.5;
#elif defined(fogExp) || defined(fogExp2)
float density = 0.12;
#endif
#ifdef fogOriginal
vec3 fvec = u_cameraPosition.xyz - v_worldPosition.xyz;
float flen = dot(fvec, fvec);
float fog = min(flen * u_cameraPosition.w, 1.0);
#elif defined(fogDistance)
float flen = length(v_worldPosition.xyz - u_cameraPosition.xyz);
#elif defined(fogDepth)
float flen = gl_FragCoord.z / gl_FragCoord.w;
#endif // fogOriginal || fogDistance || fogDepth
#ifdef fogLinear
#ifdef fogLinearFlag
// fog = saturate(linearstep(near, far, x))
float fog = clamp((flen - near) / (far - near), 0.0, 1.0);
#elif defined(fogSmooth)
float fog = clamp((fogDist - u_fogNear) / (u_fogFar - u_fogNear), 0.0, 1.0);
#elif defined(fogSmoothFlag)
// fog = smoothstep(saturate(linearstep(near, far, x)))
float fog = clamp((flen - near) / (far - near), 0.0, 1.0);
float fog = clamp((fogDist - u_fogNear) / (u_fogFar - u_fogNear), 0.0, 1.0);
fog = fog * fog * (3.0 - 2.0 * fog);
//fog = fog * fog * fog * (fog * (6.0 * fog - 15.0) + 10.0);
#elif defined(fogInvSquare)
#elif defined(fogInvSquareFlag)
// fog = isqstep(saturate(linearstep(near, far, x)))
float fog = clamp((flen - near) / (far - near), 0.0, 1.0);
float fog = clamp((fogDist - u_fogNear) / (u_fogFar - u_fogNear), 0.0, 1.0);
fog = 1.0 - fog;
fog = 1.0 - fog * fog;
#elif defined(fogExp)
float fog = max(1.0 - exp(-density * flen), 0.0);
#elif defined(fogExp2)
float dz = density * flen;
#elif defined(fogExpFlag)
// todo: can precompute some stuff in uniforms
float fog = max(1.0 - exp(-u_fogDensity * fogDist), 0.0);
#elif defined(fogExp2Flag)
// todo: can precompute some stuff in uniforms
float dz = u_fogDensity * fogDist;
float fog = max(1.0 - exp(-dz * dz), 0.0);
#endif // fogLinear || fogSmooth || fogInvSquare || fogExp || fogExp2
#endif // fogLinearFlag || fogSmoothFlag || fogInvSquareFlag || fogExpFlag || fogExp2Flag
#ifdef fogFlag
vec3 fogColor = u_fogColor.rgb;
fogColor = linearEncode(fogColor);
fragment = mix(fragment, fogColor, fog);
#endif // fogFlag
gl_FragColor = vec4(linearDecode(fragment), diffuse.a);
/*
if (gl_FragCoord.x > 1280.0)
{
if (fog <= 0.0)
gl_FragColor = vec4(1.0, 0.0, 1.0, diffuse.a);
else if (fog >= 1.0)
gl_FragColor = vec4(1.0, 0.0, 0.0, diffuse.a);
else
gl_FragColor = vec4(fog, fog, 0.0, diffuse.a);
}
*/
}