diff --git a/libraries/pbrlib/genglsl/lib/mx39_microfacet_sheen.glsl b/libraries/pbrlib/genglsl/lib/mx39_microfacet_sheen.glsl index a03803d4a7..4f94e9e0e1 100644 --- a/libraries/pbrlib/genglsl/lib/mx39_microfacet_sheen.glsl +++ b/libraries/pbrlib/genglsl/lib/mx39_microfacet_sheen.glsl @@ -1,6 +1,15 @@ #include "mx39_microfacet.glsl" #include "mx_microfacet_sheen.glsl" +float mx_inversesqrt(float x) +{ +#ifdef __METAL_VERSION__ + return ::rsqrt(x); +#else + return inversesqrt(x); +#endif +} + // The following functions are adapted from https://github.com/tizian/ltc-sheen. // "Practical Multiple-Scattering Sheen Using Linearly Transformed Cosines", Zeltner et al. @@ -33,7 +42,7 @@ mat3 mx39_orthonormal_basis_ltc(vec3 V, vec3 N, float NdotV) float lenSqr = dot(X, X); if (lenSqr > 0.0) { - X *= inversesqrt(lenSqr); + X *= mx_inversesqrt(lenSqr); vec3 Y = cross(N, X); return mat3(X, Y, N); } @@ -83,7 +92,7 @@ vec3 mx39_zeltner_sheen_importance_sample(vec2 Xi, vec3 V, vec3 N, float roughne vec3 w = vec3(wo.x/aInv - wo.z*bInv/aInv, wo.y / aInv, wo.z); float lenSqr = dot(w, w); - w *= inversesqrt(lenSqr); + w *= mx_inversesqrt(lenSqr); // D(w) = Do(wo) . ||M.wo||^3 / |M| // = Do(wo / ||M.wo||) . ||M.wo||^4 / |M|