Такой вопрос. Есть несколько тысяч инстанс-деревьев, допустим ёлок.
Понятное дело, что какая-то часть ёлок окажется позади камеры.
Что эффективнее - вызвать отрисовку всех ёлок на уровне разом (через инстансинг), предоставляя OpenGL самостоятельно их откуллить, а буффер с инстанс-данными сформировать один раз и в дальнейшем уже не менять, или же откуллить на CPU, пересобирая каждый кадр буффер с инстанс-данными только для тех ёлок, которые попали в кадр?
g-cont
Если cpu не особо нагружен и простаивает, то в любом случае эффективнее будет откуллить.
Ruslan
а может есть возможность загружать какой-то ремаппинг для gl_InstanceID ? Чтобы в списке были только номера тех инстансов, которые реально попали в кадр.
g-cont
> а может есть возможность загружать какой-то ремаппинг для gl_InstanceID ? Чтобы
> в списке были только номера тех инстансов, которые реально попали в кадр.
сорян, по вот этому вопросу ничего не могу сказать, но думаю, что если какая-то возможность есть, то такие данные появятся только на следующем кадре, это приведет к тому, что деревья будут визуально появляться\исчезать.
На CPU вполне можно куллить. Сфера-фруструм - это быстро.
Никогда не понимал стремления перенести все возможные вычисление на видеокарту, которой и без этого всегда есть чем заняться.
На CPU вполне можно куллить.
Можно ,но осторожно.
И с умом.
Есть несколько тысяч инстанс-деревьев, допустим ёлок.
Помогу ТС.
Умнож это число на 1000 000.
И ты увидешь, что ни проц и не GPU все это не отсортируют сразу.
Ищи другой путь сталкер :)
Если их действительно много, можно куллить на GPU, оттуда же писать буфер инстанс данных и indirect команды отрисовки
g-cont
> а может есть возможность загружать какой-то ремаппинг для gl_InstanceID ?
Можно же сделать такой ремаппинг самому.
g-cont
Чем меньше шлешь на ГПУ тем лечше
g-cont
> Понятное дело, что какая-то часть ёлок окажется позади камеры
А стоит ли овчинка выделки? Ведь для вершин, не попадающих во фрустум, отработают только вертексные шейдеры, до растеризации их примитивов дело вообще не дойдет, т.к. примитивы целиком не попадут в bounding box
g-cont
> а может есть возможность загружать какой-то ремаппинг для gl_InstanceID
Есть же DrawIndirect + firstInstance
Masked Software Occlusion Culling
https://www.intel.com/content/www/us/en/developer/articles/techni… -culling.html
Для случаев позади камеры, достаточно нарезать на куски. Которые немного позади камеры таки попали, замедления это не даст, вершинные шейдеры быстро пробегут
MikeNew
> На CPU вполне можно куллить. Сфера-фруструм - это быстро.
Да, я это и имел в виду, собственно, не более того.
Уточню задачу: есть инстанс-меш и матрицы трансформации. Матрицы сохраняю во float-текстуру.
Варианты отрисовки:
- Заполняю float-текстуру матрицами всех имеющихся инстансов, инстансы рисую за один вызов, предоставляя GPU самостоятельно откуллить то, что не попало во фрустум.
- Выполняю отсечение на CPU, во float-текстуру пишу только матрицы тех инстансов, которые видны. Соответственно текстуру обновляю каждый кадр.
Какой вариант будет выгоднее на ваш взгляд? Инстансов по современным меркам относительно немного, до 65 тысяч, в среднем 5-10 тысяч.