threepipe
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

cameraHelpers.glsl 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #ifndef BASIC_CAMERA_HELPERS
  2. #define BASIC_CAMERA_HELPERS
  3. // See also PerspectiveCamera2
  4. uniform mat4 projection;
  5. uniform vec2 cameraNearFar;
  6. uniform vec3 cameraPositionWorld;
  7. #ifndef THREE_PACKING_INCLUDED
  8. #define THREE_PACKING_INCLUDED
  9. #include <packing>
  10. #endif
  11. float linstep(float edge0, float edge1, float value) {
  12. return clamp((value-edge0)/(edge1-edge0), 0.0, 1.0);
  13. }
  14. float depthToViewZ(const in float depth){
  15. return (depth > 0.999) ? -cameraNearFar.y * 1000.0 : -mix(cameraNearFar.x, cameraNearFar.y, depth);
  16. }
  17. float viewZToDepth(const in float viewZ){
  18. return linstep(-cameraNearFar.x, -cameraNearFar.y, viewZ);
  19. }
  20. vec4 viewToScreen3(const in vec3 pos) {
  21. vec4 projected = projection * vec4(pos, 1.0);
  22. projected.z = pos.z;
  23. // w is -viewZ
  24. projected.w = 1./projected.w;
  25. projected.xyz *= projected.w;
  26. projected.xy = 0.5 + 0.5 * projected.xy;
  27. return projected;
  28. }
  29. vec3 screenToView(const in vec2 uv, const in float viewZ) {
  30. vec2 uv_ = 2. * uv - 1.;
  31. float xe = -(uv_.x + projection[2][0]) * viewZ / projection[0][0];
  32. float ye = -(uv_.y + projection[2][1]) * viewZ / projection[1][1];
  33. return vec3(xe, ye, viewZ);
  34. }
  35. float viewZFromNDCZ(const in float depth) {
  36. #if PERSPECTIVE_CAMERA == 1
  37. return perspectiveDepthToViewZ(depth, cameraNearFar.x, cameraNearFar.y);
  38. #else
  39. return orthographicDepthToViewZ(depth, cameraNearFar.x, cameraNearFar.y);
  40. #endif
  41. }
  42. #endif