I'm trying to add some lighting to a rendering system in OpenGL but it's not working properly and I don't understand why. So there is the vertex shader :
Code: Select all
#version 140
in vec3 Position;
in vec3 Normal;
in vec2 UVMap;
in vec3 Tangent;
out vec2 STMap;
out vec3 normal0;
out vec3 FragPos;
uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
void main()
{
vec4 WorldPosition = ModelMatrix * vec4(Position, 1.0);
gl_Position = ProjectionMatrix * ViewMatrix * WorldPosition;
normal0 = vec3(ModelMatrix * vec4(Normal, 0.0));
STMap = UVMap;
FragPos = WorldPosition.xyz;
}
Code: Select all
#version 140
#define NUMBER_OF_POINT_LIGHTS 4
#define NUMBER_OF_SPOT_LIGHTS 4
struct SMaterial
{
sampler2D Diffuse;
sampler2D Specular;
float Shininess;
};
struct SDirectionalLight
{
vec3 Direction;
vec3 Ambient;
vec3 Diffuse;
vec3 Specular;
};
struct SPointLight
{
vec3 Position;
vec3 Ambient;
vec3 Diffuse;
vec3 Specular;
float Constant;
float Linear;
float Quadratic;
};
struct SSpotLight
{
vec3 Position;
vec3 Direction;
vec3 Ambient;
vec3 Diffuse;
vec3 Specular;
float CutOff;
float OuterCutOff;
float Constant;
float Linear;
float Quadratic;
};
in vec2 STMap;
in vec3 normal0;
in vec3 FragPos;
uniform vec3 ViewPos;
uniform SDirectionalLight DirectionalLight;
uniform SPointLight PointLights[NUMBER_OF_POINT_LIGHTS];
uniform SSpotLight SpotLights[NUMBER_OF_SPOT_LIGHTS];
uniform SMaterial Material;
vec3 CalcDirectionalLight(SDirectionalLight Light, vec3 Normal, vec3 ViewDir);
vec3 CalcPointLight(SPointLight Light, vec3 Normal, vec3 FragPos, vec3 ViewDir);
vec3 CalcSpotLight(SSpotLight Light, vec3 Normal, vec3 FragPos, vec3 ViewDir);
void main()
{
vec3 norm = normalize(normal0);
vec3 ViewDirection = normalize(ViewPos - FragPos);
vec3 Result = CalcDirectionalLight(DirectionalLight, norm, ViewDirection);
for (int i = 0; i < NUMBER_OF_POINT_LIGHTS; i++)
{
Result += CalcPointLight(PointLights[i], norm, FragPos, ViewDirection);
}
for (int i = 0; i < NUMBER_OF_SPOT_LIGHTS; i++)
{
Result += CalcSpotLight(SpotLights[i], norm, FragPos, ViewDirection);
}
gl_FragColor = vec4(Result, 1.0);
}
// Calculates the color when using a directional light.
vec3 CalcDirectionalLight(SDirectionalLight Light, vec3 Normal, vec3 ViewDir)
{
vec3 LightDir = normalize(-Light.Direction);
// Diffuse shading
float Diff = max(dot(Normal, LightDir), 0.0);
// Specular shading
vec3 ReflectDir = reflect( -LightDir, Normal);
float Spec = pow( max( dot( ViewDir, ReflectDir ), 0.0 ), Material.Shininess);
// Combine results
vec3 Ambient = Light.Ambient * vec3( texture(Material.Diffuse, STMap));
vec3 Diffuse = Light.Diffuse * Diff * vec3( texture(Material.Diffuse, STMap));
vec3 Specular = Light.Specular * Spec * vec3( texture(Material.Specular, STMap));
return (Ambient + Diffuse + Specular);
}
// Calculates the color when using a point light.
vec3 CalcPointLight(SPointLight Light, vec3 Normal, vec3 FragPosition, vec3 ViewDir)
{
vec3 LightDir = normalize(Light.Position - FragPosition);
// Diffuse shading
float Diff = max(dot(Normal, LightDir), 0.0);
// Specular shading
vec3 ReflectDir = reflect( -LightDir, Normal);
float Spec = pow( max( dot( ViewDir, ReflectDir ), 0.0 ), Material.Shininess);
// Attenuation
float Distance = length(Light.Position - FragPosition);
float Attenuation = 1.0f / (Light.Constant + Light.Linear * Distance + Light.Quadratic * Distance * Distance);
// Combine results
vec3 Ambient = Light.Ambient * vec3( texture(Material.Diffuse, STMap));
vec3 Diffuse = Light.Diffuse * Diff * vec3( texture(Material.Diffuse, STMap));
vec3 Specular = Light.Specular * Spec * vec3( texture(Material.Specular, STMap));
Ambient *= Attenuation;
Diffuse *= Attenuation;
Specular *= Attenuation;
return (Ambient + Diffuse + Specular);
}
// Calculates the color when using a spot light.
vec3 CalcSpotLight(SSpotLight Light, vec3 Normal, vec3 FragPosition, vec3 ViewDir )
{
vec3 LightDir = normalize(Light.Position - FragPosition );
// Diffuse shading
float Diff = max( dot(Normal, LightDir ), 0.0 );
// Specular shading
vec3 ReflectDir = reflect(-LightDir, Normal );
float Spec = pow( max( dot( ViewDir, ReflectDir ), 0.0 ), Material.Shininess );
// Attenuation
float Distance = length(Light.Position - FragPosition );
float Attenuation = 1.0f / (Light.Constant + Light.Linear * Distance + Light.Quadratic * Distance * Distance);
// Spotlight intensity
float Theta = dot(LightDir, normalize(-Light.Direction));
float Epsilon = Light.CutOff - Light.OuterCutOff;
float Intensity = clamp((Theta - Light.OuterCutOff ) / Epsilon, 0.0, 1.0);
// Combine results
vec3 Ambient = Light.Ambient * vec3( texture(Material.Diffuse, STMap));
vec3 Diffuse = Light.Diffuse * Diff * vec3( texture(Material.Diffuse, STMap));
vec3 Specular = Light.Specular * Spec * vec3( texture(Material.Specular, STMap));
Ambient *= Attenuation * Intensity;
Diffuse *= Attenuation * Intensity;
Specular *= Attenuation * Intensity;
return (Ambient + Diffuse + Specular);
}
The proof the the original code is working can be seen here : https://youtu.be/vnUQOIODAKc
The problem I have is simple the 3D model is solid black instead of a textured one and I don't understand why. Any ideas ...
Thanks.
StarBootics