A 3d fps game made in OpenGL
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
Symmetry/assets/shaders/blinn_phong.frag

87 lines
2.3 KiB

//include common.glsl commonFrag.glsl version.glsl
struct Light
{
vec3 position;
float outer_angle;
float inner_angle;
float falloff;
float intensity;
vec4 color;
uint pcf_enabled;
int type;
int radius;
float depth_bias;
};
const int LT_SPOT = 0;
const int LT_DIR = 1;
const int LT_POINT = 2;
const int MAX_LIGHTS = 128;
uniform vec3 camera_pos;
uniform sampler2D diffuse_texture;
uniform Light lights[MAX_LIGHTS];
uniform int total_active_lights;
uniform float specular;
uniform float diffuse;
uniform float specular_strength;
out vec4 frag_color;
vec4 calc_point_light(in Light point_light)
{
vec4 diffuse_comp = vec4(0.0);
vec4 specular_comp = vec4(0.0);
vec3 light_direction = vertex - point_light.position;
float dist = abs(length(light_direction));
if(dist <= point_light.radius)
{
light_direction = normalize(light_direction);
vec3 normalized_normal = normalize(normal);
float cos_ang_incidence = dot(normalized_normal, -light_direction);
cos_ang_incidence = clamp(cos_ang_incidence, 0, 1);
if(cos_ang_incidence > 0)
{
diffuse_comp = point_light.color * diffuse * cos_ang_incidence;
vec3 vertex_to_eye = normalize(camera_pos - vertex);
vec3 light_reflect = normalize(reflect(light_direction, normalized_normal));
float specular_factor = max(0.0, dot(vertex_to_eye, light_reflect));
specular_factor = pow(specular_factor, specular_strength);
specular_comp = point_light.color * specular * specular_factor;
}
float attenuation = pow(max(0.0, (1.0 - (dist / point_light.radius))), point_light.falloff + 1.0f);
return (((diffuse_comp + specular_comp) * attenuation) * point_light.intensity);
}
else
{
return vec4(0.0);
}
}
void main()
{
vec4 albedo_color = diffuse_color * texture(diffuse_texture, uv);
vec4 light_contribution = vec4(0.0, 0.0, 0.0, 1.0);
for(int i = 0; i < total_active_lights; i++)
{
if(i == total_active_lights) break;
// if(lights[i].type == LT_POINT)
light_contribution += calc_point_light(lights[i]);
}
frag_color = (albedo_color * vec4(0.1, 0.1, 0.1, 1.0)) +
(albedo_color * light_contribution);
//frag_color = lights[0].color;
//frag_color = vec4(lights[0].intensity, 0.0, 0.0, 1.0);
//frag_color = vec4(lights[0].position, 1.0);
//frag_color = vec4(camera_pos, 1.0);
//frag_color = vec4(total_active_lights);
}