/// <summary> /// Computes the ratio of self-masked area to visible area. Used by <see cref="MaskingShadowing(Vector3)"/>. /// </summary> /// <param name="normal">Normal of the microfacets, in shading space.</param> /// <returns>Ratio of self-masked area to visible area.</returns> public float MaskingRatio(Vector3 normal) { float absTanTheta = MathF.Abs(ShadingSpace.TanTheta(normal)); if (float.IsInfinity(absTanTheta)) { return(0); } float alpha = MathF.Sqrt(ShadingSpace.CosPhiSqr(normal) * AlphaX * AlphaX + ShadingSpace.SinPhiSqr(normal) * AlphaY * AlphaY); float alpha2Tan2Theta = alpha * absTanTheta * (alpha * absTanTheta); return((-1 + MathF.Sqrt(1 + alpha2Tan2Theta)) / 2); }