To pbrfrag.vs, add the following:
#version 330 core
out vec4 frag_color;
in vec3 world_pos;
in vec3 normal;
in vec3 cam_pos;
// material parameters
uniform vec3 albedo;
uniform float metallic;
uniform float roughness;
uniform float ao;
struct light
{
vec3 position;
vec3 color;
float attenuation;
};
#define NUM_LIGHTS 3
uniform light light_data[NUM_LIGHTS];
const float PI = 3.14159265359;
void main()
{
vec3 N = normalize(normal);
vec3 V = normalize(cam_pos - world_pos);
vec3 color = vec3(0,0,0);
for(int i = 0; i < NUM_LIGHTS; ++i) //each light
{
// calculate per-light radiance
vec3 L = normalize(light_data[i].position -
world_pos);
vec3 H = normalize(V + L);
float distance =
length(light_data[i].position -
world_pos);
float attenuation = light_data[i].attenuation
/
(distance * distance);
vec3 radiance = light_data[i].color *
light_data[i].attenuation;
color += radiance;
}
color *= albedo * roughness * metallic *
ao * normal;
frag_color = vec4(color, 1.0);
}