пятница, 24 января 2014 г.

Визуализация Ambient Occlusion с помощью GPU в mental ray for Maya

В mental ray 3.11, который доступен в 2014 версии Autodesk 3ds Max, Autodesk Maya и Autodesk Softimage реализована первая ступень разработки новых возможностей mental ray, способных использовать возможности GPU поддерживающих вычисления на базе NVIDIA CUDA.
Версия 3.11 получила поддержку вычислений эффекта Ambient Occlusion на GPU. В отличие от привычных для разработчиков игр решений на базе DirectX или Open GL, реализация AO на GPU в mental ray является полноценной моделью использующей алгоритмы трассировки лучей, а все вычисления на себя берут библиотеки NVIDIA CUDA и NVIDIA OptiX.
В Autodesk Maya 2014 входят все необходимые компоненты для вычисления AO средствами GPU. Однако стоит заметить, что напрямую в интерфейсе Maya данная функция не реализована, но активизировать ее не составит большого труда любому пользователю.
Данный пост является переводом поста Дэвида Хаккета (David Hackett) c elementalray, но с адаптацией под современные GPU на базе архитектуры Kepler. При этом, ну русском языке подробного урока по активизации данной функции пока не встречалось.


Необходимые файлы библиотек и настройка файла Maya.env
Для применения AO на GPU необходимы следующие библиотеки:

  • cudart64_42_9.dll
  • gpu_ao_plugin.dll
  • optix.1.dll
  • optixu.1.dll

Они будут добавлены в систему при установке mental ray for Maya 2014 и доступны по следующему пути:
C:\Program Files\Autodesk\mentalrayForMaya2014\bin
Для того чтобы Maya понимала куда ей обращаться при активной функции GPU AO, необходимо внести небольшую правку в файл Maya.env. Данный файл можно найти в директории параметров Maya в папке с документами пользователя:

C:\Users\\Documents\maya\2014-x64

Открыв Maya.env в текстовом редакторе, например Notepad или Sublime Text, введите следующие переменные среды и их значения:

MI_LIBRARY_PATH = C:\Program Files\Autodesk\mentalrayForMaya2014\bin
PATH = $MI_LIBRARY_PATH;$PATH

Данные переменные позволят Maya и mental ray for Maya найти необходимые библиотеки для выполнения вычислений AO на GPU.
Сохраните файл Maya.env и запустите программу Maya.

Определение String Options для mental ray for Maya
За активизацию вычислений AO на GPU отвечает отдельные команды блока Options в mental ray. По своей сути, данная технология выполняет визуализация отельного прохода (pass) Ambient Occlusion, перенаправляя вычисления на GPU.
В mental ray Standalone AO на GPU определен следующими опциями:

"ambient occlusion gpu" on | off
Включает или отключает вычисление прохода Ambient Occlusion средствами GPU.

"ambient occlusion framebuffer" "fb_name"
Если активизировано вычисление AO на GPU, то будет использовано имя буфера кадров определенное данным параметром.

"ambient occlusion gpu passes" passes
Определяет, количество проходов, которые будут просчитаны и аккумулированы буфером кадров АО до этапа усреднения. Если этот параметр не задан, количество проходов будет вычисляться исходя из максимального значения выборки mental ray (max samples).

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

"ambient occlusion falloff min distance" distance
Параметр, с помощью которого можно определить расстояние, откуда начинается затухание АО. Значение по умолчанию 0.

"ambient occlusion max distance"distance
Параметр, который может быть использован, чтобы задать максимальную длину лучей, используемых для расчета АО. Отрицательное значение коэффициента описывает относительную степень величины сцены. Значение по умолчанию -1.
Общее количество AO лучей, используемых на пиксель примерно равно произведению  "ambient occlusion gpu passes” на "ambient occlusion rays".
GPU АО соблюдает параметры видимости, теней и прозрачности для получения интуитивных результатов АО.
Если нет GPU, предоставляется резервная функциональность. Буфер кадров АО визуализируется в соответствии с растровой дискретизации mental ray и ни один совпадающий с GPU пиксель.
Так как в Maya 2014 нет данных опций, их необходимо добавить вручную, внеся соответствующие правки в узел с глобальными атрибутами mental ray.
В диалоге Outliner (Window > Outliner), снимите флажок с пункта меню Display > DAG Objects Only. Это позволит отобразить все узлы сцены, которые используются, но скрыты от пользователя. В поиске введите mi*, после чего отобразится список узлов связанных с mental ray for Maya.
Найденный с помощью сортировки по имени и выделенный узел miDefaultOptions позволяет пользователю применить скрытые возможности mental ray.
В данном списке, выберите узел miDefaultOptions, это узел основных параметров mental ray (mentalrayOptions), по сути, с ним связаны все основные атрибуты в диалоговом окне Render Settings. Кликнув два раза мышью по этому узлу, откроется Attribute Editor в котором можно приступить к добавлению новых String Options.
Для этого, разверните свиток String Options в узле miDefaultOptions и с помощью кнопки Add New Item добавьте первый блок String Options.
В поля для нового блока опций введите следующие значения:

Name = ambient occlusion framebuffer
Value = ao_buffer1
Type = string

Но согласитесь, перемещаться по достаточно большому списку опций – трудоемкая задача. Нам на помощь может прийти небольшой сценарий на языке MEL, созданный Дэвидом.

select miDefaultOptions;
int $idx = `getAttr -size miDefaultOptions.stringOptions`;
setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "ambient occlusion framebuffer";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "ao_buffer";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "string";
$idx = `getAttr -size miDefaultOptions.stringOptions`;
setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "ambient occlusion gpu";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "on";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "boolean";
$idx = `getAttr -size miDefaultOptions.stringOptions`;
setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "ambient occlusion max distance";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "5.0";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "scalar";
$idx = `getAttr -size miDefaultOptions.stringOptions`;
setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "ambient occlusion falloff";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "1";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "integer";
int $idx = `getAttr -size miDefaultOptions.stringOptions`;
setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "ambient occlusion rays";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "8";
setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "integer";
select miDefaultOptions;

Данный сценарий создает все необходимые String Options и определяет их значения. Если вы хотите повысить качество или внести коррективы в другие параметры, можно просто выполнить правку данного сценария и применить его вновь. А так же можно выполнить правку String Options прямо в интерфейсе узла miDefaultOptions.
Новые String Options добавленные в узел miDefaultOptions с помощью сценария.
Теперь, пришло время создать дополнительный проход (pass) для того чтобы mental ray понимал, куда выводить данные формируемые во время вычислений GPU AO.

Создание буфера кадров для вывода Ambient Occlusion Pass
Буфер кадров создается с помощью узлов mentalrayUserBuffer и шейдера вывода mental ray подключенного к узлу камеры. Для этого выделите узел miDefaultOptions (после выполнения сценария для String Options он выделяется автоматически) и создайте буфер кадров с помощью следующей команды в Script Editor:
AEmrUserBuffersAppend miDefaultOptions.frameBufferList;
Переименуйте вновь созданный узел в ao_buffer и выберите в раскрывающемся списке Data Type пункт RGBA (Half) 4x16 Bit.
Новый пользовательский буфер кадров mental ray, связанный с miDefaultOptions.
Теперь, выделив камеру, из которой будет выполняться визуализация сцены, перейдите в свиток Output Shaders (Camera Shape > mental ray > Output Shaders). Нажмите на кнопку Create и программа, автоматически переведет вас к атрибутам узла mentalrayOutputPass.
Новый шейдер вывода в атрибутам камеры.
В шейдере mentalrayOutputPass введите новое имя, например ao_bufferPass. А в качестве буфера кадров поставьте флажок Use User Buffer. В раскрывающемся списке User Buffer автоматически будет выбран созданный ранее буфер кадров ao_buffer.
Созданный шейдер для нового буфера кадров и его основные параметры.
Для вывода данных в файл, необходимо установить флажок File Mode, после чего, в качестве формата изображений выбрать OpenEXR (.exr) и при желании определить постфикс имени файла (поле File Name Phostfix)
Теперь все готово для визуализации прохода Ambient Occlusion с помощью GPU.

Запуск процесса визуализации AO на GPU
Открыв диалог Render View, запустите процесс визуализации сцены. В диалоговом окне Output Window или Terminal (если используете Mac OS X или Linux), должны отобразиться следующие данные:

LIB  0.7     45 MB info : loaded library "C:/Program Files/Autodesk/mentalrayForMaya2014/bin\gpu_ao_plugin.dll".
LIB  0.7     46 MB info : library "C:/Program Files/Autodesk/mentalrayForMaya2014/bin\gpu_ao_plugin.dll": loaded mr_gpu plugin "mr_gpu_ao"

Данные строчки показывают, что файл модуля gpu_ao_plugin.dll был найден и задействован mental ray. Далее начинается процесс визуализации сцены. За что отвечают следующие строчки в окне Output Window:

GPU  0.3     62 MB info : rcgpu:  regions:557  indices:1762944  vertices:673095  = sharing:2
GPU  0.3     85 MB info : gpuao: time to create gpu ao data: 0.16 seconds
GPU  0.3     85 MB info : gpuao: transfer memory consumption: 22.6957 MiBytes
GPU  0.3     62 MB info : gpuao: time to initialize on gpu: 0.32 seconds.
GPU  0.3     62 MB info :   gpuao thread:  prepare render entry
GPU  0.3     62 MB info :   gpuao thread:  [60.7139 ms]  initialized optix
GPU  0.3     62 MB info :   gpuao thread:  Optix devices: [Dev0 'Quadro K1000M' (compute 3.0) mem 2048MB]   Dev0:229/2048MB
GPU  0.3     62 MB info :   gpuao thread:  Restricting to one CUDA device for Lbvh.
GPU  0.3     62 MB info :   gpuao thread:  [38.9736 ms]  start load scene
GPU  0.3     62 MB info :   gpuao thread:  [174.48 ms]  start load geometry data
GPU  0.3     62 MB info :   gpuao thread:  [28.2127 ms]  finish load scene
GPU  0.3     62 MB info :   gpuao thread:  Gpu buffer total size:17.5561 MiB 587648 tris
GPU  0.3     62 MB info :   gpuao thread:  1920x1080 AO:3 AA:49 (147/3)  ao distance:95 falloff:1  AS:Lbvh/Bvh leaf:8
GPU  0.3     62 MB info :   gpuao thread:  [0.302381 s total]

В приведенных выше сообщениях можно увидеть какой GPU на данный момент используется визуализатором, у меня это была мобильная NVIDIA Quadro K1000M c 2 Gb графической памяти и совместимая с Compute Compatibility 3.0. В процессе визуализации буферу кадров было выделено около 20 Mb памяти.
В процессе визуализации изображения, будут отображаться сообщения следующего вида:

JOB  0.8     73 MB progr:     3.1%    rendered on W5-FUJITSU.8
GPU  0.7     73 MB progr:     2.0%    rendering gpu ao
JOB  0.8     73 MB progr:     3.3%    rendered on W5-FUJITSU.8

Процесс JOB выполняет визуализацию буфера кадров с Beauty Pass и в целом, использует CPU, а процесс GPU как раз отвечает за вычисления AO Pass средствами графического ускорителя. При этом, данные процессы идут параллельно.
Если GPU будет отставать от процесса визуализации Beauty Pass, mental ray выведет следующее сообщение:

GPU  0.3     64 MB info : gpuao:  Waiting for gpu...

Этого не стоит бояться, так как если визуализируется простая сцена с примитивным освещением и затенением, CPU сможет ее просчитать гораздо быстрее. А вот на комплексных и сложных сценах, GPU наоборот справится со своей задачей гораздо быстрее.

GPU  0.3     64 MB info :   gpuao thread:  context kernel compiled
GPU  0.3     64 MB info :   gpuao thread:  [269.445 ms]  context AS built
GPU  0.3     64 MB info :   gpuao thread:  start render ambient occlusion (49)
GPU  0.3     64 MB info :   gpuao thread:  [116658 ms]  finish render ao frames
GPU  0.3     64 MB info :   gpuao thread:  [9.8331 ms]  start pixel transfer
GPU  0.3     64 MB info :   gpuao thread:  [60.1512 ms]  end pixel transfer
GPU  0.3     64 MB info :   gpuao thread:  [116.997 s total] 
GPU  0.3     64 MB info :   gpuao thread:  

В завершении процесса, будут выведены представленные выше сообщения о том, сколько секунд потребовалось на визуализацию сцены и сколько потребовалось миллисекунд для передачи данных пикселей.
Пример результата визуализации AO в комплексной сцене с помощью GPU Ambient Occlusion.
Стоит сделать небольшое отступление и предостеречь пользователей GPU с Compute Compatibility 1.1, таких как NVIDIA GeForce 9800 GT и NVIDIA Quadro FX 1800. С данными моделями может возникнуть проблема с выполнением приложений OptiX. К сожалению, пока нет решения данной проблемы, поэтому рекомендуется либо обновить свой GPU до более современных моделей или оставить применение классического CPU Based вычисления AO в mental ray. Подробнее о проблеме можно узнать здесь>>
Итак, рассмотрев настройки mental ray for Maya для применения Ambient Occlusion на GPU, хочется узнать, а насколько быстро просчитают данный эффект современные GPU NVIDIA на базе архитектуры Kepler.

Результаты тестов вычислений AO при помощи GPU на архитектуре Kepler
В начале данного поста была представлена иллюстрация с двумя железнодорожными путями и колесными парами. Это специальная сцена, созданная для этого поста и для тестирования производительности GPU в вычислениях общего назначения, коими, по сути, и является визуализация эффекта Ambient Occlusion в mental ray.
Сцена с представленной в начале поста моделью для эксперимента с Ambient Occlusion на GPU.
В данной сцене содержится порядка 392104 граней (837872 треугольника). В процессе визуализации данной сцены с помощью mental ray for Maya ей отводится около 260 Мб памяти. Соответственно, при запуске процесса визуализации на GPU, будет отведено столько же графической памяти. В сцене, используемой для теста, были заданы следующие параметры Ambient Occlusion для визуализации на CPU и на GPU.
Параметры шейдера для mib_amb_occlusion (CPU тест):

"samples" = 256,
"bright" = 1 1 1 1,
"dark" = 0 0 0 0,
"spread" = 1,25,
"max_distance" = 95,
"falloff" = 1.0,

Для GPU теста, были заданы отдельные параметры в String Options в узле miDefaultOptions:

"ambient occlusion gpu" = on
"ambient occlusion gpu passes" = 16
"ambient occlusion falloff" = 1.0
"ambient occlusion falloff min distance" = 1.0
"ambient occlusion max distance" = 95.0
"ambient occlusion framebuffer" = "ao_buffer"

Рассмотрим результат тестирования GPU на базе архитектуры NVIDIA Kepler в выполняемых модулем gpu_ao_pugin вычислениях в mental ray 3.11.
Результат тестирования GPU NVIDIA Quadro в вычислениях Ambient Occlusion на GPU. Меньше – лучше.
За основу был взято время визуализации сцены с применением классического метода визуализации Ambient Occlusion реализуемого с помощью шейдера mib_amb_occlusion. Процессору Quad core Intel Xeon E3-1240v2 потребовалось 0:08:28.37 на визуализацию сцены. Дальше была применена GPU реализация Ambient Occlusion. Все вычисления выполнялись под управлением драйвера версии 320.78 и с использованием CUDA версии 4.2.

Тест 1: NVIDIA Quadro K600 | 192 CUDA cores | 1024 Mb GDDR3 | PCI-E 2.0 x16
На визуализацию кадра в формате Full HD (1920x1080) модели K600 потребовалось 0:06:15.43. Не настолько существенный прирост, однако, для небольших сцен и простых тестовых визуализаций, даже бюджетная модель может помочь в ускорении рабочего процесса.

Тест 2: NVIDIA Quadro K2000 | 384 CUDA cores | 2048 Mb GDDR5 | PCI-E 2.0 x16
А вот второй тест начал демонстрировать реальную мощь современных GPU. Благодаря более быстрой памяти, большей вычислительной мощности, модель K2000 выполнила визуализацию сцены за 0:02:44.13. Это существенный прирост производительности, позволяющий в полной мере выполнять визуализацию Ambient Occlusion только средствами GPU.

Тест 3: NVIDIA Quadro K4000 | 768 CUDA cores | 3072 Mb GDDR5 | PCI-E 2.0 x16
А вот самый шустрый из протестированных GPU, модель K4000 должна была выполнить поставленную задачу в два раза быстрее, чем K2000. Но это был сухой расчет, основанный на характеристиках устройства. Реальный результат продемонстрировал хоть и ощутимый прирост производительности, но все же не настолько, как при сравнении K600 и K2000. Однако, не стоит забывать, что K4000 обладает большим объемом памяти и это позволяет загружать в нее более комплексные сцены с большим количеством объектов и в тоже время с выставлять более высокое качество настроек Ambient Occlusion.
Модели K4000 потребовалось 0:01:34.45 на визуализацию прохода Ambient Occlusion.

Визуализация Ambient Occlusion GPU на системах с несколькими GPU
Если в вашей рабочей станции несколько GPU, это пойдет только на пользу. Можно спокойно переложить вычисления GPU AO на плечи второго графического ускорителя. Библиотека OptiX полностью поддерживает вычисления на нескольких GPU. При запуске процесса визуализации на multi-GPU системе, процесс будет запущен на свободном GPU.
Пример выполнения вычислений GPU AO в системе с двумя GPU.
Стоит заметить, что активный на данный момент GPU, к которому подключен дисплей, не будет использоваться в процессе визуализации. А проследить за тем, какой конкретно GPU выполняет вычисления, можно с помощью сообщений в Output Window и приложений мониторинга загрузки GPU и других устройств.
На представленном выше изображении визуализацию прохода Ambient Occlusion выполняет NVIDIA Quadro K4000, в то время как за все остальное отвечает K2000.

Как видите, современные CUDA GPU позволяют существенно сократить время визуализации такого ресурсоемкого эффекта как Ambient Occlusion. Сейчас ведется разработка новых инструментов mental ray, которые будут поддерживать вычисления с помощью GPU. В следующем релизе, должна появиться поддержка вычислений Final Gather (Global Illumination) на GPU.

До скорой встречи, ваш dimson3d! :)

Комментариев нет:

Отправить комментарий