• Advertisement
Sign in to follow this  

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

This topic is 2074 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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:



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

vec4 Iamb = (m_amb*0.8);

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

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;

Share this post

Link to post
Share on other sites

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:


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


Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement