123456789101112131415161718192021 |
- // (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)
|