Читайте также:
|
|
В mental ray запекание в текстуры появилось, начиная с версии 3.0. Механизм запекания реализуется парой шейдеров: основным шейдером mib_lightmap_write и каким-либо шейдером - сэмплером поверхности, который рассчитывает цвет точек поверхности.
Основной шейдер занимается всей необходимой подготовительной работой - сбором информации об объекте, созданием структуры растровой карты для хранения информации, вызовом сэмплера для расчетов цвета и записью результатов в файл. При запекании основной шейдер вызывается дважды. Первый раз перед рендерингом в режиме vertex mode, второй раз при рендеринге в режиме mesh mode.
В режиме vertex mode шейдером выполняется подготовительная работа для расчетов. Собираются данные о геометрии объекта - трехмерных координатах вершин всех треугольников, образующих его поверхность, нормалях вершин и назначенных вершинам текстурных координатах. По этим данным и заданным в настройках параметрам запекаемого изображения (разрешению и формату) создается растровая карта, в которой каждой вершине по текстурным координатам назначен определенный пиксел запекаемого изображения.
Затем для каждой из вершин объекта вызывается шейдер - сэмплер, который рассчитывает цвет вершины. Рассчитанное значение цвета записывается в запекаемую карту. В результате первого этапа получается растровая карта цвета с изолированными пикселями, соответствующими отдельным вершинам. Результат может быть использован в запекании цвета вершин геометрии для игровых движков или для интерполяции недостающих цветов карты по уже вычисленным. В последнем случае запеченная карта будет очень низкого качества.
В режиме mesh mode шейдер mib_lightmap_write вызывается непосредственно при рендеринге. В этом режиме основной шейдер снова вызывает сэмплер, на сей раз для расчета каждого пиксела запекаемой карты, кроме вершинных пикселов, которые уже посчитаны. В результате получается качественная и точная растровая карта, каждый пиксел которой рассчитан сэмплером по соответствующей точке поверхности объекта.
Таким образом, запекание текстур в mental ray требует предварительного создания текстурных координат для поверхности и шейдера - сэмплера, который рассчитывает цвет точек поверхности объекта. Сэмплер должен передаваться основному шейдеру в качестве параметра. Такая модульная структура призвана облегчить написание пользовательских шейдеров запекания - программировать нужно только процедуру расчета цвета поверхности, а основной шейдер можно использовать во всех случаях без изменений. Исходники шейдеров запекания можно найти на публичном ftp - сервере mental images. Шейдеры запекания содержатся в библиотеке base.dll, декларируются в base.mi и по умолчанию скрыты. Очень рекомендую открыть их, отредактировав base.mi.
Вплоть до релиза mental ray 3.4, в библиотеке представлено только два шейдера запекания - основной универсальный шейдер mib_lightmap_write и один шейдер - сэмплер mib_lightmap_sample, который может рассчитывать освещенность поверхности объекта: прямую освещенность, освещение от caustic и фотонных карт, final gathering. То есть, все виды освещенности - как прямую, так и global illumination. Результатом запекания будут растровые карты освещенности, падающей на поверхность объекта. Кроме этого сэмплера, других в библиотеке нет, поэтому mib_lightmap_sample установлен шейдером по умолчанию для mib_lightmap_write. Именно поэтому процесс запекания текстур в mental ray именуется как light mapping - создание карт освещенности.
Для того чтобы инициализировать процесс запекания в 3ds max средствами mental ray, необходимо предварительно создать для поверхности объекта текстурные координаты и затем назначать шейдер mib_lightmap_write в слот Light Map материала объекта. После этого запекание текстур (light map) для поверхности, которой назначен такой материал, будет выполнено автоматически во время рендеринга.
Интерфейсы шейдеров
mib_lightmap_write и mib_lightmap_sample
Поскольку, кроме mib_lightmap_sample, в библиотеке mental ray других сэмплеров нет, возникает вполне логичный вопрос - что еще, кроме карт освещенности, можно запекать средствами самого mental ray? Правильный ответ - ничего, кроме карт освещенности. Для появления новых возможностей нужно программировать дополнительные шейдеры - сэмплеры.
Существует еще один способ: в качестве сэмплеров можно использовать любой материальный шейдер mental ray. В этом случае основной шейдер будет в нужное время вызывать материальный шейдер для каждой точки поверхности и записывать возвращаемый им цвет в запекаемую текстуру.
Этот способ не совсем корректен, поскольку использовать материальные шейдеры напрямую в качестве сэмплеров нельзя, так как они используют в расчетах данные о положении камеры и BRDF - двунаправленную модель расчета освещения (падающее освещение - отраженное освещение). Использование материальных шейдеров будет совершенно корректным только в случае, если для конечного результата положение камеры несущественно. Например, этот подход позволяет запечь blend- материалы 3ds max, запекание которых штатными средствами "макса" (render to texture) все еще затруднительно, или ambient occlusion, или процедурные карты.
Использование материальных шейдеров является недокументированной возможностью mental ray, использовать этот метод "можно, но осторожно". Назовем этот способ запекания "способом №1"
Кроме средств mental ray в 3ds max предусмотрены штатные инструменты запекания в текстуры - render to texture (меню Rendering > Render To Texture, клавиатурное сокращение "0" на основной раскладке), сокращенно - RTT. RTT совместно с mental ray прекрасно запекает большинство "родных" материалов 3ds max, хотя есть и исключения -blend и материалы, реализованные с помощью mental ray Connection. Запекаются также и многие материальные шейдеры mental ray, прежде всего те, которые видны в редакторе материалов и снабжены приставкой "3ds max". Будем называть штатный RTT "способом №2".
Существенным недостатком RTT является некорректная работа с материалами, чьи свойства определяются шейдерами через mental ray Connection. При запекании таких материалов RTT воспринимает их как стандартный материал 3ds max, полностью игнорируя закладку mental ray Connection в его свойствах. В итоге, запекание дает совершенно неправильный результат. При этом даже оригинальный материал, по которому выполняется запекание, повреждается. В качестве выхода из этой ситуации можно либо воспроизвести материал на основе mental ray material, тогда RTT будет правильно его обрабатывать, либо использовать способ №1 запекания материала шейдером mib_lightmap_write.
Типичная процедура запекания материала при помощи шейдера mib_lightmap_write состоит из следующих шагов.
1. Создаем текстурные координаты объекта. Для проверки карты имеющихся координат нужно воспользоваться модификатором Unwrap UVW. Требуется, чтобы карта координат была удобна для редактирования и содержала как можно меньше швов, потому что редактировать координаты после запекания придется вручную.
Дело в том, что из-за особенностей шейдера mib_lightmap_write, после запекания будут видны места стыков отдельных областей текстурных координат и тем явственнее, чем меньше разрешение запекаемой карты. Для устранения швов нужно отмасштабировать текстурные координаты - уменьшить их, чтобы обеспечить перекрывание на стыках. Делать это нужно уже после запекания. Штатный 3ds max RTT лишен этого недостатка, он имеет возможность управления перекрыванием швов еще на этапе настройки запекания (эта возможность называется padding и будет рассмотрена чуть позже). Другим важным условием, предъявляемым к карте текстурных координат, является отсутствие наложений (перекрывание) отдельных областей текстурных координат друг на друга.
Пример достаточно удачных текстурных координат
Неудачные текстурные координаты - множество швов и несвязанных координатных областей. Редактировать их будет довольно сложно
2. Удобнее всего для работы создать новый mental ray material и использовать его в качестве контейнера запекаемого материала. Удобнее, потому что придется копировать запекаемый материал в сэмплер поверхности mib_lightmap_write.
3. В слот Light Map назначаем шейдер mib_lightmap_write. В слоте Texture задается название, формат файла и разрешение запекаемой карты. Примечание: при рендеринге можно получить сообщение об отсутствии карты, которую вы указали. Это сообщение можно спокойно проигнорировать. В UV Generator (3dsmax) определяем, как использовать созданные ранее текстурные координаты.
4. В слоте Surface Sampler по умолчанию назначен Lightmap Sample (base). Если нужно посчитать карту освещения, оставляем его. Если же нужно запечь какой-нибудь материал, назначаем вместо Lightmap Sample сначала Material to Shader и в его слот "material" копируем материал, который нужно запечь.
5. При необходимости, в слот Surface, через Material to Shader можно еще раз скопировать запекаемый материал, хотя это необязательно.
6. Теперь настраиваем сам рендер и выполняем рендеринг. По завершении запеченная растровая карта будет находиться по указанному в настройках пути.
7. Можно создать новый материал, назначить его диффузным свойствам запеченную растровую карту, материал - объекту и отредактировать текстурные координаты (швы).
Пример: запекание материала типа blend.
RTT в паре с mental ray запекает этот материал неправильно - вместо смешивания материалов, запекается только один из них. Для примера использован простой blend материал с двумя смешиваемыми текстурами и маской falloff, управляющей смешиванием.
Схема запекаемого blend-материала
После запекания RTT в паре со scanline-рендером 3ds max получаем совершенно правильный результат:
Blend - материал, запеченный scanline
Запеченная текстура
Если этот же материал запечь при помощи RTT и mental ray, получим:
RTT + mental ray:
рендер с запеченным blend-материалом
Запеченная текстура
Эта ошибка относится к некорректной работе RTT и происходит только при запекании, рендер blend-материала в камеру выполняется корректно. Чтобы mental ray смог правильно запечь "бленду", воспользуемся способом №1.
Для этого создаем новый mental ray материал, назначаем mib_lightmap_write в слот Light Map. Переходим на закладки mib_lightmap_write, в слоте Texture указываем путь, имя и тип файла, разрешение (я выбрал 512х512, потому что карты большего размера в видовом окне max не отображаются) и цветовую модель (8 бит на канал даст обычное RGB изображение). Затем нажимаем кнопку Coordinates и настраиваем параметры генератора текстур. Поскольку текстурные координаты были уже созданы ранее при помощи Unwrap UVW, необходимо только проследить, чтобы MapSlotType=0 (текстура, а не окружение), MapChannel имел значение номера канала, который назначен для текстурных координат, Blur=0. Выходим из генератора "наверх" и нажимаем кнопку Surface Sampler. Для параметра Surface по умолчанию назначен Lightmap Sample (base), нажимаем кнопку справа и из списка выбираем Material to Shader. Теперь перетягиваем запекаемый blend-материал на кнопку material в Material to Shader. На вопрос отвечаем "Instance", если нужно сэкономить память, или "Copy".
Копируем перетягиванием
запекаемый материал в сэмплер поверхности
Эту же операцию копирования можно повторить и для слота Surface материала mental ray. Тогда при рендере мы будем видеть рассчитываемое изображение. Если этого не сделать, объект будет черным при рендере, но на запекаемую текстуру это не повлияет, а время сэкономит.
Теперь настраиваем освещение. Если нужно получить цветную текстуру без теней и освещения (diffuse map), отключаем все источники в сцене и тени от них, в Rendering>Environment>Ambient ставим белый цвет ("включаем" ambient - освещение). Что касается настроек рендера, нужно везде у растровых карт уменьшить до минимума Blur, значение суперсэмплинга 4/4. Теперь назначаем созданный материал объекту и рендерим. Запеченная текстурная карта будет находиться там, где мы указали в настройках. Вот что получилось:
Рендер с текстурой, запеченной
из blend-материала при помощи mental ray
Запеченная текстура теперь выглядит правильно
Если источники света не выключать, то запечется такая текстура:
Текстура с освещением
То есть, вместе с цветом текстуры рассчиталось и запеклось освещение.
Как я уже говорил выше, описанный метод работает и во многих других случаях. Однако результат его работы будет зависеть от конкретной ситуации, и почти всегда будет отличаться от рендера с тем же материалом в "камеру". Поэтому, для достижения идентичности, или похожести, запекаемой текстуры и рендера "в камеру" почти всегда требуется специальное редактирование материала "под запекание".
Описанный метод запекания не документирован и официально не поддерживается (и даже не упоминается) в документации mental ray или 3ds max. Поэтому, используйте его на свой страх и риск. Хочется особо подчеркнуть, что для полноценного запекания материальных шейдеров все же требуется программировать специальные полноценные сэмплеры.
Теперь рассмотрим более подробно штатные средства рендера в текстуры, RTT в 3ds max, или способ №2. Дело того стоит, поскольку в некоторых ситуациях без него никак не обойтись, к тому же, он серьезно автоматизирует и упрощает весь процесс запекания.
Дата добавления: 2015-10-28; просмотров: 147 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создание собственных материалов SSS Fast | | | RTT (Render To Texture) в 3ds max 7.5 |