Как в вершинjм буфере вычисляются глобальные координаты?
Не могу понять, как оптимально решить такую задачу.
Как трансформировать вершину грани на пальце, на руке персонажа, который едет на машине, которая едет на авианосце, который плывет? Как решить такую задачу на gpu? И таких моделей деревьев, целая куча.
Надо что, на все матрицы умножать? Очевидно будет куча повторных вычислений. А по дереву, как на CPU невозможно сделать, так 1 поток на 1 вершину должен быть назначен. Плюс еще надо какой-то новый буфер как дерево, создавать с индексами локальных матриц в дереве матриц по типу
struct localMaatrix
Matrix3x3 transform
int rootIndex
Я вообще не могу найти ни одного примера, вообще как это загуглить то, все примеры что видел, с 1 локальной матрицей и 1 дравколом на каждый супер простой объект типа куба.
Да, надо умножать на все матрицы. Или сначала вычислить произведение всех матриц, а затем координаты умножить на него. Внимание: произведение матриц некоммутативно, не перепутайте порядок умножения.
U235U235, ну это понятно, ну это же долго, я спрашиваю, есть ли какие способы оптимизировать.
Например, самая лучшая оптимизация очевидна, Идеал.
По дереву узлов пройтись и перемножить все матрицы, сверху вниз и умножить на вершины. Только на Cpu можно сделать.
На gpu же наоборот с самого низа нужно к верху пройтись, отсюда, куча соседних вершин будут пересчитывать то что соседний поток так же считает.
Как такую задачу решают Unity Unreal Crysis .... Я не верю что они берут и все умножают снизу вверх. Наверное есть какие-то трюки.
А там типичная сцена, к примеру пробка машин в городе, где в каждой авто виден водитель, у которого видна рука на руле. Пол сцены будут объекты с 2 иерархией матриц, А еще есть такая тема как дивергенция кода, если один поток видет if для которого выполняется true, то и все другие в варпе будут выполнять эту функцию, отсюда не то что некоторые потоки будут куча работы выполнять, но и вообще все потоки, допустим из всяких статических объектов, так же будут рассматривается грубо говоря как вершина пальца руки персонажа в машине.