Specular highlights "penetrating" and appearing on back of object!

Started by
1 comment, last by synthetix 11 years, 9 months ago
I have a fully GLSL pipeline (no fixed function lighting), and am having some trouble with my Phong shader. I have a scene set up with one light. The issue is that the specular component of the light shows on the front of the model correctly based on where the light is positioned, but also on the back of the model! Diffuse works properly (does not show on the back of the model), so I'm stumped as to why only the specular component is showing the error.

Here are a couple frames that show the problem:

[attachment=9979:phong01.jpg]

[attachment=9980:phong02.jpg]

As you can see, diffuse light is not visible on the back of the model, but specular is! What could be causing this?

Here are my shaders:


/* vertex shader */

attribute vec3 v_position;
attribute vec3 v_normal;

uniform mat4 mat_p; //projection
uniform mat4 mat_mv; //modelview
uniform mat4 mat_n; //normal matrix
uniform vec3 light_pos[2]; //lights

varying vec3 normal; //normal
varying vec3 light_dir[2];
varying vec3 eye_vec;

void main(){

normal = (mat_n * vec4(v_normal,0.0)).xyz;

vec4 newVertex = mat_mv * vec4(v_position,1.0);
eye_vec = -newVertex.xyz;

//send lights to fragment shader
light_dir[0] = light_pos[0] - newVertex.xyz;
light_dir[1] = light_pos[1] - newVertex.xyz;

gl_Position = mat_p * newVertex;
}




/* fragment shader */

uniform vec3 c; //color

varying vec3 normal;
varying vec3 eye_vec;
varying vec3 light_dir[2];

void main(){

vec3 N = normalize(normal);
vec3 E = normalize(eye_vec);

//specify material
vec4 m_amb = vec4(0.07,0.02,0.07,1.0);
vec4 m_diff = vec4(c.r,c.g,c.b,1.0);
vec4 m_spec = vec4(c.r,c.g,c.b,1.0);
clamp(m_spec, 0.0, 1.0);
float m_shine = 20.0;
vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0);

vec3 L = normalize(light_dir[0]); //light position

//ambient
vec4 Iamb = (m_amb*0.8);

//diffuse
vec4 Idiff = m_diff * max(dot(N,L), 0.0);
Idiff = clamp(Idiff, 0.0, 1.0);

//specular
vec3 R = normalize(reflect(-L,N));
vec4 Ispec = m_spec * pow(max(dot(R,E),0.0), m_shine);
Ispec = clamp(Ispec, 0.0, 1.0);

finalColor += Iamb + Idiff + Ispec;


gl_FragColor = finalColor;
}
Advertisement
The specular term should also be multiplied by the clamped [font=courier new,courier,monospace]N.L[/font] value.

The specular term should also be multiplied by the clamped [font=courier new,courier,monospace]N.L[/font] value.


Thanks. I tried the following for the specular calculation and it seemed to fix the problem:


vec3 H = normalize(L + E);
vec4 Ispec = m_spec * pow(max(dot(N,H),0.0), m_shine);


I found some helpful code here:

http://http.develope..._chapter05.html

Interesting that one of the Phong lighting tutorial on the Khronos site leaves that one line out:

http://www.opengl.or...rs/lighting.php

This topic is closed to new replies.

Advertisement