node_layer_weight.osl 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /*
  2. * Copyright 2011-2013 Blender Foundation
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "stdosl.h"
  17. #include "node_fresnel.h"
  18. shader node_layer_weight(float Blend = 0.5,
  19. normal Normal = N,
  20. output float Fresnel = 0.0,
  21. output float Facing = 0.0)
  22. {
  23. float blend = Blend;
  24. float cosi = dot(I, Normal);
  25. /* Fresnel */
  26. float eta = max(1.0 - Blend, 1e-5);
  27. eta = backfacing() ? eta : 1.0 / eta;
  28. Fresnel = fresnel_dielectric_cos(cosi, eta);
  29. /* Facing */
  30. Facing = fabs(cosi);
  31. if (blend != 0.5) {
  32. blend = clamp(blend, 0.0, 1.0 - 1e-5);
  33. blend = (blend < 0.5) ? 2.0 * blend : 0.5 / (1.0 - blend);
  34. Facing = pow(Facing, blend);
  35. }
  36. Facing = 1.0 - Facing;
  37. }