Jump to content

  • Log In with Google      Sign In   
  • Create Account

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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 Synthetix   Members   -  Reputation: 190

Like
0Likes
Like

Posted 12 July 2012 - 07:24 AM

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:

phong01.jpg

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;
}


Sponsor:

#2 Hodgman   Moderators   -  Reputation: 30385

Like
0Likes
Like

Posted 12 July 2012 - 08:09 AM

The specular term should also be multiplied by the clamped N.L value.

#3 Synthetix   Members   -  Reputation: 190

Like
0Likes
Like

Posted 12 July 2012 - 08:38 AM

The specular term should also be multiplied by the clamped N.L 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




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS