Классическое решение этой проблемы - построить дерево KD на основе треугольников и запросить его для каждого луча. Вы можете оптимизировать дерево для ожидаемых запросов; если ваши лучи распределены случайным образом, вероятность попадания пропорциональна рассматриваемой площади поверхности.
Даже если вы на самом деле не выполняете трассировку лучей, эта проблема в настоящее время является основным узким местом производительности для трассировки лучей, поэтому вам, вероятно, следует ознакомиться с литературой по ней.