Occlusion culling — отброс загороженной геометрии . Теория

Отброс загороженной геометрии (occlusion culling) достаточно интересный вопрос, а его реализация не менее интересна. Однако содержит достаточное количество непонятных с первого взгляда моментов, но стоит все разложить как все становится понятно))

Терминология

Грубое отсечение на примере frustum culling (отсечение по пирамиде видимости), дает ощутимый прирост к производительности. Оно отбрасывает из рендера невидимую часть сцены, и оставляя лишь то что видно в данный момент. Однако, в сцене могут существовать объекты, которые закрыты другими объектами, а они требуют вычислительной мощности, отнимая тем самым время на рендер.

Представим сцену с открытым миром (outdoor), где весь мир может видеть игрок. Внезапно игрок зашел в здание, уперся в стену (загораживающая геометрия, загораживатель) и не видит ничего, что дальше нее. Но все то, что дальше этой стены (загороженная геометрия, загороженный) продолжает рисоваться, отнимая время. Конечно, если рендер осуществляется от ближнего к дальним, то видеокарте будет легче ориентироваться по глубине, отбрасывая дальние пиксели. Но обработка вершин все-таки будет занимать достаточно большое количество времени.

Наглядный пример необходимости occlusion culling, выделенный розовым цветом шар нуждается в отбросе
Наглядный пример необходимости occlusion culling, выделенный розовым цветом шар нуждается в отбросе

Occlusion culling – метод рендера компьютерной графики, при котором невидимая часть сцены, которая загорожена другой частью сцены, в текущий момент времени, исключается из рендера. Иными словами это отброс загороженных частей сцены.

В зависимости от реализации данный метод содержит некоторые аппроксимации, как правило, чем быстрее просчеты, тем больше аппроксимаций, но не всегда так.

Occlusion Query

С появлением видеокарт Radeon 7000 и GeForce 3 на GAPI (DirectX интерфейс IDirect3DQuery9, OpenGL с официальным расширением ARB_occlusion_query) стала доступна функция Occlusion Query поддерживаемая на аппаратном уровне.

Occlusion Query – запрос на перекрытие: подсчет количества пикселей, которые прошли тест глубины. Количество прошедших тест глубины пикселей это количество видимых пикселей объекта. Осуществляется только на стороне GPU.

Суть метода достаточно проста. После отрисовки сцены надо отрисовать lod модели (упрощенную геометрию для каждого объекта) с отправкой Occlusion Query.

Со временем появился Software Occlusion Culling, позволяющий самостоятельно контролировать все процессы просчетов и отброса.

Software Occlusion Culling

Software Occlusion Culling – метод отброса загороженной геометрии путем software рендера упрощенных моделей (к примеру bound box) на CPU. То есть все расчеты ведутся на стороне центрального процессора и не требуют вычислительной мощности GPU за исключение получения карты глубины нужного размера и с нужной предварительной фильтрацией.

В данном случае под рендером подразумевается проекция упрощенных моделей в пространство экрана для анализа каждого пикселя, но ни как не настоящий рендер с наложением текстур и прочим))

Абстрактно Software Occlusion Culling можно описать следующим образом:

  • получение карты глубины (depth map)
  • репроекция карты глубины с предыдущего кадра к текущему (reprojection depth-buffer), здесь же необходимо закрыть все возможные «дыры»
  • уменьшение размера карты глубины (downsampling), для ускорения просчетов видимости, с выборкой наиболее дальних пикселей, это очень важный момент чтобы не было багов
  • проход по каждому (необходимому) объекту сцены:
    • вычисление трансформации упрощенной модели (к примеру bound box), для статической геометрии расчет возможен заранее, для НПС расчет возможен на основании хитбоксов, а для анимированной растительности возможно внедрение некой погрешности (увеличения) ограничивающего объема
    • проекция каждого примитива (треугольник, квадрат и прочее) в пространство экрана (screen space)
    • расчет количества пикселей прошедших тест глубины (т есть видимых)
    • решение о рендере, рисовать модель или нет?

При использовании deferred shading в большинстве случаев, буфер глубины генерируется при построении G-buffer. Если же по каким-то причинам рендер не предусматривает генерацию карты глубины, то ее можно взять с GPU при помощи GAPI.

Репроекция карты глубины от прошлого к текущему кадру необходима для того чтобы отбросить всю загороженную геометрию именно в текущем кадре. Это надо потому что карта глубины доступна только после полной отрисовке сцены, а значит в для occlussion culling буфер глубины всегда будет иметь старую информацию. Но для того чтобы сделать эту информацию актуальной, надо сделать репроекцию.

Для репроекции достаточно иметь матрицы вида и проекции текущего и прошлого кадров. Однако, здесь надо помнить, что не все участки карты глубины успешно пройдут репроекцию. Есть шанс, что в карте глубины окажутся пустые места, которые необходимо помечать как самые дальние, чтобы не отбросилось ничего лишнего.

Уменьшение размеров карты глубины (downsampling) позволяет анализировать меньшее количество пикселей. Однако, коэффициент уменьшения не должен быть чрезмерным, иначе будут большие погрешности и многие загороженные объекты не отбросятся. При уменьшении карты глубины необходимо анализировать соседние пиксели с текущим, и выбирать наиболее дальний, чтобы не произошло лишних отбросов. А при слишком большом уменьшении более дальний объект может перекрыть более ближний, а за этим более ближним мог быть другой закрытый объект, в итоге этот закрытый объект будет рисоваться.

Расчеты необходимо провести лишь для того пространства, которое видимо на данный момент. Это связано с тем что буфер глубины доступен только в пространстве экрана, расчеты определения загороженности будут происходить в пространстве экрана. То есть весь процесс будет представлять некое подобие рендера, а точнее простую проекцию с анализом.

Упрощенная модель для рендера на CPU

Выбор упрощенной модели для рендера играет немаловажную роль. К примеру можно пойти наиболее легким путем и рисовать упрощенную модель билбордом (billboard – прямоугольник, который всегда повернут на камеру), так как его проще всего сгенерировать. Однако он даст намного больше погрешности, и таким образом загороженная геометрия может все-таки пройти тест глубины и будет принято решение о ее отрисовке.

На примере ранних версий движка SkyXEngine можно смело утверждать, что выбор билборда не самое лучше решение, однако с задачей отброса загороженной геометрии справляется.

Ограничивающий объем (bound box) может дать лучшие результаты, но не для все видов моделей. Возможно модели НПС анализировать лучше на основе хитбоксов (bound box для каждой кости).

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

*

code