Hello people,
I am trying to develop a basic Ray Tracer. So far i have calculated intersection with a plane and blinn-phong shading. My problem is that i m getting some specular highlights on plane which i think should not be there (i am not sure of).
i am working on a 500*500 window and my primary ray generation code is as follows
vec3 rayDirection = vec3( gl_FragCoord.x-250.0,250.0-gl_FragCoord.y , 10.0);
code for finding out intersection of ray with plane…
int planeIntersect(vec3 rayDir, vec3 rayOrigin, out float t1)
{
vec3 planeNormal = vec3(0.0,1.0,0.0);
vec3 planePoint = vec3(0.0,-10.0,0.0);
// rayDir= normalize(rayDir);
if(dot(planeNormal, rayDir ) > 0)
{
t1 = -dot(planeNormal, (rayOrigin - planePoint)) / dot(planeNormal,rayDir);
return 1;
}
else
return 0; //no intersection or intersection behind camera
}
then if a intersection is found i compute final color as follows…
if(planeIntersect(rayDirection, camera, t1) == 1)
{
//calculating point of intersection
vec3 iPoint,iNormal;
iPoint.x = camera.x + rayDirection.x * t1;
iPoint.y = camera.y + rayDirection.y * t1;
iPoint.z = camera.z + rayDirection.z * t1;
//calculating normal at point of intersection
iNormal = vec3 (0.0,1.0,0.0);
lightColor = computeLight(iPoint, iNormal);
if(textureEnabled==1)
wTex = texture2D(wallTex,gl_TexCoord[0].st).rgb;
//lightColor = computeLight();
if(textureEnabled==1)
lightColor = lightColor * wTex;
gl_FragColor = vec4(lightColor,1.0);
// gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
else {
//discard;
gl_FragColor = vec4(0.0,0.0,1.0,1.0);
}
Finally light computation…
vec3 computeLight(vec3 iPoint, vec3 iNormal)
{
vec3 normal,lightDir,halfVector;
vec3 n,halfV,viewV,ldir;
float NdotL,NdotHV;
vec4 diffuse1, ambient1;
lightDir = normalize(lightPosition - iPoint);
viewV = normalize (camera - iPoint);
halfVector = normalize(lightDir + viewV);
/* Compute the diffuse, ambient and globalAmbient terms */
diffuse1 = mat_diffuse* gl_LightSource[0].diffuse;
ambient1 = mat_ambient * gl_LightSource[0].ambient;
ambient1 += gl_LightModel.ambient * mat_ambient;
/* a fragment shader can't write a verying variable, hence we need
a new variable to store the normalized interpolated normal */
n = normalize(iNormal);
vec4 color = ambient1;
/* compute the dot product between normal and ldir */
NdotL = max(dot(n,lightDir),0.0);
if (NdotL > 0.0) {
// halfV = normalize(halfVector);
NdotHV = max(dot(n,halfVector),0.0);
color += mat_specular * gl_LightSource[0].specular * pow(NdotHV,shininess);
color += diffuse1 * NdotL;
}
return color.rgb;
}
material and light properties are as follows…
vec3 lightPosition = vec3 (0.0, 15.0, 0.0);
vec4 mat_ambient = vec4( 0.7, 0.0, 0.0, 1.0 );
vec4 mat_diffuse = vec4( 0.7, 0.0, 0.0, 1.0 );
vec4 mat_specular = vec4(0.0,1.0,0.0,1.0);
vec3 camera = vec3(0.0,5.0,30.0);
float shininess = 10;
//light properties
GLfloat specular[] = { 0.0, 1.0, 0.0, 1.0 };
GLfloat ambient[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat diffuse[] = { 0.7, 0.7, 0.7, 1.0 };
Please tell me if my output is even right or wrong…!!
Please find my output attached for reference…
Thanks in Advance…
Edit: File Added