reflectionFunction.fx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. vec3 computeReflectionCoords(vec4 worldPos, vec3 worldNormal)
  2. {
  3. #ifdef REFLECTIONMAP_EQUIRECTANGULAR_FIXED
  4. vec3 direction = normalize(vDirectionW);
  5. float t = clamp(direction.y * -0.5 + 0.5, 0., 1.0);
  6. float s = atan(direction.z, direction.x) * RECIPROCAL_PI2 + 0.5;
  7. return vec3(s, t, 0);
  8. #endif
  9. #ifdef REFLECTIONMAP_EQUIRECTANGULAR
  10. vec3 cameraToVertex = normalize(worldPos.xyz - vEyePosition);
  11. vec3 r = reflect(cameraToVertex, worldNormal);
  12. float t = clamp(r.y * -0.5 + 0.5, 0., 1.0);
  13. float s = atan(r.z, r.x) * RECIPROCAL_PI2 + 0.5;
  14. return vec3(s, t, 0);
  15. #endif
  16. #ifdef REFLECTIONMAP_SPHERICAL
  17. vec3 viewDir = normalize(vec3(view * worldPos));
  18. vec3 viewNormal = normalize(vec3(view * vec4(worldNormal, 0.0)));
  19. vec3 r = reflect(viewDir, viewNormal);
  20. r.z = r.z - 1.0;
  21. float m = 2.0 * length(r);
  22. return vec3(r.x / m + 0.5, 1.0 - r.y / m - 0.5, 0);
  23. #endif
  24. #ifdef REFLECTIONMAP_PLANAR
  25. vec3 viewDir = worldPos.xyz - vEyePosition;
  26. vec3 coords = normalize(reflect(viewDir, worldNormal));
  27. return vec3(reflectionMatrix * vec4(coords, 1));
  28. #endif
  29. #ifdef REFLECTIONMAP_CUBIC
  30. vec3 viewDir = worldPos.xyz - vEyePosition;
  31. vec3 coords = reflect(viewDir, worldNormal);
  32. #ifdef INVERTCUBICMAP
  33. coords.y = 1.0 - coords.y;
  34. #endif
  35. return vec3(reflectionMatrix * vec4(coords, 0));
  36. #endif
  37. #ifdef REFLECTIONMAP_PROJECTION
  38. return vec3(reflectionMatrix * (view * worldPos));
  39. #endif
  40. #ifdef REFLECTIONMAP_SKYBOX
  41. return vPositionUVW;
  42. #endif
  43. #ifdef REFLECTIONMAP_EXPLICIT
  44. return vec3(0, 0, 0);
  45. #endif
  46. }