Для каждой плоскости вам нужно построить ее нормальный вектор (перпендикулярный всем линиям в этой плоскости). Простой способ сделать это - взять перекрестное произведение двух непараллельных линий в треугольнике. (напр. (P3-P1) X (P2-P1) и (P4-P1) X (P2-P1).
Нормализуй тех.
Точечное произведение этих двух векторов направления дает вам косинус угла.
Хитрость в том, чтобы следить за вырожденными треугольниками! Если все 3 точки, определяющие любой треугольник, являются коллинеарными (этот треугольник - просто линия), то то, что вы запрашиваете, не определено, и перекрестный продукт разделится на ноль. Вам нужно решить, что вы будете делать в этом случае.
Поскольку вы пытаетесь сделать это на графическом процессоре, в идеале вы захотите написать эту функцию без каких-либо веток, если вы обеспокоены эффективностью. Это означало бы, что вместо проверки на вырожденные треугольники с предложением if
вы должны попытаться сделать это с троичным A ? B : C