Lightmap’ы и Конверсия изображения в другое uv пространство

Этот пост о методах конвертации изображения (текстуры, карты дисплейсмента и т.п.), нарисованного для определенной uv-развертки, в соответствующее изображение для другой uv-развертки того же объекта.

К примеру, сгенеренный дисплейсмент для AUV/GUV маппинга из zBrush надо трансформировать в более “вразумительный” маппинг (загрузка которого в zBrush для перегенерации карты не работает… не спрашивайте, у меня такое было в разгар продакшена ;) ) дабы смешать с другой картой дисплейсмента (у mentalray проблемы с дисплейсментом на разных uvSet’ах). Или попросту маппинг объекта изменился, и хочется уже нарисованную под него текстуру проапдейтить. Ну или что-либо еще :)

Вот, предположим, дисплейсмент для головы с определенным маппингом. По каким-то причинам мы решили изменить ее маппинг на такой (это, разумеется, совершенно не пример как надо качественно маппить голову ;) ):

Для конвертации карты нам нужно чтобы оба маппинга были на объекте как разные uvSet’ы (как переносить маппинг с объекта на объект той же или разной топологии/нумерации вершин – отдельная тема, с которой лучше разобраться, ибо всплывает постоянно :) ) В данном случае исходная карта для дефолтного map1, а сконвертировать надо в следующий по счету uvSet с именем cyl.

Далее у нас два варианта. Один что называется user-friendly, но медленнее и менее качественный, а второй немного сложнее настроить, но намного качественнее и быстрее. Опишу оба в том же порядке.


- Batch Bake (mental ray) -

1) Вешаем на этот объект surfaceShader с конвертируемой картой на том uvSet’е, для которого она нарисована (в данном случае дефолтный map1):

2) Выключаем в настройках рендера все лишнее (finalGather к примеру) и установливаем приличный sampling (от него будет зависеть кол-во артефактов на сконверченном изображении и само время конвертации);

3) Запускаем опции Lighting/Shading > Batch Bake (mental ray), включаем ‘Use bake set override’ и выставляем нужные настройки разрешения, битности и тип файла. Важно включить Color mode: Light and color. В самом низу ‘Override mesh UV set assignments’ позволяет ввести имя uvSet’а, в который мы хотим сконвертить эти Light and color данные, то есть нашу карту:

Запускаем, ждем некоторое время, получаем результат (обычно в mentalray/lightMap папку текущего проекта):

Несмотря на удобство интерфейса и настройки шейдера, время на конверсию этим методом довольно долгое (в моем примере 10 минут), да и карта получилась с артефактами в областях с плотной сеткой:

Поэтому перейдем ко второму методу…


- mib_lightmap_write shader -

1) На объект назначаем surfaceShader без каких либо карт, просто константный материал для минимума калькуляций;

2) Опять же, отключаем все лишнее типа finalGather, но в данном случае сэмплинг и т.п. значения не имеют – ставим их низкими, опять же для скорости. На самом деле можно вообще камеру передвинуть в пустоту, чтобы не рендерилось ничего.

3) К shadingGroup назначенного surfaceShader‘а подключаем mib_lightmap_write (дефолтный коннекшен .message к .miLightMapShader maya сделает сама), в котором надо настроить четыре вещи:

texture: сюда подключаем mentalrayTexture, в которой указываем writable, резолюшен, битность и имя файла, в который будет записан результат (расширение укажет в какой тип файла писать, т.е. при указании .exr файл будет честным openEXR, разве что традиционно без приличной компрессии ;) )

coord: координатные данные, в которые конвертировать изображение. Подключаем mib_texture_vector (через mib_texture_remap если надо повозиться с областями uv пространства), в котором устанавливаем в какой uvSet хотим конвертировать (атрибут select: 0 – указывает на дефолтный map1, 1 – на следующий, наш cyl в данном случае);

input: собственно, что хотим конвертировать. Надо приконнектить через mib_texture_lookup, в который тыкаем другой mib_texture_vector, но уже разумеется со значением 0 для select (так как исходная карта для дефолтного map1). Саму текстуру можно подключить как из майской file, так и из mentalrayTexture (writable тут уже включать не надо, само собой);

fg_mode: выключаем значением -1;

Запускаем рендер (как уже упоминалось – можно пустой), пойдет секция генерации lightmap‘а, в результате которого и получим файл, далее пробежит уже ненужный рендер.

Таким методом получаем более качественный результат (артефактов нет) и намного быстрее (6 секунд в данном случае).

Сцену с этим нетворком прилагаю:

Download

10 Responses

Subscribe to comments via RSS

  1. Written by zbyshek
    on 13 January 2010 at 16:19
    Permalink

    Отлично

  2. Written by sanctus
    on 12 May 2010 at 15:12
    Permalink

    очень интересно!
    вопрос: а можно таким способом запечь occlusion, а то черерез Batch Bake (mental ray) уж очень много артефактов, даже с завышенными настройками.

  3. Written by Sagroth
    on 12 May 2010 at 22:43
    Permalink

    Можно запечь что угодно – процедурные текстуры, освещение, отражения и т.п. Окклюжен тоже, только возможно скорость будет не очень. Просто тыкайте в инпут лайтмапа то что нужно запечь (и в mib_texture_vector надо правильный uvSet поставить – скорее всего 0).

  4. Written by Grek
    on 16 September 2010 at 14:59
    Permalink

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

  5. Written by Sagroth
    on 17 September 2010 at 1:44
    Permalink

    Спасибо.

    Скрипт лежит тут:

    http://www.sigillarium.com/_articles/seamExpander.html

    но есть подозрение, что он уже давно не работает на новых версиях фотошопа. Как бы то ни было, суть метода в том, чтобы отделить текстуру от фона, продублировать слой, и нижнему дубликату сделать filters>other>maximum, возможно еще удалить один пиксел по краям верхнего.

  6. Written by Grek
    on 17 September 2010 at 22:37
    Permalink

    Спасибо за быстрый ответ !
    Скрипт замечательно работает в photoshop CS5.

  7. Written by Sagroth
    on 17 September 2010 at 23:24
    Permalink

    Надо будет тогда ту страничку включить в этот блог :)

  8. Written by frame_first
    on 16 November 2010 at 13:31
    Permalink

    спасибо!

  9. Written by Paul_Winex
    on 20 July 2011 at 8:44
    Permalink

    Хороший граф получается, полезный. Прошу помочь с воей проблемой. Хочу запеч Fluid3DTexture в битмап. С другим битмапом граф работает, кактолько в инпут через mib_texture_lookup подключаю флюидную текстуру, система не работает. Вот ошибка.
    // Warning: (Mayatomr.Custom) : mib_texture_lookup1.tex: unsupported parameter connection of type texture to incompatible node fluidTexture3DShape1, ignored //

    Видимо предварительно надо флюидную текстуру както конвертнуть. Есть варианты?

  10. Written by Sagroth
    on 24 July 2011 at 17:17
    Permalink

    Если какая-то майская нода не поддерживается, пропустите ее через mib_color_mix (втыкаем в color_0 и ставим num в 1), outValue которого уже втыкайте в input лайтмапа.

Subscribe to comments via RSS

Leave a Reply