add bloom;some treaks
This commit is contained in:
@ -7,6 +7,8 @@ layout(binding = 0, rgba32f) restrict writeonly uniform imageCube o_CubeMap;
|
||||
|
||||
uniform vec3 u_TurbidityAzimuthInclination;
|
||||
|
||||
#define PI 3.14159265359
|
||||
|
||||
vec3 GetCubeMapTexCoord()
|
||||
{
|
||||
vec2 st = gl_GlobalInvocationID.xy / vec2(imageSize(o_CubeMap));
|
||||
@ -22,11 +24,10 @@ vec3 GetCubeMapTexCoord()
|
||||
return normalize(ret);
|
||||
}
|
||||
|
||||
#define PI 3.14159265359
|
||||
|
||||
float saturatedDot( in vec3 a, in vec3 b )
|
||||
{
|
||||
return max( dot( a, b ), 0.0 );
|
||||
return clamp(dot(a, b), 0.0, 1.0);
|
||||
}
|
||||
|
||||
vec3 YxyToXYZ( in vec3 Yxy )
|
||||
@ -96,6 +97,7 @@ vec3 calculateZenithLuminanceYxy( in float t, in float thetaS )
|
||||
|
||||
vec3 calculatePerezLuminanceYxy( in float theta, in float gamma, in vec3 A, in vec3 B, in vec3 C, in vec3 D, in vec3 E )
|
||||
{
|
||||
float cosTheta = max(cos(theta), 1e-6);
|
||||
return ( 1.0 + A * exp( B / cos( theta ) ) ) * ( 1.0 + C * exp( D * gamma ) + E * cos( gamma ) * cos( gamma ) );
|
||||
}
|
||||
|
||||
@ -104,8 +106,8 @@ vec3 calculateSkyLuminanceRGB( in vec3 s, in vec3 e, in float t )
|
||||
vec3 A, B, C, D, E;
|
||||
calculatePerezDistribution( t, A, B, C, D, E );
|
||||
|
||||
float thetaS = acos( saturatedDot( s, vec3(0,1,0) ) );
|
||||
float thetaE = acos( saturatedDot( e, vec3(0,1,0) ) );
|
||||
float thetaS = acos(clamp(dot(s, vec3(0,1,0)), 0.0, 1.0));
|
||||
float thetaE = acos(clamp(dot(e, vec3(0,1,0)), 0.0, 1.0));
|
||||
float gammaE = acos( saturatedDot( s, e ) );
|
||||
|
||||
vec3 Yz = calculateZenithLuminanceYxy( t, thetaS );
|
||||
@ -128,8 +130,30 @@ void main()
|
||||
float inclination = u_TurbidityAzimuthInclination.z;
|
||||
vec3 sunDir = normalize( vec3( sin(inclination) * cos(azimuth), cos(inclination), sin(inclination) * sin(azimuth) ) );
|
||||
vec3 viewDir = cubeTC;
|
||||
vec3 skyLuminance = calculateSkyLuminanceRGB( sunDir, viewDir, turbidity );
|
||||
|
||||
const float SUN_ANGULAR_RADIUS = 0.03465;
|
||||
const float SUN_INTENSITY = 100.0;
|
||||
vec3 skyLuminance;
|
||||
|
||||
if (viewDir.y < 0.0) {
|
||||
skyLuminance = vec3(0.02);
|
||||
} else {
|
||||
skyLuminance = calculateSkyLuminanceRGB(sunDir, viewDir, turbidity);
|
||||
}
|
||||
|
||||
float cosAngle = dot(viewDir, sunDir);
|
||||
float angle = acos(cosAngle);
|
||||
if (angle < SUN_ANGULAR_RADIUS) {
|
||||
skyLuminance = vec3(SUN_INTENSITY);
|
||||
} else {
|
||||
float haloWidth = 0.1;
|
||||
if (angle < SUN_ANGULAR_RADIUS + haloWidth) {
|
||||
float t = (angle - SUN_ANGULAR_RADIUS) / haloWidth;
|
||||
float haloFactor = 1.0 - smoothstep(0.0, 1.0, t);
|
||||
skyLuminance += vec3(SUN_INTENSITY * 0.1 * haloFactor);
|
||||
}
|
||||
}
|
||||
|
||||
vec4 color = vec4(skyLuminance * 0.05, 1.0);
|
||||
imageStore(o_CubeMap, ivec3(gl_GlobalInvocationID), color);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user