Z Fighting in specular component (GLSL directional light)

Started by
1 comment, last by gzaloprgm 13 years, 12 months ago
Hi, I am experiencing Z-fighting in the specular component of my GLSL computed directional light. This is mostly noticed in surfaces perpendicular to the light direction. This are my shaders: Vertex Shader: uniform vec3 lightDir; uniform mat4 viewMatrixInverse; varying vec3 eyeNormal,eyeLDir,eyeVector; void main(void) { gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex; gl_Position = ftransform(); gl_TexCoord[0] = gl_MultiTexCoord0; gl_FrontColor = gl_Color; eyeNormal = gl_NormalMatrix * gl_Normal; eyeLDir = mat3(viewMatrixInverse) * normalize(lightDir); eyeVector = vec3(gl_ModelViewMatrix * gl_Vertex); } Fragment Shader: uniform sampler2D colorMap; const vec4 LA = vec4(0.3, 0.3, 0.3, 1.0); const vec4 LD = vec4(0.5, 0.5, 0.5, 1.0); const vec4 LI = vec4(0.5, 0.5, 0.5, 1.0); const float LIi = 32.0; varying vec3 eyeNormal,eyeLDir,eyeVector; vec3 directionalLight(vec3 eNorm, vec3 eLDir, vec3 eVector){ float LSt, LSi; vec3 result, reflejo; float LDi = max(dot(normalize(eNorm), normalize(eLDir)),0.0); result = vec3(0,0,0); if(LDi > 0.0){ result += LDi * LD; reflejo = reflect(normalize(eLDir), normalize(eNorm)); LSt = max(dot(normalize(eVector), normalize(reflejo)),0.0); LSi = pow(LSt, LIi); result += LI * LSi; } return result; } void main (void) { vec4 result = LA; vec4 texel = texture2D(colorMap,gl_TexCoord[0].st); result += vec4(directionalLight(eyeNormal,eyeLDir,eyeVector),1.0); gl_FragColor = result*texel; } In this image the light direction is down, I am looking at a vertical wall and there is some surface acne. Is there anything I am not calculating correctly in my shader? Thanks for your help, Gzaloprgm
In tangent space no one can hear you scream
Advertisement
I suppose that you dont't have 2 coplanar polygons in your wall. So that can't be really z-fighting. Still I think it has been caused by the same problem: the floating point imprecision. When the computations involve floating point numbers one should write:
if(abs(LDi) > EPSILON){    /* do stuff */}

instead of this:
if(LDi > 0.0){    /* do stuff */}

where EPSILON is some small number (ex. 0.001). This will take care of the rounding errors including the occasional change of sign.
Thanks Decibit, that was exactly the problem.

I know, I should have called it surface acne instead of zfighting, :P

Cheers,
Gzaloprgm
In tangent space no one can hear you scream

This topic is closed to new replies.

Advertisement