logo
Как использовать все возможности mental ray в р

Рендер простой сцены

и листинг ее mi-файла:

# mi 3.4

# ------------------------------------scene_1.mi

link "base.dll"

$include

options "SceneOpt"

samples 0 1

contrast 0.05 0.05 0.05 0.05

scanline on

filter box 1.0 1.0

object space

end options

camera "myCam"

frame 1

output "rgb" "Scene_1"

focal 4.345584

aperture 3.6

aspect 1

resolution 500 500

end camera

instance "myCam|Inst" "myCam"

transform

-0.46947578 0.28016394 -0.83731753 0

-0.88294536 -0.14896753 0.44521475 0

-6.8064194e-009 0.94832307 0.3173061 0

-3.8659956 -14.127339 -121.62366 1

end instance

light "light1"

"mib_light_point"

"color" 1 1 1 ,

"factor" 0.75

)

origin 0 0 0

end light

instance "light1|Inst" "light1"

transform

1 0 0 0

0 1 0 0

0 0 1 0

54.126644 4.8438337e-006 -300 1

end instance

material "mat"

opaque

"mib_illum_phong" (

"ambient" 0.5 0.5 0.5,

"diffuse" 0.6 0.3 0.9,

"ambience" 0.3 0.3 0.3,

"specular" 1.0 1.0 1.0,

"exponent" 50,

"mode" 1,

"lights" ["light1|Inst"]

)

end material

object "cube1"

visible trace shadow

tag 1

group

-30.0 -27.5 0.0

-30.0 27.5 0.0

30.0 27.5 0.0

30.0 -27.5 0.0

0.0 0.0 50.0

v0 v1 v2 v3 v4

c "mat" 0 1 2

c "mat" 0 2 3

c "mat" 0 1 4

c "mat" 1 2 4

c "mat" 2 4 3

c "mat" 3 4 0

end group

end object

instance "cube1|Inst" "cube1"

transform

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

end instance

instgroup "rootScene_1"

"myCam|Inst" "light1|Inst" "cube1|Inst"

end instgroup

render "rootScene_1" "myCam|Inst" "SceneOpt"

# ---------------------------------------------- end scene_1.mi

Описание сцены на языке mental ray состоит из команд, устанавливающих различные опции рендера (выделены красным цветом) и шейдеров с параметрами, описывающих элементы сцен (выделены зеленым цветом).

Давайте поближе познакомимся с каждым из элементов сцены.

# Этот знак определяет начало комментария и будет проигнорирован mental ray. # Действует только до конца строки.

link "base.dll"

$include

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

Первая строка "линкует", или подключает, файл base.dll, содержащий программы шейдеров. Дословно эту команду можно перевести так: "исполняемый программный код шейдеров, которые используются в сцене, находится в файле base.dll, откуда их и нужно брать по мере необходимости".

Вторая строка указывает на файл, в котором содержатся декларации используемых в сцене шейдеров. Дело в том, что mental ray недостаточно просто знать, где лежит программа шейдера. Каждый шейдер перед первым его использованием в сцене должен быть еще и декларирован. Смысл "декларации" состоит в том, чтобы сообщить mr структуру параметров, используемых шейдером, и тип рассчитываемого (возвращаемого) шейдером результата. Во время рендера, при вызове очередного шейдера, mr получает только адрес-указатель на начало блока параметров шейдера. Если он не знает структуры, то есть количество, типы и имена параметров шейдера, он вообще не сможет извлечь необходимые данные.

По соглашению, декларации шейдеров записываются в отдельные файлы с расширением mi, которые подключаются во время рендера. Какие файлы нужны для конкретной сцены, определяется именно командой $include <имя_фала.mi> и их, также как и команд link, в фале может быть несколько, или - сколько угодно.

options "SceneOpt"

samples 0 1

contrast 0.05 0.05 0.05 0.05

scanline on

filter box 1.0 1.0

object space

end options

Блок Options определяет настройки рендера, общие для всех элементов сцены. Например, настройки антиалиасинга, теней, глобального освещения и многое другое.

В 3ds max смысл и значение интерфейсных настроек встроенного mental ray определяют содержимое именно этого блока. Однако соответствие это не взаимно однозначное. Все, что есть в интерфейсе настроек рендера 3ds max, будет представлено и в блоке опций. Но далеко не все, что доступно в блоке опций, есть в настройках рендера 3ds max.

Поэтому, редактирование этого раздела mi-файла сразу дает ощутимую выгоду перед встроенным рендером.

Далее список всех опций будет рассмотрен подробно. Как видим, определение блока опций выполняется при помощи конструкции {options … end options}. Блоки настроек рендера обязательно должны иметь имя (SceneOpt в нашем случае), заключенное в двойные кавычки. Это необходимо для того, чтобы команда render в конце mi-файла смогла использовать блок настроек, сославшись на его имя.

camera "myCam"

frame 1

output "rgb" "Scene_1"

focal 4.345584

aperture 3.6

aspect 1

resolution 500 500

end camera

Конструкция, определяющая свойства камеры в сцене. Определение выполняется при помощи {camera "имя_камеры" … end camera}. Внутри конструкции перечисляются опции, настройки и шейдеры камеры (в нашей сцене шейдеры камеры не присутствуют).

Для того чтобы камера появилась в сцене и принимала участие в рендере нужно также определить ее так называемый "инстанс" (от английского "instance"). При помощи конструкции instance камера получает "адрес прописки" в сцене - трехмерные координаты, определяющие положение и ориентацию камеры. Дело в том, что определение любого трехмерного объекта, не только камеры, проще всего выполнять в пространстве, начало координат которого "привязано" к объекту - так называемом объектном пространстве. А его положение, размер и ориентацию задавать при помощи матрицы трансформации (16 чисел), определяющей преобразование объектного пространства в пространство мировых координат (world) сцены, а также масштабирование и ориентацию (углы поворота) элемента.

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

instance "myCam|Inst" "myCam"

transform

-0.46947578 0.28016394 -0.83731753 0

-0.88294536 -0.14896753 0.44521475 0

-6.8064194e-009 0.94832307 0.3173061 0

-3.8659956 -14.127339 -121.62366 1

end instance

Далее - конструкция, определяющая свойства источника света:

light "light1"

"mib_light_point"

"color" 1 1 1 ,

"factor" 0.75

)

origin 0 0 0

end light

определяет имя источника, шейдер освещения (light shader - в нашем случае "mib_light_point"), параметры и опции источника, такие как цвет, прозрачность тени и другие. Все настройки, опции и шейдер источников света будут рассмотрены подробно позднее. И теперь мы это знаем, нам нужен еще инстанс источника:

instance "light1|Inst" "light1"

transform

1 0 0 0

0 1 0 0

0 0 1 0

54.126644 4.8438337e-006 -300 1

end instance

Определение материала выполняется конструкцией {material "имя_материала" … end material}:

material "mat"

opaque

"mib_illum_phong" (

"ambient" 0.5 0.5 0.5,

"diffuse" 0.6 0.3 0.9,

"ambience" 0.3 0.3 0.3,

"specular" 1.0 1.0 1.0,

"exponent" 50,

"mode" 1,

"lights" ["light1|Inst"]

)

end material

Конструкция может включать параметры, опции и шейдеры. В данном случае свойства материала полностью и единственно определяются одним шейдером - "mib_illum_phong" с заданными значениями его параметров и одной опцией - opaque, которая говорит о полной непрозрачности материала (что позволяет несколько ускорить расчет цвета материала). Обратите внимание на такой параметр конструкции, как "lights" - это параметр, который ссылается на инстансы источников освещения и обязательно должен присутствовать в любом материале, поскольку иначе расчет цвета становится просто невозможным. Отсюда следует простое правило. Источники освещения должны быть определены в mi-файле раньше, чем любой из материалов, их использующих.

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

Конструкция {object "имя_объекта" … end object} определяет описание геометрических объектов в сцене, в нашем случае - пирамиды:

object "cube1"

visible trace shadow

tag 1

group

-30.0 -27.5 0.0

-30.0 27.5 0.0

30.0 27.5 0.0

30.0 -27.5 0.0

0.0 0.0 50.0

v0 v1 v2 v3 v4

c "mat" 0 1 2

c "mat" 0 2 3

c "mat" 0 1 4

c "mat" 1 2 4

c "mat" 2 4 3

c "mat" 3 4 0

end group

end object

Это один из возможных видов описания полигональной геометрии, довольно простой. Все что идет до group - опции рендера геометрического объекта, все, что заключено между {group … end group} представляет описание собственно геометрии - перечисление трехмерных координат вершин объекта, назначенных им имен (v 0 - v 4) и описание полигонов объекта перечислением образующих его вершин с указанием материала. Материал к этому времени должен быть уже определен, в нашем случае это материал, на который объект ссылается по имени "mat" и который мы уже определили, непосредственно перед объектом. Если нужно, чтобы нормаль полигона смотрела наружу объекта и была видима в камеру, перечисление вершин выполняется по часовой стрелке. В описание могут быть включены координаты нормалей и текстурные координаты (в нашем примере они не определялись).

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

Кроме полигональной, существует способ описания NURBS и patch поверхностей (free-form surfaces), а также - пространственных кривых.

В любом случае, следует запомнить, что определение геометрии выполняется при помощи object .. end object с указанием имени объекта, а собственно описание геометрии (вершин, нормалей текстурных координат и полигонов) выполняется конструкцией {group … end group} внутри object. Доступные для объектов опции будут рассмотрены далее подробно.

Наконец, после того как все элементы сцены описаны соответствующими конструкциями и шейдерами, подается команда рендера сцены

Инстанс объекта, определяющий его масштаб, ориентацию и положение в сцене:

instance "cube1|Inst" "cube1"

transform

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

end instance

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

render "rootScene_1" "myCam|Inst" "SceneOpt"

В рендере будут участвовать все элементы, которые указаны в качестве параметров сцены, в нашем случае - "rootScene_1" через инстанс камеры "myCam|Inst" и с учетом опций рендеринга, указанных в блоке "SceneOpt".

Инстанс - группа "rootScene_1" определена для удобства и является просто контейнером для всех инстанс-элементов, участвующих в рендере - сцена может быть сложной и количество ее элементов велико, поэтому удобно один раз определить группу таких элементов и затем просто ссылаться на имя этой группы:

instgroup "rootScene_1"

"myCam|Inst" "light1|Inst" "cube1|Inst"

end instgroup

В нашей сцене инстанс-группа содержит три инстанса: камеры, источника света и пирамиды.

Порядок появления конструкций в mi-файле, описывающих элементы сцены, не фиксирован жестко - элементы могут появляться в произвольном порядке. Однако существует несколько правил, ограничивающих этот "произвол" и вносящих некоторую упорядоченность и закономерность в расположение конструкций mi-файла. Вот они.

В нашем примере при определении материала используется шейдер "mib_illum_phong" из основной библиотеки шейдеров base.dll.

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

декларация шейдера:

declare color "mib_illum_phong" (

"ambient"

"diffuse"

"ambience"

"specular"

"exponent"

"mode"

"lights"

)

end declare

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

определение шейдера:

shader "my_mat_shader" "mib_illum_phong" (

"ambient" 0.5 0.5 0.5,

"diffuse" 0.6 0.3 0.9,

"ambience" 0.3 0.3 0.3,

"specular" 1.0 1.0 1.0,

"exponent" 50,

"mode" 1,

"lights" ["light1|Inst"]

)

мы определяем шейдер с именем "my_mat_shader" типа "mib_illum_phong", и присваиваем его параметрам конкретные значения. Указывать можно не все значения параметров, опущенным параметрам будут присвоены значения по умолчанию.

И ссылаемся на этот шейдер при описании материала, возможно, с другими значениями параметров:

material "mat"

opaque

" my_mat_shader " (

"ambient" 0.1 0.3 0.3,

"diffuse" 0.7 0.3 0.9,

"ambience" 0.3 0.3 0.3,

"specular" 1.0 0.9 1.0,

"exponent" 40,

"mode" 1,

"lights" ["light1|Inst"]

)

end material

В приведенном примере сцены декларации шейдера опущены, поскольку используется подключение декларации из файла при помощи команды $include , в котором есть декларация шейдера "mib_illum_phong". Кроме того, в сцене используется сокращенное, так называемое анонимное определение шейдера, когда то же имя шейдера, которое используется при декларации, используется и в определении материала с указанными значениями параметров. Такое возможно, хотя и не рекомендуется.

Рассмотренные конструкции описания основных элементов options, camera, light, material, object, instance, instgroup относятся к конструкциям так называемого верхнего уровня. Эти конструкции определяются с использованием имен. Назначенные имена конструкций могут быть использованы для определения других конструкций и так далее. В результате мы получаем иерархию элементов, определяющую структуру сцены. Эта иерархия может быть простой, как в приведенном примере, или очень сложной, что будет иметь место для большинства сцен, создаваемых на практике. Тем не менее, все основные строительные элементы этой иерархии и правила их соединения теперь нам известны, и потому мы можем понять эту иерархию и использовать ее в практических целях.

Если воспроизвести рассмотренную сцену в 3ds max, а затем выполнить ее экспорт в mi-файл, мы получим гораздо более сложное и длинное описание сцены. Это обусловлено тем, что транслятор 3ds max, кроме основных элементов сцены, вставит и различную служебную информацию, необходимую в силу специфики пакета моделирования.

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

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

Поэтому, теперь мы знаем, что и где нужно искать. Как это правильно редактировать - узнаем далее, изучив свойства конструкций элементов.

Команды

После запуска команды рендеринга mental ray из командной строки при помощи "ray.exe filename.mi", расчет изображения начинается далеко не сразу. Ему предшествует этап анализа (parsing) mi-файла. На этом этапе строки mi-файла читаются и анализируются mental ray последовательно, в том порядке, как они записаны в файле.

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

Мы имеем определенную возможность влиять на этап анализа посредством специальных команд. Эти команды могут быть записаны прямо в листинге mi-файла, в любом его месте и mental ray будет выполнять их сразу, как только встретит. Либо команды можно подавать указанием соответствующих ключей для ray.exe и в этом случае они имеют преимущество перед аналогичными командами в mi-файле.

Рассмотрим перечень, синтаксис и назначение этих команд.

Команды общего назначения:

Команда $include "имя_файла", или $include <имя файла>

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

$include "имя_файла"

Первая разновидность команды, когда имя файла указано в кавычках, определяет путь поиска файла в точности, как он указан в кавычках. Ее можно использовать для загрузки файлов с указанием полного пути для них.

$include <имя файла>

Вторая разновидность команды, с именем файла в угловых скобках. Указывается только имя файла, путь к нему определяется (неявно дописывается перед именем файла) по значению регистра _MI_REG_INCLUDE. Так что полный путь к файлу будет определяться как {значение_регистра__MI_REG_INCLUDE\имя_файла}.

Команда не может быть вложенной (то есть include не может содержать include), должна начинаться с начала строки ($ обязательно должен быть самым первым символом строки), не может быть использована внутри команды $code … $end code.

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

Команда link " filename "

подключает файлы, содержащие скомпилированный исполняемый программный код шейдеров. Благодаря этой команде mental ray "знает", что должен делать каждый шейдер. Альтернатива link - команда code, предназначенная для отладки шейдеров, она позволяет подключать исходный текст программ шейдеров на C с последующей компиляцией "на лету".

Команда namespace " name " ... end namespace

может содержать внутри любое количество определений элементов сцены. Ее основное назначение - отделить группу элементов (субсцену) от остальных элементов сцены или групп, определенных другими командами namespace. Элемент, определенный внутри этой команды для внешних элементов будет виден как "name::имя_элемента". Mental ray всегда неявно использует эту команду при определении геометрических элементов. Благодаря этому, геометрические элементы даже с одинаковыми именами никогда не перепутываются при ссылках на их имена.

Команда [ min] version " string " max version " string "

информирует mental ray, что данный файл требует для расчетов определенной версии ray.exe. Версия записывается как четырехзначное число, цифры отделяются точками. Если указано меньше четырех цифр, отсутствующие полагаются равными "0". Например, "3.3" означает "3.3.0.0". Когда mental ray при анализе встречает эту команду, он сравнивает версию запущенного ray.exe, и если она меньше min или больше max, выдается сообщение об ошибке, а рендер прекращается. Проверка версии полезна при расчете относительно новых эффектов, таких как подповерхностное рассеяние, например.

Команда verbose on|off| level

определяет подробность отчета mental ray о процессе обработки и рендера файла, выводимого на стандартное устройство вывода (на экран). Всего доступны 7 уровней:

Сообщения более высокого уровня включают сообщения всех предыдущих уровней. Уровни 1, 2, 3 и 4 удобно использовать при отладке сцен, 5 - при рендере. Седьмой уровень может быть полезен только mental images. Аналогом команды verbose является ключ командной строки -verbose n. Например: "ray.exe -verbose 4". Использование verbose в качестве параметра командной строки более предпочтительно и полезно в сочетании с параметром " -x on", который делает сообщения цветными, например, все сообщения об ошибках будут выдаваться на экране красным цветом.

Команда echo " message "

отображает на экране сообщение, заданное в "message". Требует verbose level не менее 4.

Команда call shader_list [ , " camera_inst " " options "]

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

Команда touch " element_name "

помечает элемент как "изменяемый в процессе рендеринга" для повторных вычислений. Например, для повторной тесселяции геометрического объекта с назначенным шейдером дисплейсмента при изменении положения камеры в анимации или для повторного чтения текстуры из файла при ее изменении. Без использования touch, mr такие ситуации отслеживать не будет.

Команда system " shell_command "

позволяет запускать команды операционной системы из mi-файла. Для Windows запускает отдельное окно и выполняет указанные стандартные dos-команды в нем. Полезна для запуска пакетных bat-файлов, содержащих последовательность dos-команд, например, для мониторинга времени рендера файла или для записи просчитанного кадра анимации на внешний видеомагнитофон.

Команда delete " element_name "

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

Команда debug " mode " [ " arg "]

более интересна разработчикам шейдеров, выводит отладочную информацию на системное устройство, заданное в качестве stderr, verbose level должен быть не ниже 4. Позволяет, например, получить информацию об используемых аппаратных шейдерах, значениях регистров, распределении памяти...

Команда render " root_instgroup_name " " camera_inst_name " " options_name "

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

Переменные, регистры и команды для работы с ними

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

Команда set " name " [ " value "]

определяет значение "value" для переменной с именем "name". Если команда используется в виде set "name", без явного указания значения, содержимое переменной сбрасывается, и она считается неопределенной.

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

Конструкция

registry " name " [ " value "]

[ value " value "]

[ link " library.so/dll "]

[ code " sourcefile.c "]

[ mi " scenefile.mi "]

[ spdl " scenefile.spdl "]

[ echo " string "]

[ system " shell command "]

end registry

создает регистр с именем "name". Любой из параметров конструкции может быть опущен (оставлен неопределенным). Имя регистра может быть произвольным, но существует несколько предопределенных имен регистров, которые имеют для Mental ray особое значение.

Регистр _MI_REG_INCLUDE

определяет пути файлов, которые дописываются к имени файла-аргумента команды $inclide < имя_файла >. Фактически, этот регистр определяет пути (подстановку пути), которые mental ray будет использовать везде, где встречается команда $include <> или mi (в регистрах).

Регистр _MI_REG_LIBRARY

определяет пути, по которым будет выполнен поиск фалов библиотек шейдеров с расширением dso/dll, подключаемых командой link. Используется везде, где встречается команда link.

Регистр _MI_REG_TEXTURE

содержит пути файлов текстур, которые подключаются в mi-файле при помощи оператора texture.

Регистр _MI_REG_LIGHTPROFILE

определяет пути поиска файлов, содержащих профили описания распространения света для IES источников (в 3ds max - для фотометрических источников) и упоминаемых в mi-файле как аргумент оператора lightprofile.

Регистр _MI_REG_SWAPDIR

определяет директорию на диске, назначаемую для свопа (виртуальная дисковая память). Mental ray будет использовать эту директорию, а не общий для всех приложений page file операционной системы. Сказывается на производительности и стабильности расчетов самым положительным образом и настоятельно рекомендуется к использованию.

Регистр _MI_REG_SWAPLIMIT

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

Регистр _MI_REG_FBDIR (начиная с версии mr 3.4)

определяет директорию, в которой будут храниться временные копии фрейм- буферов (frame buffers), например, при необходимости освободить оперативную память для других целей. Для ray.exe может быть указан параметр командной строки fb_dir имя_директории, который аналогичен по назначению, но имеет более высокий приоритет.

Значение регистра считается определенным, если его поле "value" определено. Все вышеперечисленные регистры могут, а некоторые просто должны быть определены в rayrc.

Все остальные поля регистров используются командой $lookup.

Команда $lookup " name "

просматривает значение регистра и выполняет его операторы:

Операторы в регистре могут повторяться.

Несколько слов о code. Этот оператор будет более интересен разработчикам шейдеров. Оператор позволяет использовать программу шейдера, написанную на C или C++ в расчетах, может присутствовать не только в регистрах, но в любом месте mi- файла сцены.

Эта команда бывает двух видов: code " filename "

подключает программу из внешнего файла с именем filename.c, и $code исходный текст на C $end code

позволяет вставлять текст программы непосредственно в регистр или mi-файл. Mental ray обеспечивает компиляцию и линкование кода, а после декларации шейдера, он становится доступен для использования, как и любой другой шейдер. Этот оператор введен с целью отладки программного кода шейдеров.

Пример. Напишем файл rayrc, который просматривается mental ray при запуске ray.exe. Без определения этого файла работа ray.exe просто невозможна, поскольку не определены пути библиотек шейдеров и их деклараций. Путь, по которому будет искаться сам rayrc задается в Windows системной переменной (Environment variable) MI_ROOT, которую необходимо определить. Обычно устанавливают MI_ROOT = диск\директория mental_ray. Так, если mr установлен на диск С, в директорию mentalray3.4, то MI_ROOT = "c:\mentalray3.4".

Далее в примере предполагается, что mental ray установлен на диске с в директорию mr34

Первое, что необходимо определить в rayrc - это регистры _MI_REG_INCLUDE и _MI_REG_LIBRARY.

Для _MI_REG_INCLUDE устанавливаем значение, определяющее путь к файлам деклараций основных шейдеров, если считать, что они лежат в папке c:\mr34\include, тогда:

registry "_MI_REG_INCLUDE" value "c:\mr34\include" end registry

Если считать, что файлы с кодом шейдеров лежат в папке c:\mr34\lib, тогда значение регистра _MI_REG_LIBRARY должно быть определено так:

registry "_MI_REG_LIBRARY" value "c:\mr34\lib" end registry

Таким образом, мы определили пути поиска файлов библиотек и деклараций основных (базовых) шейдеров mental ray.

Теперь введем новый регистр и выполним явное подключение файлов. В примере предполагается, что 3ds max7 установлен в папке c:\3dsmax, а файлы встроенного mental ray находятся: в папке c:\3dsmax\mentalr\include - файлы деклараций, c:\3dsmax\mentalr\shaders - файлы библиотек шейдеров. Тогда:

registry "MAXBASE"

link "base.dll"

link "physics.dll"

link "contour.dll"

link "subsurface.dll"

link "c:\3dsmax\mentalr\shaders\3dsmax7.dll"

link "c:\3dsmax\mentalr\shaders\lume.dll"

mi "base.mi"

mi "physics.mi"

mi "contour.mi"

mi "subsurface.mi"

mi "c:\3dsmax\mentalr\include\3dsmax7.mi"

mi "c:\3dsmax\mentalr\include\lume.mi"

end registry

$lookup "MAXBASE"

Предполагается также, что при рендере будут использованы шейдеры и декларации, идущие в поставке с standalone mental ray, а не в комплекте 3ds max. Хотя, определением регистров это можно изменить.

Особенность экспорта трехмерной сцены из 3ds max в mi-файл заключается в том, что транслятор вначале mi-файла добавляет линки на все основные библиотеки шейдеров и вставляет декларации нужных шейдеров прямо в листинг описания сцены. Поэтому, на самом деле, вышеприведенный регистр можно сократить - не линковать файлы, пути к которым определены регистром "_MI_REG_LIBRARY, а декларации можно вообще опустить, останется:

registry "MAXBASE"

link "c:\3dsmax\mentalr\shaders\3dsmax7.dl"

link "c:\3dsmax\mentalr\shaders\lume.dll"

end registry

$lookup "MAXBASE"

Поскольку для основных шейдеров путь совпадает со значениями, определенными регистрами _MI_REG_INCLUDE и _MI_REG_LIBRARY, в операторах просто указывается их имя, и они будут подключены правильно. Файлы шейдеров 3dsmax7.dll, 3dsmax7.mi, lume.dll и lume.mi находятся в совсем другом месте, поэтому в операторах link и mi указаны полные пути к ним. Аналогично, если потребуется подключить другие дополнительные шейдеры, можно добавить новые операторы с указанием полных путей к ним.

Определим еще директорию для свопа и хранения frame buffers, а также максимальный размер файла виртуальной памяти в 500 мегабайт:

registry "_MI_REG_SWAPDIR" value "c:\mi_swap" end registry registry "_MI_REG_SWAPLIMIT" value 500 end registry registry "_MI_REG_FBDIR" value "c:\mi_frbuff" end registry

Директории c:\mi_swap и c:\mi_frbuff должны быть созданы средствами операционной системы.

Также, еще определяются следующие регистры:

registry "{SYSTEM}" value "windows" end registry registry "{DSO}" value "dll" end registry

Первый из них используется для идентификации операционной системы, второй - для подстановки (замены) расширений .DSO на .dll файлов библиотек шейдеров.

Таким образом, файл rayrc может выглядеть так:

#---------------------------- # rayrc for 3dsmax #-------------------------------

registry "_MI_REG_INCLUDE" value "c:\mr34\include" end registry registry "_MI_REG_LIBRARY" value "c:\mr34\lib" end registry

registry "{SYSTEM}" value "windows" end registry registry "{DSO}" value "dll" end registry

registry "MAXBASE"

link "base.dll"

link "physics.dll"

link "contour.dll"

link "subsurface.dll"

link "c:\3dsmax\mentalr\shaders\3dsmax7.dll"

link "c:\3dsmax\mentalr\shaders\lume.dll"

mi "base.mi"

mi "physics.mi"

mi "contour.mi"

mi "subsurface.mi"

mi "c:\3dsmax\mentalr\include\3dsmax7.mi"

mi "c:\3dsmax\mentalr\include\lume.mi"

end registry

$lookup "MAXBASE"

registry "_MI_REG_SWAPDIR" value "c:\mi_swap" end registry registry "_MI_REG_SWAPLIMIT" value 500 end registry registry "_MI_REG_FBDIR" value "c:\mi_frbuff" end registry

#---------------------------------------------------------------------------------

Или в более коротком варианте:

#---------------------------------------------------------------------------------

registry "_MI_REG_INCLUDE" value "c:\mr34\include" end registry registry "_MI_REG_LIBRARY" value "c:\mr34\lib" end registry

registry "{SYSTEM}" value "windows" end registry registry "{DSO}" value "dll" end registry

registry "MAXBASE"

link "c:\3dsmax\mentalr\shaders\3dsmax7.dll"

link "c:\3dsmax\mentalr\shaders\lume.dll"

end registry

$lookup "MAXBASE"

registry "_MI_REG_SWAPDIR" value "c:\mi_swap" end registry registry "_MI_REG_SWAPLIMIT" value 500 end registry registry "_MI_REG_FBDIR" value "c:\mi_frbuff" end registry

-----------------------------------------------------------------------------------

Для сетевого рендеринга, помимо rayrc, нужно определить содержание файла .rayhosts. В этом файле должны быть перечислены сетевые компьютеры, на которых установлен standalone mental ray и которые планируется использовать в сетевом рендеринге: сетевое_имя_компьютера или его IP:port,

номер порта может быть опущен. Например, .rayhosts может выглядеть:

comp1:7003 comp2:7050 comp3 ...... compN:port

Файл .rayhosts должен находиться в строго определенном месте. А именно, mental ray будет его искать либо по пути, определенном переменными окружения HOMEPATH\HOMEDRIVE, либо в директории, где была запущена команда ray.exe.

Узнать значение переменных HOMEPATH и HOMEDRIVE можно, набрав команду SET в dos-окне операционной системы (кнопка Start>Run ввести cmd и нажать ввод, затем вести SET). Команда SET также отображает множество другой полезной информации о компьютере - его сетевое имя, значение PATH, значение переменных окружения и другое. Если все было сделано правильно, при рендеринге mental ray найдет файл .rayhosts и попытается подключить доступные компьютеры. Если подключение состоялось, в окне лога будет отображено соответствующее сообщение.

В следующей части будут рассмотрены опции рендеринга и источники света mental ray.