В настоящее время я работаю над обновлением и реструктуризацией движка рендеринга OpenGL. Движок используется для визуализации больших сцен архитектурных данных (зданий с интерьером), и количество объектов может стать довольно большим. Как и в случае с любым зданием, внутри стен много закрытых объектов, и вы, естественно, видите только те объекты, которые находятся в той же комнате, что и вы, или снаружи, если вы находитесь снаружи. В результате остается большое количество объектов, которые должны быть закрыты путем отсечения окклюзии и отсечения усеченного конуса.
В то же время существует много повторяющейся геометрии, которую можно объединять в пакеты рендеринга, а также множество объектов, которые можно рендерить с помощью инстансов рендеринга.
На мой взгляд, может быть сложно оптимальным образом комбинировать пакетирование рендеринга и отбраковку. Если вы помещаете слишком много объектов в один и тот же VBO, трудно отсеять объекты на ЦП, чтобы пропустить рендеринг этого пакета. В то же время, если вы пропустите отбраковку на центральном процессоре, много объектов будет обрабатываться графическим процессором, пока они не видны. Если вы полностью пропустите пакетную обработку, чтобы легче было отбраковывать процессор, будет нежелательно большое количество вызовов рендеринга.
Я провел некоторое исследование существующих методов и теорий относительно того, как эти проблемы решаются в современной графике, но мне не удалось найти какое-либо конкретное решение. Идея, к которой пришли мы с коллегой, заключалась в том, чтобы ограничивать партии объектами, находящимися относительно близко друг к другу, например, всеми стульями в комнате или в радиусе n метров. Это можно упростить и оптимизировать с помощью окт-деревьев.
Есть ли у кого-нибудь указания на методы, используемые для управления сценами, отбраковки, пакетирования и т. Д. В современных графических движках?