Sign in to follow this  
synthetix

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

Recommended Posts

synthetix    192
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:

[CODE]
/* 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;
}[/CODE]


[CODE]
/* 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;
}
[/CODE]

Share this post


Link to post
Share on other sites
synthetix    192
[quote name='Hodgman' timestamp='1342102180' post='4958403']
The specular term should also be multiplied by the clamped [font=courier new,courier,monospace]N.L[/font] value.
[/quote]

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

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

I found some helpful code here:

[url="http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter05.html"]http://http.develope..._chapter05.html[/url]

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

[url="http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php"]http://www.opengl.or...rs/lighting.php[/url]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this