пятница, 12 апреля 2013 г.

Mental Ray AO pass средствами GPU или 3ds Max в стрингах

С выходом 3ds max 2014 во вкладке Renderer появился новый свиток String Options. С его введением, доступ к неинтегрированным напрямую в 3ds max функциям Mental Ray стал довольно простым. Теперь зная необходимые команды String Options в этом свитке стало возможно, так сказать, написание "собственых макроскриптов" для использования новых команд в Mental Ray. Одной из интересных новых команд в версии 3.11 является Ambient Occlusion Gpu. Попробуем разобраться:


Список команд String Options которые отвечают за GPU AO:

"ambient occlusion gpu" on - включает GPU AO

"ambient occlusion gpu passes" целое числоколичество GPU итераций для аккумулирования сэмплов АО на пиксель. Определяет как много сэмплов на пиксель расчитывается, котнтролируя таким образом анти-алайзинг финального результата. Типичными значениями для этой команды будет число кратное двум 1 (1*1), 4(2*2), 9(3*3) и т.д. Значения не кратные двум будут автоматически округлятся до ближайшего числа которое делится на два. Эта команда так же позволяет влиять на загруженость GPU и таким образом влиять на производительность. Увеличивая количество проходов, уменьшается количество лучей которое использует GPU за один проход, соответственно уменьшается нагрузка на GPU почти не влияя на конечный результат. Итоговое число АО лучей на пиксель это приблизительная составляющая GPU проходов и лучей. (К сожалению на данный момент эта команда не работает во встроенном в 3ds Max Mental Ray и поэтому в режиме по умолчанию в расчет GPU берутся значения   max samples, как для режима Classic, так и для режима Unified / Raytraced) 

"ambient occlusion falloff" число испонительопределяет какой тип затухания АО будет использоваться. Значение по умолчанию 1 (linear falloff).

"ambient occlusion falloff min distance" число  - определяет растояния от которого начинается затухание.

"ambient occlusion max distance" число - максимальное растояние для которого расчитывается АО.

"ambient occlusion framebuffer" "имя буфера кадров" - имя буфера кадров который будет использоваться для расчета АО.

GPU AO работает на движке Nvidia OptiX и не использует в расчете никаие шейдеры 3ds max. AO рендерится автоматически как отдельный проход используя глобальные параметры String Options. Расчитаное изображение сохранаяется в буфере кадров (на данный момент записывается поверх одного из указаных в команде  "ambient occlusion framebuffer" "имя буфера кадров") при этом не влияя на расчеты проделываемые ЦП во время рендеринга. Таким образом мы получаем AO pass  практически даром, так как он будет выполнен быстрее основного рендера или дополнительных проходов. Так же отключая расчет АO внутри шейдеров мы снимаем дополнитльную нагрузку с процессора тем самым ускоряя рендер. 

Mental Ray поддерживает неограниченое число буферов кадров, но в связи с особеностями 3ds Max мы можем использовать только один основной буфер кадров и рендер элементы. Поэтому для создания GPU прохода нам придется пойти на хитрость и заменить результат расчета либо в основном, либо в одном из рендер элементов на проход AO GPU.

Открываем любую сцену и в свитке String Options вводим следующие команды


команда "ambient occlusion max distance" 1500 означает что максимальное растояние для которого будет расчитываться АО равна 1500мм (я использую милиметры для Display Units Scale). 
Имя "FB_NAME_MAIN" означает что для вывода GPU АО прохода будет использоваться основной буфер кадров. Это значит что наш основной рендер заменится проходом АО, что не совсем логично. Попробуем заменить один из не нужных нам рендер элементов на GPU AO.

Добавим не нужный нам Render Element, например Alpha.


Имя буфера кадров для рендер элементов будет отличатся от тех, что используются в названиях элементов. Поэтому, если у вас активный всего один рендер элемент, то его имя будет "fb_re#0". Если же у вас несколько рендер элементов, то будет генерироваться следующий список имен буферов кадров "fb_re#1", "fb_re#2", и т.д. Если не ясно какое имя у буфера кадров, то можно экспортировать сцену в формат .Mi и посмотреть в пункте camera “framebuffer”. В итоге имея только один рендер элемент, наш свиток String Options выглядит так: 


Как улучшить качество АО не изменяя настроек сцены для финальной визуализации?

Так как в данный момент для расчета качества GPU AO в 3ds Max использовать команду  "ambient occlusion gpu passes" невозможно, то поэтому в режиме по умолчанию в расчет GPU берутся значения max samples, как для режима Classic, так и для режима Unified / Raytraced. 


На данных изображениях результат основного рендера выполненого со следующими настройками: Quality 2.0, min samples 1.0, max samples 128. Как видим полученый результат GPU AO очнеь шумный из-за низкого значения max samples. Увеличение значения max samples во время финальной визуализации может увеличить время рендеринга. Поэтому попробуем получить АО проход после основной визуализации.Чтобы регулировать настройки качества АО нам необходимо отключить GI (если GI сохранен в файл, то можно не отключать), увеличить значения max samples до необходимого значения. и включить режим Material Override c установленым пустым материалом Mental Ray. 

Что нам это дало?

Нам не нужно отключать Exposure Control и светильники в сцене, отключать FG  и GI если фотонная карта сохранена в файл.Пустой материал Mental Ray  не описывает геометрию вашей сцены. Он не генерирует теней, отражений, преломлений, лучей FG и т.д. Поэтому основной рендеринг займет секунды, а так как для генерации GPU AO не нужны никакие щейдеры 3ds max, а только описание самой геометрии в пространстве и максимальное количество семплов на пиксель, то после расчета АО мы получим идеально бесшумный проход без лишних телодвижений по интерфейсу программы

.
Данный проход расчитан со следующими настройками Quality 2.0, min samples 1.0, max samples 2048. 2048 сэмплов на пиксель использовалось для расчета АО!!! для сравнения максимальное количество семплов в шейдерах АО равно 1000. Время расчета прохода составило 32 секунды!

18 комментариев:

  1. Еще бы тени считались на GPU...)

    ОтветитьУдалить
    Ответы
    1. Не думаю что это возможно. Тени это просто блокированый свет, а для их генерации необходим расчет распространения света, а этим на GPU уже Iray занимается... Вот если бы добавили расчет FG на GPU, как вроде бы планировали по слухам, то можно было бы получить смесь Biased и Unbiased рендерера в режиме FG Brute Force (IMHO). Вот где бы супер плюшки были...

      Удалить
    2. Не совсем верно, в mental ray есть поддержка вычисления карты теней формата Regular с помощью GPU, но она реализована за счет OpenGL, и предусматривает применение со Scanline движком. Есть реализация в mental ray for Maya и конечно в mental ray Standalone. С 3ds Max и встроенным в него mental ray эту фичу не реализовали или реализовали но настолько плохо что даже в специальных скриптах ее нет.

      Удалить
  2. Дошли руки до проверить, сразу нашел баг - с клиппингом не работает!!! А так действительно за секунды считает.

    ОтветитьУдалить
    Ответы
    1. Ну, скорее всего это не баг. Iray насколько я знаю по техническим причинам тоже с клиппингом не работает (по крайней мере в Максе). Так что можно провести некую паралель - все что работает с GPU, не работает с клиппингом. Спасибо за ньюанс.

      Удалить
  3. вставляй картинки в оформление на главной. Сразу понятно о чём речь пойдёт и солиднее блог будет выглядеть)

    ОтветитьУдалить
    Ответы
    1. спасибо за совет. Учту. Хотя конкретно в этом посте все можно понять из названия))))

      Удалить
  4. Возможно я что-то не понимаю но, есть подозрение, что "ambient occlusion gpu passes" все таки работает.
    если вбить вот это в MaxScript listener
    mental_ray_string_options.AddOption"ambient occlusion gpu" on
    mental_ray_string_options.AddOption"ambient occlusion framebuffer" "fb_re#0"
    mental_ray_string_options.AddOption"ambient occlusion max distance" 500
    mental_ray_string_options.AddOption "ambient occlusion gpu passes" 512
    и выбрать classic/Raytrasing то качество оклюзии явно зависит не от выборки "ambient occlusion gpu passes".
    Но с Unified АА это почему-то не работает(хотя я может с ним не разобрался как следует )

    ОтветитьУдалить
    Ответы
    1. Таки да, "ambient occlusion gpu passes" работает в Classic mode и не работает в Unified, хотя в документации ментала сказано что команда должна работать с обоими режимами.

      Удалить
    2. Да мне кажется autodesk просто не успели дописать полную интеграцию с 3dmax кусок кода который с Unified работает не дописан и просто закоментирован,(как обычно это происходит с шейдерами ). Так что может в одном из последних сервиспаков допишут

      Удалить
    3. Не допишут. Это фича вообще Доской в Максе не поддерживается официально в этом релизе. То что мы щас можем использовать эту функцию, то это своего рода trick. Для того, чтобы ее интегрировать официально в макс, то нужно изменять транслятор макса, а такие вещи к сервис паку не делают. Так что в этой версии навряд ли.

      Удалить
  5. И еще цвета на GPU АО не переносятся между поверхностями :(

    ОтветитьУдалить
    Ответы
    1. Дык они и не должны. Никакие шейдеры в расчет не берутся, соответственно нет никакой информации о цвете, отражениях и т.д. Только геометрия в чистом виде

      Удалить
  6. Скажите пожалуйста, как реализовать просчет AO GPU. Я вот как ни ковырял ниго не выходит. Быть может дело в видеокарте или может какой-то драйвер нужен особый или плагин-скрипт? У меня 2014 3dsMax design, видеокарта одна quadro fx 580, драйвера я прбовал разные как самый последний, так и тот который на сайте NVIDI якобы сертифицирован для 2014-й версии. В настройках драйвера функция AO (там она называется вроде Заграждение общего света, не помню точно) для 3dsMax написано не поддерживается. А включение в общих настройках драйвера, в Панели управления NVIDIA, ничего не дает. Попытка установить скрипт Thorsten Hartmann на 2013-й ничего не дала. Причем если использовать буфер кадра от render element (Alpha) то в нем появляется то Alpha, то просто пустой, черный, кадр, не уловил при каких манипуляциях. Интересно было бы разобраться, в чем дело.
    Сори за много букв :)

    ОтветитьУдалить
    Ответы
    1. GPU AO появилось в mental ray 3.11, который встроен начиная с 3ds max 2014. В 2013 максе и ниже не работает по очевидным причинам. Настраивается GPU AO не в драйвере видеокарты, а в 3ds max в свиткке String Options с помощью команд (или скрипт Thorsten для 2014 версии). Черный кадр может появляться если не указана команда "ambient occlusion max distance" число. Почитайте внимательно статью еще раз, но я не думаю что 32 ядра Cuda на вашей видеокарте "сделают вам погоду" в приросте в расчетах.

      Удалить
  7. Помогите понять, возможность исключить AO из просчета просто прекрасная. Времени экономит уйму. Но вот не задача. Выставишь разрешение чуть поболее, так черный кадр. То ли оперативы на борту GPU не хватает, то ли еще что. Т.к. перебирая расширения к примеру, если с 2400х1600 резко перейти на 3200х2400 то черный кадр, если постепенно по 100/50/5/1 пикселей, то можно и дотянуть до 3200х2400. Но до 4800х3600 все равно нивкакую... Как быть?
    Еще заметил что легкие сцены (тестовые) можно и при большом разрешении, а если под миллион поликов то траблы.

    ОтветитьУдалить
    Ответы
    1. Все правильно скорее всего не хватает оперативной памяти на GPU. Всегда выполняйте рендеринг с открытым окном Render Message Window и включенными опциями Show Progress Messages и Show Information Meassages. Там сразу же, после нажатия кнопки Render, при трансляции сцены видно хватает памяти на GPU и подключилась ли она.

      Удалить
  8. Еще AOGPU с мультискаттером не дружит...(( забивает оперативку в потолок.

    ОтветитьУдалить