Этот путь может все еще быть медленным, но он не делает разветвления:
vec2 directionToUV(vec3 v) {
vec3 abs = abs(v);
float max = max(max(abs.x, abs.y), abs.z); // Get the largest component
vec3 weights = step(max, abs); // 1.0 for the largest component, 0.0 for the others
float sign = dot(weights, sign(v)) * 0.5 + 0.5; // 0 or 1
// Find the uv coordinate
float sc = dot(weights, mix(vec3(v.z, v.x, -v.x), vec3(-v.z, v.x, v.x), sign));
float tc = dot(weights, mix(vec3(-v.y, -v.z, -v.y), vec3(-v.y, v.z, -v.y), sign));
vec2 uv = (vec2(sc, tc) / max) * 0.5 + 0.5;
// Offset into the right region of the texture
float offsetX = dot(weights, vec3(0.0, 1.0, 2.0));
float offsetY = sign;
uv.x = (uv.x + offsetX) / 3.0;
uv.y = (uv.y + offsetY) / 2.0;
return uv;
}
Где кубические карты расположены как
+----+----+----+
| x | y | z |
+----+----+----+
| -x | -y | -z |
+----+----+----+