1
0
Fork 0

Fix for black clouds on ATI (bug 1160)

http://code.google.com/p/flightgear-bugs/issues/detail?id=1160

Fix by Emilian Huminiuc.
This commit is contained in:
Stuart Buchanan 2013-12-25 23:14:04 +00:00
parent 92e10cfd30
commit 825abab643
2 changed files with 8 additions and 6 deletions

View file

@ -1,5 +1,6 @@
uniform sampler2D baseTexture; uniform sampler2D baseTexture;
varying float fogFactor; varying float fogFactor;
varying vec4 cloudColor;
void main(void) void main(void)
{ {
@ -7,7 +8,7 @@ void main(void)
if (base.a < 0.02) if (base.a < 0.02)
discard; discard;
vec4 finalColor = base * gl_Color; vec4 finalColor = base * cloudColor;
gl_FragColor.rgb = mix(gl_Fog.color.rgb, finalColor.rgb, fogFactor ); gl_FragColor.rgb = mix(gl_Fog.color.rgb, finalColor.rgb, fogFactor );
gl_FragColor.a = finalColor.a; gl_FragColor.a = finalColor.a;
} }

View file

@ -2,6 +2,7 @@
#version 120 #version 120
varying float fogFactor; varying float fogFactor;
varying vec4 cloudColor;
uniform float range; // From /sim/rendering/clouds3d-vis-range uniform float range; // From /sim/rendering/clouds3d-vis-range
uniform float detail_range; // From /sim/rendering/clouds3d_detail-range uniform float detail_range; // From /sim/rendering/clouds3d_detail-range
@ -48,7 +49,7 @@ void main(void)
// More than detail_range away, so discard all sprites on opposite side of // More than detail_range away, so discard all sprites on opposite side of
// cloud center by shifting them beyond the view fustrum // cloud center by shifting them beyond the view fustrum
gl_Position = vec4(0.0,0.0,10.0,1.0); gl_Position = vec4(0.0,0.0,10.0,1.0);
gl_FrontColor.a = 0.0; cloudColor = vec4(0.0);
} else { } else {
// Determine a lighting normal based on the vertex position from the // Determine a lighting normal based on the vertex position from the
// center of the cloud, so that sprite on the opposite side of the cloud to the sun are darker. // center of the cloud, so that sprite on the opposite side of the cloud to the sun are darker.
@ -70,17 +71,17 @@ void main(void)
// Final position of the sprite // Final position of the sprite
gl_Position = gl_ModelViewProjectionMatrix * gl_Position; gl_Position = gl_ModelViewProjectionMatrix * gl_Position;
gl_FrontColor = gl_LightSource[0].diffuse * shade + gl_FrontLightModelProduct.sceneColor; cloudColor = gl_LightSource[0].diffuse * shade + gl_FrontLightModelProduct.sceneColor;
if ((fogCoord > (0.9 * detail_range)) && (fogCoord > center_dist) && (shade_factor < 0.7)) { if ((fogCoord > (0.9 * detail_range)) && (fogCoord > center_dist) && (shade_factor < 0.7)) {
// cloudlet is almost at the detail range, so fade it out. // cloudlet is almost at the detail range, so fade it out.
gl_FrontColor.a = 1.0 - smoothstep(0.9 * detail_range, detail_range, fogCoord); cloudColor.a = 1.0 - smoothstep(0.9 * detail_range, detail_range, fogCoord);
} else { } else {
// As we get within 100m of the sprite, it is faded out. Equally at large distances it also fades out. // As we get within 100m of the sprite, it is faded out. Equally at large distances it also fades out.
gl_FrontColor.a = min(smoothstep(10.0, 100.0, fogCoord), 1.0 - smoothstep(0.9 * range, range, fogCoord)); cloudColor.a = min(smoothstep(10.0, 100.0, fogCoord), 1.0 - smoothstep(0.9 * range, range, fogCoord));
} }
gl_BackColor = gl_FrontColor; //gl_BackColor = cloudColor;
// Fog doesn't affect clouds as much as other objects. // Fog doesn't affect clouds as much as other objects.
fogFactor = exp( -gl_Fog.density * fogCoord * 0.5); fogFactor = exp( -gl_Fog.density * fogCoord * 0.5);