ibl_lighting.slang

cross platform rendering playground

src/shaders/ibl/ibl_lighting.slang

970 B
#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;
};