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/deferred_light.frag

116 lines
3.7 KiB

in vec2 uv;
out vec4 frag_color;
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;
uniform sampler2D albedo_map;
uniform sampler2D position_map;
uniform sampler2D normal_map;
uniform sampler2D depth_map;
uniform Light light;
uniform vec3 camera_pos;
uniform mat4 mvp;
uniform mat4 inv_proj_mat;
uniform vec2 screen_size;
uniform vec2 planes;
vec4 calc_point_light(Light point_light,
vec3 vertex,
vec3 normal,
vec4 albedo_color,
float mat_specular_strength,
float mat_specular)
{
vec4 diffuse = vec4(0.0);
vec4 specular = vec4(0.0);
vec3 light_direction = vertex - point_light.position;
light_direction = normalize(light_direction);
float distance = abs(length(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 = point_light.color * albedo_color * 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, mat_specular_strength);
specular = point_light.color * mat_specular * specular_factor;
}
float attenuation = pow(max(0.0, (1.0 - (distance / point_light.radius))), point_light.falloff + 1.0f);
return (((diffuse + specular) * attenuation) * point_light.intensity);
// if(distance <= 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 = point_light.color * albedo_color * 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, mat_specular_strength);
// specular = point_light.color * mat_specular * specular_factor;
// }
// float attenuation = pow(max(0.0, (1.0 - (distance / point_light.radius))), point_light.falloff + 1.0f);
// return (((diffuse + specular) * attenuation) * point_light.intensity);
// }
// else
// {
// return vec4(0.0);
// }
}
float lz(float depth)
{
return planes.x / (planes.y - depth * (planes.y - planes.x)) * planes.y;
}
void main()
{
//vec2 uv_coords = gl_FragCoord.xy / screen_size;
vec2 uv_coords = uv;
vec4 albedo_color = texture(albedo_map, uv_coords);
vec3 position = texture(position_map, uv_coords).rgb;
vec3 normal = texture(normal_map, uv_coords).rgb;
normal = normalize(normal);
// vec3 position = vec3(0);
// position = vec4(inv_proj_mat * vec4(position, 1.0)).xyz;
// float depth = texture(depth_map, uv_coords.st).x;
// position.x = ((gl_FragCoord.x / screen_size.x) - 0.5) * 2.0;
// position.y = ((-gl_FragCoord.y/screen_size.y)+0.5) * 2.0 / (screen_size.x/screen_size.y);
// position.z = lz(depth);
// position.x *= position.z;
// position.y *= -position.z;
//normal = vec4(inv_proj_mat * vec4(normal, 1.0)).xyz;
frag_color = calc_point_light(light, position, normal, albedo_color, 20, 1.f);
//frag_color = vec4(albedo_color, 1.0);
}