#623: don't modify depth buffer at grazing angles in the urban shader
This commit is contained in:
parent
b3a3f73a69
commit
4df297522c
1 changed files with 13 additions and 6 deletions
|
@ -175,9 +175,12 @@ void main (void)
|
||||||
if ( quality_level >= 3.0 ) {
|
if ( quality_level >= 3.0 ) {
|
||||||
linear_search_steps = 20;
|
linear_search_steps = 20;
|
||||||
}
|
}
|
||||||
|
vec3 normal = normalize(VNormal);
|
||||||
|
vec3 tangent = normalize(VTangent);
|
||||||
|
vec3 binormal = normalize(VBinormal);
|
||||||
vec3 ecPos3 = ecPosition.xyz / ecPosition.w;
|
vec3 ecPos3 = ecPosition.xyz / ecPosition.w;
|
||||||
vec3 V = normalize(ecPos3);
|
vec3 V = normalize(ecPos3);
|
||||||
vec3 s = vec3(dot(V, VTangent), dot(V, VBinormal), dot(VNormal, -V));
|
vec3 s = vec3(dot(V, tangent), dot(V, binormal), dot(normal, -V));
|
||||||
vec2 ds = s.xy * depth_factor / s.z;
|
vec2 ds = s.xy * depth_factor / s.z;
|
||||||
vec2 dp = gl_TexCoord[0].st - ds;
|
vec2 dp = gl_TexCoord[0].st - ds;
|
||||||
float d = ray_intersect(dp, ds);
|
float d = ray_intersect(dp, ds);
|
||||||
|
@ -189,7 +192,7 @@ void main (void)
|
||||||
float emis = N.z;
|
float emis = N.z;
|
||||||
N.z = sqrt(1.0 - min(1.0,dot(N.xy, N.xy)));
|
N.z = sqrt(1.0 - min(1.0,dot(N.xy, N.xy)));
|
||||||
float Nz = N.z;
|
float Nz = N.z;
|
||||||
N = normalize(N.x * VTangent + N.y * VBinormal + N.z * VNormal);
|
N = normalize(N.x * tangent + N.y * binormal + N.z * normal);
|
||||||
|
|
||||||
vec3 l = gl_LightSource[0].position.xyz;
|
vec3 l = gl_LightSource[0].position.xyz;
|
||||||
vec3 diffuse = gl_Color.rgb * max(0.0, dot(N, l));
|
vec3 diffuse = gl_Color.rgb * max(0.0, dot(N, l));
|
||||||
|
@ -198,7 +201,7 @@ void main (void)
|
||||||
// Shadow
|
// Shadow
|
||||||
if ( quality_level >= 2.0 ) {
|
if ( quality_level >= 2.0 ) {
|
||||||
dp += ds * d;
|
dp += ds * d;
|
||||||
vec3 sl = normalize( vec3( dot( l, VTangent ), dot( l, VBinormal ), dot( -l, VNormal ) ) );
|
vec3 sl = normalize( vec3( dot( l, tangent ), dot( l, binormal ), dot( -l, normal ) ) );
|
||||||
ds = sl.xy * depth_factor / sl.z;
|
ds = sl.xy * depth_factor / sl.z;
|
||||||
dp -= ds * d;
|
dp -= ds * d;
|
||||||
float dl = ray_intersect(dp, ds);
|
float dl = ray_intersect(dp, ds);
|
||||||
|
@ -237,11 +240,15 @@ void main (void)
|
||||||
finalColor *= ambient_light;
|
finalColor *= ambient_light;
|
||||||
|
|
||||||
vec4 p = vec4( ecPos3 + tile_size * V * (d-1.0) * depth_factor / s.z, 1.0 );
|
vec4 p = vec4( ecPos3 + tile_size * V * (d-1.0) * depth_factor / s.z, 1.0 );
|
||||||
vec4 iproj = gl_ProjectionMatrix * p;
|
|
||||||
iproj /= iproj.w;
|
|
||||||
|
|
||||||
finalColor.rgb = fog_Func(finalColor.rgb, fogType);
|
finalColor.rgb = fog_Func(finalColor.rgb, fogType);
|
||||||
gl_FragColor = finalColor;
|
gl_FragColor = finalColor;
|
||||||
|
|
||||||
gl_FragDepth = (iproj.z+1.0)/2.0;
|
if (dot(normal,-V) > 0.017) {
|
||||||
|
vec4 iproj = gl_ProjectionMatrix * p;
|
||||||
|
iproj /= iproj.w;
|
||||||
|
gl_FragDepth = (iproj.z+1.0)/2.0;
|
||||||
|
} else {
|
||||||
|
gl_FragDepth = gl_FragCoord.z;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue