вторник, 30 августа 2016 г.
суббота, 6 августа 2016 г.
идея для быстрого и экономного акселлератора пересечений луча с обьектами сцены grid. обновлено - пересечение
данный алгоритм писался с учетом особенностей GLSL и программирования GPU-рендера - простота и быстродействие выбраных технологий
- по формуле из SunFlow расчитать количества ячеек в grid на основе ограничивающего бокса сцены и количества обьектов
- пройтись по сцене и вместо добавления обьектов увеличивать счетчик необходимых ячеек
- выделить память под массив
- расчитать коэфициент ближайшего большего десятка по количеству обьектов
- хранить одну запись в формате float.
элемент массива = индекс обьекта*коэфициент + номер ячейки - пройтись по сцене и сохранить в массив данные
- отсортировать сортировкой Шелла массив по номеру ячейки. она на 2-3 месте от quicksort и лучше там, что проста в воплощении и нерекурсивна
- доступ к элементам в ячейке - быстрый поиск в массиве по номеру ячейки
- выбираются все обьекты у которых mailbox!=rayID, складываются в массив сортированых ид обьектов. если такой ид уже есть(бинарный поиск мне поможет), то не вставлять. если нет - смотреть и сдвигать элементы массива
- полученный массив обьектов сортируется по дальности центров BBox относительно ray.org (сортировка шелла, sqrt не вызываю)
vec3 delta = vec3(bbx.bbmax-bbx.bbmin)*0.5-r.org;
float dist = dot(delta,delta); - отсортированный массив проходится и устанавливается обьектам mailbox=rayID
Подписаться на:
Сообщения (Atom)