un-hardcode fog config
This commit is contained in:
@@ -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);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user