precision highp float; precision highp sampler3D; #include "parameters" uniform mat4 inverseProjectionMatrix; uniform mat4 inverseViewMatrix; uniform vec3 cameraPosition; uniform vec3 ellipsoidCenter; uniform mat4 inverseEllipsoidMatrix; uniform vec3 altitudeCorrection; layout(location = 0) in vec3 position; out vec2 vUv; out vec3 vCameraPosition; out vec3 vRayDirection; out vec3 vEllipsoidCenter; void getCameraRay(out vec3 origin, out vec3 direction) { bool isPerspective = inverseProjectionMatrix[2][3] != 0.0; // 4th entry in the 3rd column if (isPerspective) { // Calculate the camera ray for a perspective camera. vec4 viewPosition = inverseProjectionMatrix * vec4(position, 1.0); vec4 worldDirection = inverseViewMatrix * vec4(viewPosition.xyz, 0.0); origin = cameraPosition; direction = worldDirection.xyz; } else { // Unprojected points to calculate direction. vec4 nearPoint = inverseProjectionMatrix * vec4(position.xy, -1.0, 1.0); vec4 farPoint = inverseProjectionMatrix * vec4(position.xy, -0.9, 1.0); nearPoint /= nearPoint.w; farPoint /= farPoint.w; // Calculate world values vec4 worldDirection = inverseViewMatrix * vec4(farPoint.xyz - nearPoint.xyz, 0.0); vec4 worldOrigin = inverseViewMatrix * nearPoint; // Outputs direction = worldDirection.xyz; origin = worldOrigin.xyz; } } void main() { vUv = position.xy * 0.5 + 0.5; vec3 direction, origin; getCameraRay(origin, direction); mat3 rotation = mat3(inverseEllipsoidMatrix); vCameraPosition = rotation * origin.xyz * METER_TO_LENGTH_UNIT; vRayDirection = rotation * direction.xyz; vEllipsoidCenter = (ellipsoidCenter + altitudeCorrection) * METER_TO_LENGTH_UNIT; gl_Position = vec4(position.xy, 1.0, 1.0); }