Now i am working in spotlight lighting. Spotlight does not light my object correctly. I have placed my light at position (0.0,0.0,9.0,1.0), and my spot light cone direction(0.0,0.0,-1.0) and spot cut off angle 16.80, and spot exponent value is 0.15. I have render plane at (0,0,-5) and cube at (0,0,0). It should render as small spot light over my plane and cube, but my spot light only light up the cube. When i increase spot cut off angle to 50.00. But it is a big spot over plane. This is my shader code.
vertex shader :
#version 300 es
in vec3 a_position;
in vec3 a_normal;
in vec2 texcoord;
uniform mat4 u_mvp;
uniform mat4 u_lightMVP;
uniform mat4 u_world;
uniform vec3 u_lightPos;
uniform vec3 u_eyePos;
/*************** material data **********/
uniform vec4 mat_ambient;
uniform vec4 mat_diffuse;
uniform vec4 mat_emission;
uniform vec4 mat_specular;
/***************************************/
out float v_diffuse;
out vec2 frag_tex;
out vec3 rgb;
out vec3 linearColor;
uniform vec4 u_lightColor;
vec3 incidence_vector;
vec3 reflectionVector;
vec3 surfaceToCamera;
/*** light uniform ***/
struct param
{
vec4 color;
vec4 position;
vec4 spot;
//float const_atten;
float quad_atten;
//float linear_atten;
/*float fall_off_angle;
float fall_off_exp;*/
};
layout(std140) uniform light_block
{
param light_par[1];
};
uniform bool texturing;
uniform bool point_light;
uniform bool spot_light;
uniform bool sun_direct_light;
vec4 light_pos = vec4(0.0,0.0,9.0,1.0);
float attenuation;
vec3 cone_dir = vec3(0.0,0.0,-1.0);
float angle = 50.80002f;
float spot_cut_off,spot_attn;
spot_expo = 0.15f;
/*******************************/
void main()
{
gl_Position = u_mvp * vec4(a_position,1.0);
frag_tex = texcoord;
vec4 worldPos = u_world * vec4(a_position,1.0);
vec3 lightDir = normalize(light_pos.xyz - worldPos.xyz);
vec3 worldNormal = normalize(mat3(u_world) * a_normal);
/* calculate diffuse component */
v_diffuse = max(0.0,dot(lightDir, worldNormal));
rgb = light_par[0].color.xyz * mat_diffuse.xyz;
/* calculate attenuation */
float distanceToLight = length(light_pos.xyz - worldPos.xyz);
attenuation = 1.0 / (1.0 + (0.001111 * distanceToLight * distanceToLight) + (0.0 * distanceToLight) );
float clampedCosine1 = max(0.0,dot(-lightDir, normalize(vec3(cone_dir))));
if (clampedCosine1 < cos(radians(angle))) // outside of spotlight cone
{
attenuation = 0.0;
}
else
{
spot_attn = pow(clampedCosine1,spot_expo);
attenuation = attenuation ;
}
linearColor = (attenuation * (rgb));
}
Thanks,