Чтобы пересечь луч с выпуклым многогранником, пересекайте луч с плоскостями, содержащими каждую грань.
Предположим, что луч начинается в q и имеет направление r . Тогда любая точка на луче может быть представлена как q + t r для скалярного параметра t . Теперь предположим, что мы хотим пересечь этот луч с плоскостью, заданной уравнением p · n = k (где n - это внешний -установка нормальная к лицу). Луч пересекает плоскость, когда
( q + t r ) · n = k
То есть, когда
q · n + t r · n = k
и так
t = ( k - q · n ) / r · n
Луч входит в лицо, когда r · n отрицательно, и выходит, когда r · n положительно. Когда r · n равно нулю, луч параллелен лицу. Вы должны проверить этот случай, чтобы избежать деления на ноль; и в этом случае, если q · n > k , луч полностью пропускает многогранник.
Итак, найдите t для всех граней вашего многогранника и пусть t в будет максимальным t для точек, где луч входит в лицо, и t out будет минимальным t для точек, где луч выходит из лица. Тогда длина луча внутри многогранника равна
max (max ( t out , 0) - max ( t in , 0), 0) / | г |
Если r - единичный вектор, вы можете избежать деления здесь. Два внутренних максимума ( t , 0) необходимы для обработки случая, когда камера находится внутри куба или куб находится позади камеры. Внешний максимум (..., 0) предназначен для обработки случая, когда луч полностью не попадает в куб (в этом случае t в будет больше t из ).
Боюсь, я понятия не имею, как представить это вычисление на вашем языке шейдеров, не говоря уже о том, как сделать это без ответвлений.