Уровни детализации

Материал из BestWay wiki
Перейти к: навигация, поиск

Описание


Система детализации entity включает в себя следующее:

  • детализация полигональных видов (в том числе отключение отдельных видов)
  • отключние приема теней объектом
  • отключение отбрасывания теней объектом

Для каждой сущности указывается класс детализации (блок {lodclass "class_name"}). Если класс детализации не указан, то к сущности не применяются никакие правила детализации, даже если полигональные виды сущности имеют LOD'ы. В текущей реализации уровни детализации переключаются мгновенно, без гистерезиса.



Декларация LOD-класса


Описание классов уровней детализации находится в /set/level_of_detail.set. Количество классов не ограничено. Ниже приводится описание класса:

{"<имя класса>"
; нулевой LOD соответствует полигональным видам без приставки _lod и настройкам теней из параметров сущности
  {distance <distanceN>; LOD_N, расстояние от камеры (в 1/20 метра),
                       ; включается N-й уровень детализации полигональных видов (у которых он есть)
    [{NoGetShadow}]    ; отключить затенение сущности
    [{NoCastShadow}]   ; отключить отбрасывание тени сущностью
    [{off}]            ; не рисовать сущность вообще
  }
}

Блоки, указанные в одном из уровней детализации, распространяют свое действие на все последующие уровни. Настройки последнего уровня детализации растпространяются до бесконечности.



Создание LOD'ов в 3DSMAX


Для каждого мэша, для которого нужны уровни детализации, создаются дополнительные мэши с именами, дополненными суффиксом "_lod<N>". Например, если мэш с именем "body" должен иметь еще два варианта детализации, то они называются "body_lod1" и "body_lod2". LOD'ы линкуются параллельно с основным мэшем. Например если "body" имеет родителем "basis", то "body_lod1" и "body_lod2" тоже должны иметь родителем "basis". Если в свойствах основного мэша указан параметр LODLastOff, то отрисвока мэша отключается на уровне детализации следующем за последним вариантом, в противном случае последний вариант распространяется на все менее детальные уровни. Для приведенного примера с 'body" признак LODLastOff приведет к отключеню вида "body" на третьем уровне детализации, в то время как отсутствие такого признака будет означать использование "body_lod2" на всех уровнях детализации начиная со второго и ниже. Допускается использование LODLastOff без создания вариантов детализации мэша, в этом случае вид будет отключен на первом уровне детализации. Варианты детализации мэша могут иметь топологию, материалы и даже текстуры отличные от основного мэша. Однако использование других текстур не рекомендуется. Для этого желательно использовать текстурные MIP'ы. Рекомендуется так же для LOD'ов использовать более простые варианты материалов, например отключать бамп, отражение и т.п. Для скиновых мэшей полезно будет уменьшение количества влияющих костей.



Детализация полигональных видов


Детализация полигональных видов заключается в создании для всех или части мэшей сущности вариантов с приставкой "_lodN". Если для какого-то мэша LODы не созданы, считается что он выглядит одинаково на всех уровнях детализации. Если для мэша создано вариантов детализации менльше, чем уровней в классе детализации, то наименее детальный вариант распространяется на все последующие уровни детализации. Исключение составляет случай, когда для вида указан признак отключения на определенном уровне детализации. Структура описания вида с поддержкой детализации (в .mdl):

{LODView
  {view poly "name"}        ; мэш нулевого уровня детализации
  [{view poly "name_lod1"}] ; мэш первого уровня детализации
  ...
  [{view poly "name_lodN"}] ; мэш N-го уровня детализации
  [{off}]                   ; отключить вид на уровне N+1
}



Особенности работы LOD'ов


Q) По каким законам переключаются LODы и существует-ли возможность как-то повлиять на схему переключения из клиентской части? A) LOD переключается при отрисовке сущности строго по расстоянию от камеры, другой, клентской, поддержки нет. Вобщем-то можно сделать scene handler для выяснения уровня детализации конкретных сущностей. Пока необходимость такой возможности обсуждается.

Q) В документации по созданию LODов есть рекомендация использовать MIPы текстур основного LODа вместо создания отдельных текстур для менее детальных версий мэша. Значит-ли это, что при включении менее детальных LOD смещается и MIP-цепочка текстур для гарантирования использования текстур меньшей детализации? A) MIPы используются везде, где они есть, в том числе и на LODах. Если по причинам дизайна основная текстура значительно отличается от той, которая используется для менее детальных LODов, то использование отдельной текстуры является единственным выходом. Однако во многих случаях для всех LODов модели используется одна и та же текстура, только с обработаными деталями (размытие, контрастирование, исключение и т.п.). В этом случае варианты текстуры для LODов можно и нужно оформлять в виде MIPов основной текстуры. Таким образом уменьшается количество переключений текстур при отрисовке сцены и повышается коэффициент группировки объектов для оптимизации количества проходов. Смещение MIP-цепочки в данной версии не реализовано, поскольку это затрагивает схему группировки объектов для отрисовки и значительно уменьшит коэффициент группировки при обширном использовании разного смещения.