Culling: front, back, none

Culling — это техника, используемая в компьютерной графике для оптимизации рендеринга. В PlayCanvas этот процесс применяется для улучшения производительности при рендеринге объектов, которые не видны камерой. В зависимости от того, какая сторона объекта должна быть видна в сцене, можно настроить различные стратегии отсечения (culling). PlayCanvas предлагает три режима отсечения: front, back и none. Рассмотрим каждый из них подробнее.

Front culling

Front culling исключает из рендеринга объекты, которые направлены к камере своей тыльной стороной. Это означает, что при рендеринге не будет учитываться поверхность объекта, которая находится “внутри”, если смотреть на него с определённого угла. Когда включён front culling, рендерится только та часть объекта, которая обращена к камере.

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

// Включение front culling
entity.model.model.meshInstances.forEach(function (meshInstance) {
    meshInstance.cullMode = pc.CULL_FRONT;
});

В этом примере создаётся цикл, который проходит по всем экземплярам мешей в модели объекта и задаёт режим отсечения на CULL_FRONT. Это гарантирует, что только те части объекта, которые направлены к камере, будут отображаться.

Back culling

Back culling является наиболее распространённым и стандартным режимом отсечения. В этом режиме исключаются из рендеринга объекты, которые направлены к камере своей задней стороной. В контексте 3D-графики это означает, что объект будет отображаться только в том случае, если его передняя сторона (та, которая обращена к наблюдателю) видна.

Этот подход эффективен для большинства 3D-объектов, поскольку часто требуется рендерить только внешнюю сторону объекта, а внутренняя сторона (или скрытые части) остаются невидимыми. Например, в моделях с текстурированными поверхностями или геометрией, направленной на камеру, отсечение задних граней позволяет значительно улучшить производительность.

// Включение back culling
entity.model.model.meshInstances.forEach(function (meshInstance) {
    meshInstance.cullMode = pc.CULL_BACK;
});

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

No culling

No culling полностью отключает отсечение, что означает, что рендерятся все стороны объекта, независимо от его ориентации относительно камеры. В этом режиме объекты отображаются в любой видимой проекции без исключений.

Этот подход может быть полезен в специфичных случаях, когда требуется, чтобы объект был виден со всех сторон. Например, это может быть актуально для объектов, которые должны быть видны как снаружи, так и изнутри (например, сферы, полупрозрачные объекты, некоторые элементы UI или декоративные элементы, которые должны быть видны независимо от угла обзора).

// Включение no culling
entity.model.model.meshInstances.forEach(function (meshInstance) {
    meshInstance.cullMode = pc.CULL_NONE;
});

При использовании CULL_NONE на объекте, камера будет рендерить все его поверхности, что может повлиять на производительность, особенно в сценах с большим количеством таких объектов. Важно тщательно подойти к выбору этого режима, так как лишние вычисления могут снизить общую скорость рендеринга.

Рекомендации по выбору режима

  • Front culling: применяйте, если важно отображать только видимые снаружи поверхности, например, в случаях, когда объекты имеют сложную геометрию с внутренними и внешними частями.
  • Back culling: наиболее универсальный и рекомендуемый режим. Отлично подходит для большинства объектов 3D-сцен, таких как здания, персонажи и другие внешние структуры.
  • No culling: полезен, когда нужно, чтобы объект был виден со всех сторон или если объект является полупрозрачным или прозрачным.

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