MrShoor
>> вроде OBB, они жирные
>OOB не такие уж и жирные. Хранят их обычно в духе:
я имел ввиду динамику - 1.техника очень детализированная, много дипов 2.ее очень немного, какие-то сотни
тут как раз выгодно точно просчитать кулинг, через OBB
MrShoor
чем твой код отличается от
Min = Min * Matrix4x4 Max = Max * Matrix4x4
не понял.
вот так не корректно будет
_Wizard_
на правильно, зависит от сцены.частицы например не выгодно куллить вообще ничем, только общим боксом =) а хайполи лучше четко отсеивать.
Mira
> чем твой код отличается от
> Min = Min * Matrix4x4
> Max = Max * Matrix4x4
> не понял.
Тем, что мой код не делает сразу сумму. Когда ты умножаешь:
vNew.x = v.x*a00 + v.y*a01 + v.z*a02;
ты сразу складываешь значения. Чтобы корректно повернуть AABB тебе придется умножать минимум 6 раз на матрицу. В моем случае умножать на матрицу нужно дважды, а чтобы получить 6 вершин - ты просто складываешь разные комбинации.
Есть ли какие-то методы оптимального разбития дерева для многопоточного варианта на CPU?
> Безусловно, если есть такая возможность, стоит использовать GPU кулинг.
сомнительное утверждение, с учетом что GPU всегда не хватает, а CPU в избытке
Gorunuch
>Есть ли какие-то методы оптимального разбития дерева для многопоточного варианта на CPU?
мы пробывали - тупо откулить линейный список из 10к объектов быстрее чем использовать всякие иерархические структуры
я бы подумал в сторону создания обычного линейного массива групп объектов... по 20-100 объектов, аппроксимируешь группу сферой / AABB и вперед
группы не сложно распределить поровну по потокам
_Wizard_
> мы пробывали - тупо откулить линейный список из 10к объектов быстрее чем использовать всякие иерархические структуры
про 10к слышал еще давно, а что за иерархические структуры тестировались?
Frankinshtein
>> Безусловно, если есть такая возможность, стоит использовать GPU кулинг.
>сомнительное утверждение, с учетом что GPU всегда не хватает, а CPU в избытке
я в выводах написал условия, при которых стоит использовать
не всегда в ГПУ упирается... сейчас очень много дипов в играх / много разной геометрии / пропсов + физика + аи + симуляция/апдейт + куча какой то логики + звук + стриминг + не у всех офигенный многопоточный движок
у нас не на всех пресетах, но упирается по большей части в ЦПУ!
на ГПУ гораздо проще cделать Occlusion culling / с учетом загороженности одних объектов другими + не надо данные по шине таскать + гпу самый быстрый
ты можешь сделать видимость на кверях (в новом Думе так сделано например), но это надо заморачиваться с консервативностью видимости...
Hierarchical-Z map based гораздо удобнее - и в этом случае ГПУ порвет ЦПУ просто на тряпки
Andrey
>про 10к слышал еще давно, а что за иерархические структуры тестировались?
да - медленнее
sse не любит ветвления) + условия тормозная вещь + скорее даже больше дело в кешах процессора (у тебя данные не локально лежат и ты прыгаешь от одних к другим все время, непредсказуемо)
_Wizard_
__m128i intersection_res_i = _mm_cvtps_epi32(intersection_res); _mm_store_si128( ( __m128i *)&culling_res_sse[i], intersection_res_i);
Есть какой-то смысл в _mm_cvtps_epi32 вместо _mm_castps_si128?
у меня с линейными данными да, SIMD лучше работает.
кстати почему там не работает префетчинг?) что с этой инструкцией что без - разница в пределах разброса, тоесть ее нет.
Охохо, я у себя реализовал Occlusion Culling на GPU, а про Frustum Culling сделать там же я совсем не подумал :)
Если создать буффер со всеми данными для рендеринга на ЦПУ и только присылать номера необходимых рендеров - вполне должно получиться.
Единственная проблема - необходимо минимизировать количество переключений Pipeline State. Если делать предварительное отсечение на ЦПУ, то этого будет проще избежать.
_Wizard_
> корее даже больше дело в кешах процессора (у тебя данные не локально лежат и ты
> прыгаешь от одних к другим все время, непредсказуемо)
Есть решение хранить узлы в массиве, без отдельного выделения по new, тогда данные будут локальны. Я кстати так и сделал.
Andrey
> Есть решение хранить узлы в массиве, без отдельного выделения по new, тогда
> данные будут локальны. Я кстати так и сделал.
Покажи как хранятся узлы массиве