#pragma once
#include "shared.h"
#include "lib/brdf.slang"
vec3 evaluate_ibl(
vec3 albedo,
vec3 normalWS,
vec3 V,
f32 NdotV,
f32 roughness,
f32 metallic,
vec3 F0,
SamplerState samp,
TextureCube<float4> env_irradiance,
TextureCube<float4> env_prefilter,
Texture2D env_brdf_lut,
u32 env_prefilter_mip_count,
) {
vec3 irradiance = env_irradiance.Sample(samp, normalWS.xyz).rgb;
vec3 F_ibl = F_SchlickRoughness(NdotV, F0, roughness);
vec3 kD_ibl = (1.0 - F_ibl) * (1.0 - metallic);
vec3 R = reflect(-V, normalWS);
f32 maxReflectionLod = f32(env_prefilter_mip_count - 1);
vec3 prefilteredColor = env_prefilter.SampleLevel(samp, R, roughness * maxReflectionLod).rgb;
vec2 brdf = env_brdf_lut.Sample(samp, vec2(NdotV, roughness)).rg;
vec3 diffuseIBL = irradiance * albedo * kD_ibl;
vec3 specularIBL = prefilteredColor * (F_ibl * brdf.x + brdf.y);
return specularIBL + diffuseIBL;
};