Files

61 lines
2.1 KiB
GLSL

layout (set = 2, binding = 0) uniform samplerCube u_diffuse;
layout (set = 2, binding = 1) uniform samplerCube u_specular;
#include "camera.glsl"
#include "constants_utils.glsl"
#include "spm_data.glsl"
#include "pbr_utils.glsl"
#include "global_light_data.glsl"
#include "pbr_light.glsl"
#include "sun_direction.glsl"
vec3 handlePBRDeferred(vec3 diffuse_color, vec3 pbr, vec3 world_normal,
vec3 eyedir, vec3 normal, float perceptual_roughness)
{
float radiance_level = perceptual_roughness * u_specular_levels_minus_one;
vec3 reflection = reflect(-eyedir, normal);
vec3 irradiance = vec3(0.0);
vec3 radiance = vec3(0.0);
if (u_ibl)
{
vec3 world_reflection = (u_camera.m_inverse_view_matrix *
vec4(reflection, 0.0)).xyz;
irradiance = texture(u_diffuse, world_normal).rgb;
radiance = textureLod(u_specular, world_reflection, radiance_level).rgb;
}
vec3 lightdir = sunDirection(reflection,
u_global_light.m_sun_direction, u_global_light.m_sun_angle_tan_half,
u_camera.m_inverse_view_matrix);
vec3 mixed_color = PBRSunAmbientEmitLight(
normal, eyedir, lightdir, diffuse_color,
irradiance, radiance,
u_global_light.m_sun_color,
u_global_light.m_ambient_color,
perceptual_roughness, pbr.y, pbr.z);
return mixed_color;
}
vec3 handlePBR(vec3 diffuse_color, vec3 pbr, vec4 world_position,
vec3 world_normal)
{
vec3 xpos = (u_camera.m_view_matrix * world_position).xyz;
vec3 eyedir = -normalize(xpos);
vec3 normal = (u_camera.m_view_matrix * vec4(world_normal, 0.0)).xyz;
float perceptual_roughness = 1.0 - pbr.x;
vec3 mixed_color = handlePBRDeferred(diffuse_color, pbr, world_normal,
eyedir, normal, perceptual_roughness);
mixed_color += accumulateLights(u_global_light.m_light_count,
diffuse_color, normal, xpos, eyedir, perceptual_roughness, pbr.y);
//Disable for deferred shading
//float factor = (1.0 - exp(length(xpos) * -0.0001));
//mixed_color = mixed_color + vec3(0.5) * factor;
return convertColor(mixed_color);
}