Как использовать все возможности mental ray в работе с 3ds max. Часть 4. Геометрические объекты


В mental ray принято различать пять типов геометрических объектов. К ним относятся: полигонные объекты, криволинейные поверхности (free-form surfaces), пространственные кривые, subdivision-поверхности, или поверхности с настраиваемой детализацией, и hair-геометрия, или многосоставные поверхности вроде волос и меха (описание hair-геометрии в mr рассматривалось в обзоре: http://www.ixbt.com/soft/mr_hairf.shtml).

Описание полигонных объектов выполняется при помощи вершин, нормалей и полигонов - треугольников, четырехугольников или n-угольников.

Криволинейные поверхности и пространственные кривые описываются процедурно, при помощи математических формул - полиномов вплоть до 21 степени. В mental ray поддерживается Bezier-, Taylor-, B-spline-, Cardinal - поверхности и кривые, как рациональные (NURB), так и нерациональные. Перед рендерингом криволинейные поверхности должны быть аппроксимированы при помощи полигонного представления. Эту функцию выполняют имеющиеся в mental ray различные алгоритмы аппроксимации: (regular) parametric, spatial, curvature-dependent, view-dependent, и их комбинации. Начиная с mental ray версии 3.1, введена еще одна техника - fine approximation, которая в настоящее время наиболее часто используется по причине высокого качества результатов.

Поверхности настраиваемой детализации (subdivision surfaces) стандартной версией mr не поддерживаются. Эти типы поверхностей могут быть отрендерены mental ray после аппроксимации, выполненной пакетом трехмерного моделирования. Либо после установки расширения mental matter, которое содержит необходимые шейдеры.

Описание геометрического объекта в mi-файле состоит из определения объекта, создания его instance и назначения ему материала, который должен быть определен предварительно - до момента первого использования в объекте.

Определение объекта представляет собой описание по определенным правилам геометрии его поверхности - указания трехмерных координат элементов, список элементов, способы сопоставления координат и элементов, а также - операторы и флаги свойств объекта.

Поскольку для определения объекта требуются координаты, в mr необходимо явно указывать координатную систему. В настоящее время используется три системы: система координат, привязанная к камере (camera space), система координат объекта (object space) и мировая система координат (world space). Основными являются object и world, тогда как camera space используется только в особых случаях и, в основном, для совместимости со старыми версиями mr.

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

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

В самом общем виде определение геометрического объекта в mi-файле сцены выполняется при помощи конструкции:

object " object_name "
[ visible [ on|off] ]
[ shadow [ on|off] ]
[ shadow [ mode] ]3.4
[ shadowmap [ on|off] ]3.3
[ trace [ on|off] ]
[ reflection [ mode] ]3.4
[ refraction [ mode] ]3.4
[ transparency [ mode] ]3.4
[ select [ on|off] ]
[ tagged [ on|off] ]
[ caustic [ on|off] ]
[ globillum [ on|off] ]
[ finalgather [ on|off] ]
[ caustic [ mode] ]
[ globillum [ mode] ]
[ finalgather [ mode] ]3.4
[ finalgather file file (list) ]3.4
[ face [ front|back|both] ]3.4
[ box [min_x min_y min_z max_x max_y max_z] ]
[ motion box [min_x min_y min_z max_x max_y max_z] ]
[ max displace value ]
[ samples min max ]
[ data null|" data_name " ]
[ tag label_number ]
[ file " file_name " ]
[ basis list ]
group
vector list
vertex list
geometry list
approximation list
end group
end object

Конструкция определения объекта начинается с указания имени объекта и состоит из двух частей: флагов и операторов свойств объекта (все из которых являются необязательными и могут не указываться), и описания геометрии объекта в group … end group.

Имя объекта " object_name ", указываемое при его определении, служит для целей идентификации объекта. Имя объекта используется в mental ray только при отчете о ходе выполнения рендеринга и в сообщениях об ошибках. Имя объекта рекомендуется указывать в двойных кавычках.

Флаги и операторы свойств геометрического объекта

Флаг
visible [ on|off]

делает объект видимым для первичных лучей (primary ray) из камеры и для transparency ray, которые используются исключительно scanline - алгоритмом mental ray для расчета простой прозрачности объекта, без учета коэффициентов преломления и без трассировки лучей. Выключение флага видимости, visible off, позволяет исключить объект из изображения. Значение по умолчанию - on. Если оператор trace явно не указан в свойствах объекта, тогда значение этого флага по умолчанию off (это справедливо для всех ниже перечисленных флагов).

Флаг
shadow [ on|off]

позволяет или запрещает объекту отбрасывать тень. Значение флага shadow off, определенное в блоке Options mi-файла сцены, отключает расчет теней у всех объектов и имеет преимущество над значением флага shadow в свойствах объектов.

Флаг
shadow [ mode]

появился в mental ray 3.4 и позволяет дополнительно указать режим построения теней:

  • mode 1 - объект только отбрасывает тень, но не затеняется другими объектами
  • mode 2 - объект только получает тень от других объектов, но сам тень не отбрасывает
  • mode 3 - объект отбрасывает тень и затеняется другими объектами
  • если значение флага mode не указано явно, оно устанавливается в значение mode 2

Флаг
shadowmap [ on|off]

устанавливает, что отбрасываемая объектом тень рассчитывается при помощи алгоритма построения растровых карт теней. Требуется также, чтобы флаг shadow был установлен в значение on. Флаг появился в mr 3.3.

Флаг
trace [ on|off]

делает объект видимым или невидимым для вторичных лучей - для преломленных прозрачными объектами лучей или для отраженных лучей, то есть для ray tracing. Аналогичный флаг в Options mi-файла сцены имеет преимущество, если он выключен (trace off), значения trace-флагов объектов игнорируются.

Начиная с версии mental ray 3.4, появились три дополнительных флага, позволяющие по отдельности управлять видимостью объекта для отражений, преломлений и лучей простой прозрачности, рассчитываемых scanline.

Флаг
reflection [ mode]

значения mode:

  • 1 - включает режим "reflection casting", при котором объект становится видимым в отражениях других объектов
  • 2 - включает режим "reflection receiving", при котором объект отражает окружение, если материал его поверхности обладает свойствами отражения
  • 3 - объект отражает окружение и сам может отражаться в других объектах
  • если значение флага не указано явно, по умолчанию используется mode 2

Флаг
refraction [ mode]

значения mode:

  • 1 - устанавливает режим преломления в значение "refraction casting", при котором объект будет виден через другие прозрачные объекты в сцене
  • 2 - устанавливает режим преломления в значение "refraction receiving", при котором сквозь него будут видны другие объекты сцены
  • 3 - в этом режиме через прозрачный объект будут видны другие прозрачные объекты, так же, как и он будет виден сквозь них
  • по умолчанию значение флага установлено в mode 2

Дополнительные значения mode для reflection/refraction будут рассмотрены чуть позже.

Флаг
transparency [ mode]

значения mode и их смысл аналогичны значениям флага refraction. По умолчанию используется mode 3.

Флаг
select [ on|off]

может использоваться приложениями для интерактивного выбора объекта при помощи луча, посылаемого в сцену, например, по нажатию кнопки мыши, из текущего положения на экране монитора. После трассировки вглубь сцены, луч возвращает список объектов, с которыми он пересекся. Только объекты с установленным флагом "select on" будут присутствовать в списке.

Флаг
tagged [ on|off]

позволяет изменить способ указания материалов при определении геометрического объекта. Обычно, каждый треугольник, полигон и поверхность должны содержать указание материала, который им назначен, либо при определении объекта, либо в определении instance, использующего определение (имя) данного объекта. Установка флага tagged on означает, что определяемый объект вообще не использует материал, а назначение материала будет выполнено только при создании instance определяемого объекта по указанным для полигонов и поверхностей специальным целочисленным меткам, заменяющим указание материалов. В 3ds max такие метки полигонов имеют простой смысл - это material ID полигона.

Флаг
caustic [ on|off]

позволяет объекту участвовать в оптимизированном процессе генерации каустики. Оптимизация достигается использованием дополнительного флага, указывающего режим генерации каустики:

Флаг
caustic [ mode]

значения mode:

  • 1 - объект только генерирует каустик-фотоны
  • 2 - объект только получает (сохраняет в фотонной карте) каустик-фотоны
  • 3 - объект может генерировать и сохранять каустик-фотоны
  • 0 - объект не участвует в генерации каустик-эффектов

Значение флага "caustic off" означает невидимость объекта для каустик-фотонов, "caustic on" - аналогичен режиму 3. Если флаг caustic явно указан в свойствах объекта, но без указания mode, по умолчанию полагается "on", (mode=3), если флаг caustic явно не указан в свойствах объекта, по умолчанию полагается caustic off.

Блок Options также имеет оператор caustic, который имеет преимущество: если его значение "off", каустик-свойства объектов игнорируются.

Из теории фотонных карт известно, что каустик-эффекты создаются отражающими или преломляющими прозрачными объектами, фокусирующими рассеиваемый ими отраженный/преломленный свет на преимущественно диффузных поверхностях. Например, при прохождении света через тонкую собирающую линзу свет фокусируется и может образовать яркое световое пятно на диффузной поверхности, находящейся за линзой. В этом примере можно линзе и поверхности назначить caustic on, то есть, оба объекта будут и генерировать и сохранять каустик-фотоны. Однако более оптимально и правильно назначить линзе caustic 1, поскольку она только генерирует каустик-фотоны, а поверхности - caustic 2, поскольку она только регистрирует и сохраняет в карте фотоны, приходящие от линзы. В блоке Options должно быть установлено "caustic on".

Флаг
globillum [ mode]

позволяет объекту участвовать в оптимизированном расчете глобального освещения (расчете вторичных диффузных переотражений). Как и в предыдущем случае с каустикой, оптимизация расчетов глобального освещения достигается за счет индивидуального определения для объектов значения mode:

  • 1 - объект только генерирует фотоны
  • 2 - только регистрирует и сохраняет фотоны в карте поверхности
  • 3 - сохраняет прилетевшие фотоны в карте и генерирует испускание фотонов
  • off - означает то же, что и mode 0
  • on (значение принято по умолчанию) - то же, что и mode 3

Оператор globillum в блоке Options mi-сцены имеет преимущество, если его значение off, глобальное освещение в сцене рассчитываться не будет вне зависимости от значений флагов объектов.

В mental ray 3.4 появились два новых флага, позволяющие оптимизировать final gathering посредством индивидуального включения/исключения объектов из расчетов.

Флаг
finalgather [ mode]

значение mode:

  • 1 - объект видим для fg-лучей других объектов, то есть создает вторичные переотражения в сцене
  • 2 - позволяет объекту получать вторичные переотражения от окружения
  • 3 - объект сам переотражает и получает отражения от окружения
  • 0 - не участвует в расчете fg вообще
  • off - то же, что и mode 0
  • on - то же, что и mode 3
  • 9 - объект отражает, но не получает отражения от других объектов
  • 6 - объект получает отражения от других объектов, но сам не отражает

Если значение mode не указано явно, по умолчанию принимается значение 0. По-объектное указание значения этого флага позволяет, например, исключить из расчета диффузных переотражений чисто зеркальные или прозрачные объекты. Если для всех объектов сцены, за исключением данного, установить finalgather 9, а для самого объекта finalgather 3, то будут рассчитаны только fg-точки данного объекта.

Флаг
finalgather file file (list) ]

позволяет указать имя файла (или список файлов) для сохранения или чтения карты fg-точек объекта. Этот флаг взаимодействует с оператором finalgather rebuild on|off| freeze, указываемым в блоке Options файла mi-сцены:

  • если указан finalgather rebuild on, fg-точки для объекта рассчитываются и сохраняются в файл
  • если указан finalgather rebuild off, точки преимущественно считываются из файла и досчитываются только при необходимости (например - на краях объекта)
  • если указан finalgather rebuild freeze, точки только считываются из файла

Другой оператор блока Options, finalgather file [ " name ", " name ", ... ], позволяет объединить несколько файлов с объектными fg-картами в один общий для всей сцены файл.

Таким образом, использование объектных флагов finalgather [ mode] и finalgather file file (list) ] в сочетании с операторами finalgather rebuild и finalgather file [ " name ", " name ", ... ] позволяет, при необходимости, реализовать схему по-объектного расчета fg.

Оператор
face [ front|back|both]

появился в mr 3.4 и предназначен для по-объектного управления отбором полигонов (face culling) для рендеринга: f или front - рендериться будут только те полигоны, нормали которых направлены к камере b или back - только полигоны, обращенные "тылом" к камере a или all - все полигоны

Этот оператор имеет преимущество перед аналогичным оператором в блоке Options. По умолчанию принимается значение both.

Оператор
box [min_x min_y min_z max_x max_y max_z]

позволяет определить прямоугольный трехмерный контейнер, полностью охватывающий объект и без учета displacement или motion blur. Такой куб используется вместо точного описания объекта, например, в случае рендеринга по требованию. Обычно, этот оператор используется совместно с оператором file " file_name ", указывающим имя файла с точным описанием геометрии объекта.

Оператор
motion box [min_x min_y min_z max_x max_y max_z]

определяет контейнер объекта с учетом минимальных и максимальных компонент векторов смещения, если таковые имеются

Оператор
max displace value

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

Оператор
file " file_name "

используется для указания файла, хранящего точное описание геометрии объекта при попадании луча в пределы границ ограничивающего контейнера. Объект должен быть односоставным. При использовании этого оператора обязательно должны быть определены box, motion box и max displace.

Оператор
samples min max

позволяет по-объектно определять antialiasing. Объектный оператор samples взаимодействует с оператором samples блока Options - значения min и max объекта должны лежать внутри интервала [ min, max], определенного в Options. Если пиксел изображения содержит несколько объектов, например, в результате расчета отражений или прозрачности, - используется максимальное значение min и max объектных определений. Если пиксел вообще не содержит объектов, aa определяется исходя из значений defmin и defmax, задаваемых в Options сцены.

tag label

указывает произвольное 32-битное целое число, идентифицирующее объект. Tag (label) используется mental ray для определения точки входа в базе данных сцены и предназначен исключительно для целей программирования шейдеров.

Оператор
data null|" data_name "

позволяет связать с объектом пользовательские данные с именем "data_name". Данные должны быть к этому моменту уже определены в сцене. Параметр null отменяет ссылку на определенные ранее данные.

Список basis list

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

Флаги visible, shadow, trace, reflection, refraction, transparency, caustic, globillum, finalgather и face могут быть переопределены при создании instance объекта.

Блок

group
vector list
vertex list
geometry list
approximation list
end group

содержит описание геометрии - список всех ее векторов (vector list), вершин, нормалей, текстур контрольных точек (vertex list) и описание элементов геометрии - полигонов, треугольников, патчей (geometry list).

В mental ray используется трехэтапное определение геометрии: сначала список всех векторов, затем список вершин, и в конце - список элементов поверхности, таких как треугольники или полигоны. Поэтому все описание блока group … end group разбито на три больших части.

Первая часть, vector list, содержит список векторов - последовательные тройки координат, разделенные пробелами. Эти вектора (тройки координат в объектном пространстве) описывают положение вершин геометрии, нормалей вершин, текстурные координаты, базисные векторы поверхности, вектора смещения и вектора, задаваемые пользователем. Все вектора указываются анонимно, то есть тройками чисел без указания их значения. Смысл вектора определяется сопоставлением его положения (индекса) в списке векторов с соответствующим положением (индексом) элемента описания в нижеследующем списке вершин.

Все вектора в пределах одного блока group … end group индексируются последовательно в порядке перечисления, начиная со значения индекса, равного нулю. То есть, самый первый вектор списка имеет индекс 0. Кроме того, все вектора подразумеваются трехмерными. Если описываются двумерные вектора, такие как текстурные координаты, базисные векторы или специальные точки на поверхности, просто полагается, что их третья координата равна нулю.

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

Используемые буквенные символы для указания типа вершины:

  • v - точка в трехмерном пространстве
  • n - нормаль в точке поверхности
  • m - вектор смещения. Начиная с mental ray 3.1 допустимо до 15 векторов на одну вершину геометрии для описания нелинейного пути смещения. Если для одной вершины указаны несколько векторов смещения, временной интервал смещения (shutter) разбивается на такое же число одинаковых временных промежутков, а каждый вектор смещения указывает положение вершины в соответствующий момент времени. Важно то, что множественные вектора описывают величину смещения в каждый момент времени относительно первоначального положения вершины, а не относительно ее положения после очередного смещения. Другими словами, вектора смещения не складываются.
  • t - текстурная вершина, возможно, с парой X/Y базисных векторов для расчета bump map. Возможно указание до 64 текстурных вершин типа t для вершин типа v, то есть точка поверхности может иметь до 64 текстурных координат. Текстурные координаты и базисные вектора игнорируются в случае описания геометрии поверхностей произвольной кривизны. Для этого типа геометрии текстурные координаты и базисные вектора определяются из текстурной поверхности ("texture surface")
  • d - первая и/или вторая производная поверхности. Первая производная описывает UV-параметрический градиент поверхности; вторая - ее кривизну. В mental ray производные поверхности могут быть вычислены аналитически для поверхностей произвольной кривизны (free-form surfaces), но не для полигонных поверхностей. Поэтому, такие производные должны быть представлены в списке явно. Если d имеет два индекса, то она описывает первую производную поверхности в точке P: dP/du и dP/dv. Если представлено три индекса, d описывает вторую производную: d^2P/du^2, d^2P/dv^2, d^2P/(dudv). Если индексов пять, то первые два относятся к первой производной, остальные три - ко второй производной. Производные по поверхности не используются mental ray и вводятся только для целей программирования шейдеров
  • u - пользовательский вектор. Никаких ограничений не вводится для этого типа векторов, mental ray не работает с ними. Пользовательские вектора передаются вместе с соответствующими вершинами для обработки шейдерами. Предназначены для целей программирования шейдеров

Третья часть, geometry list, описывает элементы геометрии - треугольники, полигоны, патчи и так далее. Описание элементов геометрии использует индексы вершин (порядковый номер вершины в списке) второй части, точно так же, как вершины используют индексы векторов.

Описание каждого элемента для полигонной геометрии выполняется при помощи конструкции:

[ тип вершины ] [" материал " ] список образующих вершин с индексами [ список вершин, образующих дыры в полигонах ]

Типы вершин могут быть c - convex, выпуклые полигоны, или p - concave, произвольные полигоны, как выпуклые, так и вогнутые. Полигон считается "выпуклым", если любая прямая линия, пересекающая полигон, имеет с ним не более двух точек пересечения. Указание типа вершин используется для целей повышения скорости расчетов и может быть опущено.

Если в свойствах объекта был определен флаг tagged, тогда вместо указания материала для полигона обязательно указывается целочисленная метка: [ тип вершины ] label список образующих вершин

Пример.
Рассмотрим простейший геометрический объект - прямоугольный полигон, составленный из двух треугольников. Такой объект имеет шесть вершин и состоит из двух элементов - треугольников. Его определение в mental ray может выглядеть следующим образом:

object poli_4
visible
group
0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0
v 0
v 1
v 2
v 3
v 4
v 5
p "material" 0 1 2
p "material" 3 4 5
end group
end object

Здесь "poli_4" - имя, идентифицирующее объект, первая часть в блоке group .. end group

0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0

описывает все вектора геометрии, в данном случае - координаты вершин треугольников, что следует из второй части описания, списка вершин:

v 0
v 1
v 2
v 3
v 4

Тип вершин - v, то есть вершины геометрии, индексы 0 -5 позволяют сопоставить вершину с индексом и координаты из первой части: v 0 имеет координаты, указанные первой тройкой чисел списка векторов, то есть (0.0 0.0 0.0), v 1 - (1.0 0.0 0.0) и так далее.

Третья часть описывает треугольники, составляющие полигон: p "material" 0 1 2 означает "concave-полигон", которому назначен материал "material", образован вершинами из списка вершин v 0 (соответствует указанному индексу 0, то есть первая вершина в списке вершин), v 1 (индекс 1) и v 2 (индекс 2). Как видим, все просто.

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

object poli_4
visible
group
0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 1.0 0.0
v 0
v 1
v 2
v 1
v 3
v 2
p "material" 0 1 2
p "material" 3 4 5
end group
end object

Вместо шести векторов в списке теперь сейчас только четыре. Однако теперь появились повторяющиеся вершины в списке вершин. Их тоже можно указывать только один раз. Тогда определение объекта примет вид:

object poli_4
visible
group
0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 1.0 0.0
v 0
v 1
v 2
v 3
p "material" 0 1 2
p "material" 1 3 2
end group
end object

Из определения могут быть исключены только повторяющиеся вектора одного и того же типа вершин. Также, блок group .. end group может описывать только один тип геометрии либо только полигонную геометрию, либо только поверхности произвольной кривизны, либо только пространственные кривые. Смешивание описаний различных типов в пределах одного блока не допускается. Кроме того, хотя определение геометрического объекта и может содержать несколько блоков group … end group, делать это не рекомендуется. Определение должно быть односоставным - использовать только один блок.

Оператор
approximate

указывается в конце блока group … end group и определяет метод тесселяции геометрии. В случае поверхностей произвольной кривизны речь идет об аппроксимации треугольниками процедурных поверхностей, определенных аналитически. Для этих поверхностей оператор approximate присутствует всегда. Для полигонных поверхностей оператор используется только в том случае, если материал имеет displacement шейдер.

Мы достаточно подробно рассмотрели описание только полигонной геометрии. Описание геометрии остальных типов довольно сложно и здесь опущено. Важно то, что определение этих типов геометрии выполняется при помощи той же конструкции, содержащей блок group … end group. Хотя содержание этого блока будет иным, конструкция определения геометрии объекта в остальном идентична - содержит те же флаги и операторы и легко идентифицируется в mi-файле. А редактирование геометрии лучше оставить пакету моделирования.

Конструкция instance для объекта

После того как объект определен, для того, чтобы он появился в сцене и в изображении, для него должен быть создан так называемый инстанс-представитель (instance). Эта задача выполняется при помощи следующей конструкции языка описания сцен mental ray:

instance " name_instance "
" object_name" | geometry function
[ hide on|off ]
[ visible on|off ]
[ shadow on|off ]
[ shadow mode ]
[ shadowmap on|off ]
[ trace on|off ]
[ reflection mode ]
[ refraction mode ]
[ transparency mode ]
[ caustic [ mode ]]
[ globillum [ mode ]]
[ finalgather [ mode ]]
[ transform [ matrix ]]
[ motion transform [ matrix ]]
[ face [ front|back|both ]]
[ motion off ]
[ override ]
[ material " material_name " ]
[ material [ " material_name " [ , " material_name " ... ] ] ]
[ approximate [ approximation [ , approximation ... ] ] ]
[ tag label ]
[ data [ " data_name " ]]
end instance

Здесь " name_instance " - символьный идентификатор (имя) инстанс-представителя объекта, " object_name" - имя объекта, чей представитель определяется, geometry function - шейдер, запрограммированный для создания какого-либо геометрического объекта.

Помимо определения instance объекта, можно создать инстанс инстанса с помощью конструкции instgroup " name " ... end instgroup. Основное назначение instgroup - быть контейнером для инстансов элементов сцены. Instgroup может быть вложенной произвольное число раз, то есть в сцене могут присутствовать множественные определения инстансов на основе инстансов, образуя древовидную структуру элементов сцены (DAG). Самая верхняя группа root instgroup содержит все инстансы и группы инстансов и передается команде render в качестве аргумента.

Смысл и назначение флагов и операторов visible on|off, shadow on|off, shadow mode, shadowmap on|off, trace on|off, reflection mode, refraction mode, transparency mode, caustic mode, globillum mode, finalgather mode, approximate, tag label, data идентичны аналогичным в конструкции определения объекта.

Транслятор 3ds max всегда устанавливает значение этих флагов и операторов только в instance объекта, оставляя их значение в определении объекта по умолчанию.

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

Для определения значения mode флагов caustic и globillum используется 6-битная карта:

  • [1-й бит, десятичное значение = 1] - если установлен, разрешается генерирование объектом каустик/gi фотонов (caustic/gi casting)
  • [2-й бит, дес. зн. = 2] - если установлен, объект получает и сохраняет в карте gi или каустик-фотоны (caustic/gi receiving)
  • [3-й бит, дес. зн. = 4] - если установлен, запрещает генерирование каустик/gi фотонов объектом (disable caustic/gi casting)
  • [4-й бит, дес. зн. = 8] - если установлен, запрещает сохранение каустик/gi фотонов в карте объекта (disable caustic/gi receiving)
  • [5-й бит, дес. зн. = 16] - если установлен, разрешает взаимодействие фотонов с объектом
  • [6-йбит, дес. зн. = 32] - если установлен, запрещает взаимодействие фотонов с объектом, объект становится абсолютно прозрачен для фотонов

Биты карты могут смешиваться (хотя и не все), давая новые режимы взаимодействия объекта с фотонами. В конструкции определения объекта или его инстанса значение mode указывается в десятичном виде.

Например, для того, чтобы объект и получал и генерировал каустик- или gi- фотоны, нужно установить 1-й и 2-й бит карты, что соответствует десятичному значению 3. А для того, чтобы объект вообще не участвовал в расчетах каустики и gi (но участвовал в переотражениях фотонов), нужно установить 3-й и 4-й бит, что соответствует десятичному значению 12.

Если нужно, чтобы объект был "чистым" генератором каустики или gi, нужно установить биты 1-й и 4-й, то есть десятичное значение 9. Если нужно, чтобы объект только получал каустик или gi эффекты, но сам их не генерировал, нужно установить 2-й и 3-й биты, то есть десятичное значение 6.

По вполне очевидным причинам нельзя смешивать первый и третий биты, 2-й и 4-й, а также - 5-й и 6-й. Другими словами, десятичные значения 5, 10 и 48 запрещены.

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

Для значений mode флагов reflection, refraction, transparency и finalgather используется 4-х битная карта:

  • [1-й бит, дес. зн. = 1] - если установлен, разрешает только отбрасывать соответствующий эффект (enable casting)
  • [2-й бит, дес. зн. = 2] - если установлен, разрешает только получать соответствующий эффект (enable receiving)
  • [3-й бит, дес. зн. = 4] - если установлен, запрещает только отбрасывать соответствующий эффект (disable casting)
  • [4-й бит, дес. зн. = 8] - если установлен, запрещает только получать соответствующий эффект (disable receiving)

Правила смешивания битов для получения дополнительных режимов расчетов эффектов те же.

Флаг
hide on|off

позволяет исключить инстанс и все ссылки на него из сцены. Используется в отладочных целях.

Матрица трансформации
transform [ matrix ]

определяет преобразование координат инстанса объекта из координатного пространства сцены (world space, если инстанс включен в группу root instance сцены) в локальное объектное пространство. Практически, матрица трансформации определяет масштабирование, ориентацию и положение инстанс-представителя объекта в сцене.

Матрица содержит 16 чисел:

transform 1 0 0 0
0 1 0 0
0 0 1 0
x y z 1

числа x, y, z определяют положение объекта в сцене (в mr ось Z направлена вниз, а не вверх как в 3ds max), остальные числа описывают вращение и масштабирование.

Матрица смещения
motion transform [ matrix ]

определяет матрицу из 16 чисел преобразования координат векторов смещения из координатного пространства сцены в локальное пространство объекта.

Оператор
motion off

выключает все унаследованные вектора смещения, определенные, например, для камеры.

Ключ
override

используется как префикс с операторами material и approximate, устанавливает превосходство (переписывает) материалы и свойства аппроксимации в инстансах (инстанс-группах), определяемых на основе данного инстанс позже в сцене (инстанс инстанса). Если отсутствует, операторы более позднего определения инстанса имеют преимущество.

Оператор
material " material_name "

указывает для инстанса, какой материал будет использоваться для определения свойств поверхности объекта. Материал к этому моменту уже должен быть определен. Заданный материал наследуется всеми инстансами, определяемыми на основе данного позднее в сцене (вниз по структуре DAG сцены). Если определенные позднее инстансы имеют собственные материалы, они переписывают наследуемые.

Оператор
material [ " material_name " [ , " material_name " ... ] ]

задает список материалов для объекта. Если в определении объекта использовался флаг tagged и для полигонов задавались метки label, для полигона с меткой n используется n-ый материал в списке оператора. Если метка n превышает количество материалов, для полигона используется первый в списке материал.

Если transform, motion transform, material указываются в instance без аргументов, они считаются неопределенными. Это используется для накопления изменений с наращиванием при последовательных определениях instance на основе друг друга.

Метка
tag label

может быть назначена instance объекта, mental ray ее не использует, но метка может быть передана шейдеру для каких-либо нужд, например, идентификации инстанса.

Свойства объектов в 3ds max и флаги mr

Для сопоставления установок свойств объекта в 3ds max и флагов в mi-файле использовалась сцена caustics_two_lights.max, стандартно поставляемая вместе с файлами уроков 3ds max (папка 3dsMax\Tutorials\mental_ray). В сцене отключен расчет каустики, выполнен ее экспорт в mi-файл, который обработан командой ray.exe с ключом -echo для выноса описания геометрии в отдельные файлы.



Тестовая сцена

Установка свойства в 3ds max: Object Properties > General > Rendering Control > Visible to Camera on/off аналогична установке флага у instance объекта visible on/off. Видимость объекта для первичных лучей, теневых лучей и вторичных лучей raytrace reflection/refraction независима: например, если только visible off, объект не виден в камеру, но тени от него, а также его отражения и преломления видны:



У стеклянного бокала visible off и в камеру он не виден. Но его тени и отражения в шейкере присутствуют

Установка свойства в 3ds max: Object Properties > General > Rendering Control > Visible to Reflection/Refraction on аналогична установке trace on, то есть объекты получают и отбрасывают отражения/преломления, off вызывает появление вместо trace on двух флагов у instance объекта: reflection 6 и refraction 6, то есть объекту запрещается отбрасывать как отражения, так и преломления, но сам объект может отражать и преломлять, если позволяют свойства материала.



В свойствах подложки установлено reflection 6 и refraction 6, поэтому ни шейкер, ни бокал ее не "видят"

Вместо reflection 6 и refraction 6 в mi-файле можно задать значение 12, которое означает полный запрет - не только другие объекты не будут отражать/преломлять подложку, но и сама подложка не отражает и не преломляет.

Ручным редактированием mi-файла возможно исключить один эффект и разрешить другой, например, исключить расчет преломлений, но оставить расчет отражений:



Для подложки refraction 12 и поэтому бокал ее не "видит", а reflection 3 и шейкер отражает подложку



Обратная ситуация: для подложки refraction 3, reflection 12

3ds max property: Object Properties > General > Rendering Control > Receive Shadows on/off флаг (instance): shadow on/9.

3ds max property: Object Properties > General > Rendering Control > Cast Shadows on/off флаг (instance): shadow on/off

3ds max property: Object Properties > General > Rendering Control > Renderable on/off флаг (instance): в mi-файле объект просто не транслируется.

3ds max property: Object Properties > mental ray > Indirect Illumination > Caustic & GI off флаг (instance): caustic 12 и globillum 12

3ds max property: Object Properties > mental ray > Indirect Illumination > Generate Caustic & Generate GI on (only) флаг (instance): caustic 9, globillum 9

3ds max property: Object Properties > mental ray > Indirect Illumination > Receive GI and Caustic on (only) флаг (instance): caustic 6, globillum 6

3ds max property: Object Properties > mental ray > Indirect Illumination > Receive & Generate GI and Caustic on флаг (instance): caustic 3, globillum 3

Есть свои особенности у транслятора 3ds max и при экспорте геометрии. Во-первых, транслятор всегда устанавливает у объекта флаг tagged on и использует метки для назначения материалов. Во-вторых, для определения меток используется специальная структура данных типа data:

declare data
"max_ObjectData" (
vector "bvmin",
vector "bvmax",
array integer "mapchannels",
data "particleData",
array integer "faceEdgeVisFlags",
array integer "faceSmoothingGroup",
array integer "particleID",
array integer "materialID"
)
version 5
end declare

Материальные метки определяются массивом чисел array integer "materialID", смысл которых в 3ds max - номер (ID) канала материала.

Кроме того, как видно из вышеприведенной структуры, транслятор определяет границы контейнера, полностью содержащего объект (vector "bvmin", vector "bvmax"), и некоторые другие служебные данные.

Кроме данных типа max_ObjectData, транслятор создает для определения объекта еще одну структуру типа data, max_NodeData:

declare data
"max_NodeData" (
color "WireColor",
integer "NodeID",
integer "NodeRenderID",
array light "illuminators",
array light "shadowmakers",
boolean "useGlobalLights",
array integer "materialRequirements"
)
version 2
end declare

которую использует для указания источников, освещающих объект и создающих тени, и некоторые другие данные. Хотя эти две структуры данных не документированы, смысл их довольно прозрачен.

В третьих, транслятор несколько иначе описывает полигонную геометрию в блоке group .. end group. Вместо блока group .. end group используется блок trilist … end trilist, который гораздо более эффективен с точки зрения обработки полигонов поверхности, но и более рискован в отношении совместимости с новыми версиями mental ray.
Далее, первым блоком идет описание вершин, их количества и типов, общее количество треугольников поверхности, затем - список векторов и в конце блока находится список геометрии - индексы треугольников и составляющие их вершины. Например:

.............
trilist
# список вершин, их количество и тип
vertex 24 p n t 3
# общее количество треугольникв поверхности
triangle 12
# список векторов
[
-5 -5 0 0 0 -1 1 0 0
-5 5 0 0 0 -1 1 1 0
........
-5 5 10 -1 0 0 0 1 0]
# индексы и вершины треугольников
[
0 0 1 2
1 2 3 0
2 4 5 6
3 6 7 4
4 8 9 10
5 10 11 8
6 12 13 14
7 14 15 12
8 16 17 18
9 18 19 16
10 20 21 22
11 22 23 20]
end trilist
.............

Столь подробное описание деталей трансляции геометрии объектов необходимо знать только для того, чтобы идентифицировать все конструкции определения и создания объекта в mi-файле сцены и свободно ориентироваться в них при редактировании. При этом собственно редактированию будут подвергаться чаще всего опции конструкции определения и инстанса объекта и почти никогда - описание геометрии, последнее лучше выполнять при помощи инструментов моделирования 3d программы.

По-объектный расчет final gathering

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

Так, для ускорения расчетов возможно создание упрощенного геометрически дубликата сложного объекта сцены с тем, чтобы основной объект был виден в камеру (visible on), но не отбрасывал тень и не участвовал в рейтресинге. А дубликат наоборот - не был виден в камеру (visible off), но создавал бы тень и отражения/преломления.

Из 3ds max возможно управлять следующими настройками: visible, shadow и его режимами, shadowmap, trace, reflection/refraction и ограниченно - их режимами, transparency, caustic, globillum и их режимами, max displace value.

Остальные флаги и операторы объекта и его инстансов могут быть отредактированы только в mi-файле. В этот список попадает samples, позволяющий регулировать суперсэмплинг объекта, и finalgather с его режимами и возможностью сохранения в файл. Отсутствие возможности настроек d 3ds max именно этих флагов особенно удручает. Рассмотрим простую сцену:



FG Accuracy 280 сэмплов, радиусы 100 - 10 см

Сцена освещается двумя источниками света - точечным directional ("Солнце" ) и прямоугольным area ("небо"), имеет всего лишь три объекта: комната -box с окном, прямоугольная тумба-подставка и шар на ней. Материал один для всех объектов - простой диффузный белого цвета. Расчет выполнен только при помощи FG с тремя диффузными отскоками и настройками aa = 1-16 сэмплов, общими для всей сцены.

После экспорта сцены в mi-файл, можно увидеть, что инстансы всех трех объектов имеют finalgather 3, то есть полностью участвуют в расчетах FG: как создают вторичные отражения, так и "видят" отражения других объектов. Изменим режим finalgather у прямоугольной тумбы с 3 на 9 - тумба будет участвовать во вторичных переотражениях света, но сама получать их от других объектов не будет. Вот, что получим в результате:




У одного из объектов сцены finalgather 9, у остальных 3

Теперь изменим у тумбы режим finalgather с 9 на 6: тумба получает отражения от других объектов, но сама вторичный свет не отражает:



Противоположная ситуация: тумба не отражает вторичный свет,
но сама его "видит"

Освещение окружающих объектов изменилось, что особенно хорошо видно на шаре, лежащем на тумбе.

Теперь проделаем следующее. У всех объектов сцены, кроме шара, выставим в соответствующих инстанс конструкциях finalgather 9, а у шара - finalgather 3. Кроме того, в конструкции определения объектов (подчеркиваю - определения объектов, а не их инстансов) введем samples -1 0, а для шара добавим оператор finalgather file "ball.fgm" и samples 1 2. Таким образом, мы определим по-объектный сэмплинг и сохранение fg-карты для шара в файл. При этом fg-карты ни одного объекта, кроме шара, рассчитываться вообще не будут. Поэтому, в Options сцены теперь возможно "накрутить" радиусы и сэмплы finalgather и тем самым рассчитать вторичное освещение шара гораздо более точно, чем для всей остальной сцены. Редактируем Options:

  • finalgather on
  • finalgather accuracy 1200 10.0 1.0
  • finalgather rebuild on

и получаем:



Расчет вторичного освещения методом fg, выполненный только для одного объекта сцены - шара. Fg accuracy: 1200 сэмплов на точку, минимальный радиус 1 см, максимальный - 10 см

Кроме того, на диске сохранился файл ball.fgm размером в 35 кб, содержащий fg-карту шара.

Теперь вернем у всех объектов finalgather в режим 3, samples 0 2, а в Options вернем "старые" настройки fg, с которыми рассчитывалась вся сцена:

  • finalgather on
  • finalgather accuracy 280 100.0 10.0
  • finalgather rebuild off




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

Сводя все вместе, можно предложить следующий алгоритм организации по-объектного расчета вторичного освещения в сцене:

1. В 3ds max выполняется настройка fg-расчета для всей сцены с сохранением карты в файл 2. Если для некоторых объектов сцены требуются иные настройки fg accuracy, выполняем экспорт mi-сцены в файл с текущими настройками расчета GI и FG 3. Редактируем mi-файл: выставляем в инстансах проблемных объектов finalgather 3 и finalgather 9 у всех остальных объектов сцены. К сожалению, этого нельзя сделать сразу для всех объектов - оператор режима FG не поддерживается ни блоком Options, ни ключами командной строки ray.exe. Был бы очень желателен такой сценарий: Options устанавливает режим fg для всех объектов сцены, определения fg - режимов объектов переписывают соответствующие значения Options, а instance переписывает fg- режимы Options и определения объекта. Но он, к сожалению, пока не реализован.
Далее, в определении проблемных объектов включаем запись fg-карты в файл при помощи оператора finalgather file "имя_объекта.fgm". В Options сцены изменяем настройки FG:

  • finalgather on
  • finalgather accuracy samples max.radius min.radius
  • finalgather rebuild on
  • # finalgather file "имя_файла_fg_карты_сцены.fgm"

Обязательно нужно отключить оператор finalgather file (например, при помощи знака #, установив его в строке перед оператором), иначе fg-карта может грузиться из файла, а не рассчитываться. Затем выполняем повторные расчеты освещения с настройкой fg accuracy. Поскольку рассчитываться будет fg-карта только одного объекта, настройка радиусов и сэмплов fg должна быть относительно быстрой. После того, как будут найдены оптимальные значения fg радиусов и сэмплов для объекта, и fg-карта объекта будет сохранена в файл, можно вернуть настройки fg режимов всех объектов в исходное положение: finalgather 3. В Options изменить:

  • finalgather accuracy samples max.radius min.radius
  • finalgather rebuild off
  • finalgather file "имя_файла_fg_карты_сцены.fgm"

В качестве значений finalgather samples, max.radius и min.radius нужно взять старые - те, что были получены в 3ds max и являются приемлемыми для большей части сцены. Теперь fg-карты сцены при рендере будут грузиться из файла, созданного в 3ds max, а fg-карты проблемных объектов - из своих собственных файлов.

Таким образом, по-объектное редактирование режимов finalgather с сохранением карт в отдельные файлы объектов позволяет организовать по-объектный расчет вторичного освещения с разными степенями точности. В сочетании с индивидуальными настройками суперсэмплинга мы получаем гибкий и мощный инструмент оптимизации качества и скорости расчетов глобального освещения методом FG.

В следующей части будут рассмотрены камеры.

Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.