// (c) 2014 Mikola Lysenko. MIT License // https://github.com/glslify/glsl-diffuse-oren-nayar #define PI 3.14159265 float orenNayarDiffuse(const in vec3 lightDirection, const in vec3 viewDirection, const in vec3 surfaceNormal, const in float roughness, const in float albedo) { float LdotV = dot(lightDirection, viewDirection); float NdotL = dot(lightDirection, surfaceNormal); float NdotV = dot(surfaceNormal, viewDirection); float s = LdotV - NdotL * NdotV; float t = mix(1.0, max(NdotL, NdotV), step(0.0, s)); float sigma2 = roughness * roughness; float A = 1.0 + sigma2 * (albedo / (sigma2 + 0.13) + 0.5 / (sigma2 + 0.33)); float B = 0.45 * sigma2 / (sigma2 + 0.09); return albedo * max(0.0, NdotL) * (A + B * s / t) / PI; } #pragma glslify: export(orenNayarDiffuse)