суббота, 5 апреля 2014 г.

Nvidia в теме или Mental Ray GPU Final Gathering


Рывок в области вычислений при помощи GPU сделал графические ускорители очень привлекательными для ускорения типичных, требовательных к ресурсам эффектов. Вовлечение графических ускорителей в эту область позволило вместо техник, связанных с использованием кэширования и интерполяции данных, запускать полную и точную симуляцию. В расчете непрямого освещения в сцене режим GI GPU использует графические карты Nvidia для вычислений трассировки луча в режиме брутфорс. Результат вычислений автоматически совмещается с основной визуализацией, выполняемой при помощи ЦП. Такой подход предоставляет полную совместимость с существующими шейдерами, что не требует их изменений для использования с новым алгоритмом вычисления глобального освещения.


В текущей версии режим GI GPU просчитывает только диффузные переотражения, что собственно, Final Gathering обычно и делает. По сути, если этот режим просто включен без изменений его параметров, то для достижения того же качества визуализации используются настройки свитка Final Gathering. Если в сцене нет значимых объектов, вроде зеркал или прозрачных стекол в окнах, то для этих сцен лучше всего подойдет режим diffuse.



Режим GI GPU в 3ds Max включается и контролируется с помощью команд String Options.

"gi gpu" on

Включает GI GPU для ускорения просчета непрямого освещения через диффузное переотражение света, схожее по своим принципам с тем как это делает final gathering. Основные значения берутся из настроек свитка Final Gathering до тех пор, пока они не заменены настройками GI GPU которые описаны ниже. Этот режим поддерживает все основные шейдеры. Команда "gi gpu" on просчитывает все виды переотражений, включая отражение и прозрачность. При этом используется гибридное сочетание ЦП+ГПУ.

По умолчанию "gi gpu" off



"gi gpu" "diffuse"

Эта команда предполагает только диффузные переотражения, не распространяя этот эффект при прохождении лучей сквозь прозрачные объекты, а также когда лучи отражаются от глянцевых поверхностей, что может быть важным во многих случаях. Этот режим намного быстрее, так как может просчитываться только на ГПУ избегая частого прерывания процессором. Если включен один из режимов, но не было обнаружено необходимого графического ускорителя, то эти расчеты переносятся на процессор для достижения идентичных результатов. Однако, процесс вычисления может занять намного больше времени в зависимости от производительности процессора.


"gi gpu rays" целое число

Устанавливает количество вторичных лучей для GI GPU умноженное на количество проходов (см след. команду). Окончательное кол-во лучей для просчета будет равно количеству вторичных лучей, умноженное на количество проходов. Эта команда отвечает за общий уровень шума и детализации финального изображения: большее количество лучей увеличивает детализацию и уменьшает шум. Включение фильтра GI GPU увеличивает влияние на финальное изображение (см. ниже). Если эта команда отсутствует, или установлена как "gi gpu rays" -1, то настройки для расчета будут браться из значений Rays per FG Point свитка Final Gathering и Maximum Samples свитка Sampling Quality.

По умолчанию "gi gpu rays" -1


"gi gpu passes" целое число


Устанавливает количество проходов для GI GPU и отвечает за качество антиалайзинга. Каждый проход генерирует точно такое же количиство лучей, где общее количество генерируемых лучей равно количеству вторичных лучей умноженное на количество проходов. Значения в виде квадратного числа, таких как 4, 9 или 16 предпочтительней для достижения наилучшего результата. Минимум возможен один проход. Если эта команда отсутствует, или установлена как "gi gpu passes" -1, то настройки для расчета будут браться из значений выбранного сэмплера.



По умолчанию "gi gpu passes" -1


"gi gpu filter" целое число

Устанавливает размер фильтра для GI GPU. Этот фильтр используется для фильтрации сэмплирования поверхностной плотности потока излучения (irradiance samples). Это способствует снижению шума, но также может размывать тени. Вводимые значения, т.е. масштаб фильтра используется в "плоскости экрана" а не в пространстве. Если эта команда отсутствует, или установлена как "gi gpu filter" -1, то настройки для расчета будут браться из значений Initial FG Point Density свитка Final Gathering.

По умолчанию "gi gpu filter" -1



"gi gpu depth" целое число

Устанавливает максимальный лимит трассировки луча для непрямого освещения при использовании GI GPU. Если эта команда отсутствует, или установлена как "gi gpu depth" -1, то настройки для расчета будут браться из значений Trace Depth свитка Final Gathering.

По умолчанию "gi gpu depth" -1


"gi gpu presample density" десятичное число

Контролирует качество предварительного сэмплинга GI GPU. Устанавливает плотность точек для семплирования в "плоскости экрана". Используется для активации шейдеров и сеэмплирования их участия в процессе визуализации для дальнейшей обработки при помощи ГПУ. Большие значения увеличивают детализацию в ущерб затраченному времени. Значение 1 означает предварительное сэмплирование каждого пикселя. При значении 0.5 предварительно сэмплируется каждый второй пиксель и т.д. Если эта опция не представлена, настройки для расчета будут браться из значений по умолчанию которое равно 0.2 .


"gi gpu presample depth" целое число
Контролирует качество предварительного сэмплинга GI GPU. Устанавливает максимальный лимит трассировки луча во время предварительного сэмплинга. В большинстве случаев, значение по умолчанию будет приемлемым.

По умолчанию "gi gpu presample depth" 2


ОГРАНИЧЕНИЯ ПО ПАМЯТИ


Для использования в расчетах графических ускорителей, весь проект должен вмещаться в памяти каждой ГПУ. Это означает, что ГПУ с наименьшим количеством видеопамяти будет устанавливать лимит используемой памяти в многокарточной системе (видеокарты для участия в расчетах могут быть выбраны в ручную).

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

Объем памяти которая израсходуется на геометрию сцены зависит от количества треугольников в ней. Итоговое количество треугольников, означает количество треугольников используемых для финальной визуализации. Другими словами, учитываются треугольники сгенерированые смещением (displacment) или треугольники сгенерированные другим методом, например при использовании меха. Один треугольник примерно равен 196 байтам. Из этого следует, что сцена с 20 000 000 треугольников тебует для обработки геометрии 3,9 Гб видеопамяти, 5 000 000 уложатся в 980 Мб.

В текущей версии (mental ray 3.12.1.11) существует также максимально возможный лимит в размере 25 000 000 треугольников. Поэтому даже если видеокарта обладает памятью превышающей 5 Гб, сцены с большим количеством полигонов не будут визуализироваться используя ГПУ. Стоит отметить, что в следующей версии лимит будет упразднен.

Предварительно сэмплированные данные шейдера зависят от разрешения финального изображения и плотности предварительного семплирования (команда Sttring Options "gi gpu presample density" десятичное число), а также глубины предварительного сэмплирования (команда Sttring Options "gi gpu presample depth" целое число). Верхняя граница равна 188 байтам на пиксель при плотности равной 1 и глубине равной 2. Это значение может масштабироваться значениями плотности и глубины для расчета необходимого количества байтов. Обратите внимание что верхняя граница в 188 байтов обычно не будет достигнута, когда луч достигает окружающей среды (Environment), например в сценах не полностью закрытых геометрией. Например, изображение с разрешением 1920х1080 имеет 2073600 пикселей. С плотностью предварительного сэмплирования, равной 0.6, данным шейдеров будет необходимо почти 233 Мб. При плотности 1 необходимо 388 Мб и при плотности 2 нам понадобится 777МБ.

Постоянная величина буферной памяти в этой версии около 200 МБ.

В итоге, для сцены с разрешением 1920х1080, плотностью предварительного сэмплирования равной 0.6, и 5 000 000 треугольников нам понадобится 218 Мб + 980 МБ + 200 Мб = 1.4 Гб видеопамяти.

ФАКТОР ПРОИЗВОДИТЕЛЬНОСТИ

Так как плагин gi-gpu использует ГПУ для расчетов только определенной части глобального освещения, то фактор производительности зачастую зависит от вычислений проделываемых процессором в ядре mental ray (GI в отражениях).  Плагин gi-gpu работает паралельно с ядром mental ray и в большинстве случаев первым заканчивает свои вычисления. Именно поэтому не будет увеличения производительности при подключении дополнительных графических ускорителей, так как время визуализации будет зависеть от расчетов проделываемых центральным процессором.

ТЕКУЩИЕ ОГРАНИЧЕНИЯ (mental ray 3.12.1.11)


  • GI GPU требует включения Final Gather. Если Final Gather отключен, GI GPU может быть включен, но результат расчетов не используется.
  • Отсутствует поддержка шейдеров линзовых искажений (distorting lens shader), при этом контроль экспозиции в линзовых шейдерах работает.
  • Отсутствует поддержка Motion Blur.
  • Отсутствует поддержка частиц.
  • Отсутствует поддержка шейдеров объема (volume shaders)
  • Ограниченная поддержка волос
  • Геометрия должна вмещаться в видеопамять (рекомендуется более 1 Гб). Нет отката расчетов на процессор если объем данных превышает объем видеопамяти.
  • Отсутствует поддержка clipping planes.
  • Ограниченная/Отсутствует поддержка для шейдеров подповерхностного рассеивания.
  • Ограниченная поддержка самосветящихся материалов (например A&D материал с добавленным цветом. Самосветящиеся материалы работают до тех пор пока излучение одинаково для всех типов лучей и не предусматривает каких либо специальных поведений. Другими словами работают только диффузные, непрозрачные самосветы. Текстура в качестве источнака света также работает).
  • При использовании GI GPU, глобальное освещение методом фотонных карт отключается о чем сообщается в окне Render Message Window.
  •  GI GPU не может использоваться с irradiance particles, так же не возможно использовать. FG управляемое импортонами (GI GPU+FG+IPs), о чем сообщается в окне Render Message Window.
  • GI GPU не может использоваться c mr progressive rendering.
  • Отсутствует поддержка шейдеров cutout.


РЕКОМЕНДАЦИИ


  • Рекомендуется установить последнюю версию драйверов NVIDIA.
  • Для достижения максимальной производительности GI GPU рекомендуется использовать в режиме интерполированного FG, а не fg force (подробнее см. тесты).
ТЕСТЫ

Так как GI GPU проводит расчеты в режиме bruteforce, то мы будем сравнивать GI GPU и fg force mode. В тестовой сцене, для усложнения задачи в качестве источников света выступают разноцветные самосветящиеся материалы Arch&Design.

диффузная сцена

GI GPU

Время рендеринга 0:02:03

Для рендеринга этой сцены использовался режим "diffuse" и для расчета ГИ использовалась лишь ГПУ. Предварительное сэмплирование производилось в каждом пикселе (значение "presample density" 1). Для расчета ГИ использовалось 256 лучей (4*64). Так же отключена интерполяция, отключен фильтр Noise Speckle Reduction, и не использовался gi gpu filter.


FG FORCE MODE

Время рендеринга 0:29:44

Как видим, изображения идентичные. Падение производительности более чем в 15 раз.


GI GPU + gi gpu filter

Время рендеринга 0:03:02

Для рендеринга этой сцены был добавлен фильтр со значением, равным 20, с помощью команды String Options "gi gpu filter" 20. Качественная фильтрация не доступна для режима fg force mode. Режим fg force mode очень чувствителен к фильтру Noise Speckle Reduction свитка Final Gathering.


GI GPU + gi gpu filter VS GI GPU + Initial FG Point Density+interpolation

Не смотря на то, что при отсутствии команды "gi gpu filter" целое число или при значении "gi gpu filter" -1, настройки для расчета будут браться из значений Initial FG Point Density свитка Final Gathering, я все же рекомендую использовать gi gpu filter. Это связано с тем что gi gpu фильтрация и интерполяция начальных точек FG используют разные алгоритмы и gi gpu filter дает лучшие результаты.
В следующем тесте я понизил количество лучей до 16 для наглядности результата.

GI GPU + "gi gpu filter"  30

GI GPU + Initial FG Point Density+interpolation 30


Сцена с отражениями и прозрачными объектами - максимальное преимущество не в производительности, а в качестве.

При включенной команде "gi gpu" on расчет глобального освещения алгоритмом Final Gathering происходит в гибридном режиме. Диффузные переотражения просчитываются на ГПУ параллельно расчетам в прозрачных и отражающих поверхностях, которые проделывает центральный процессор. Так как производительность современных графических ускорителей в разы выше чем у центральных процессоров, то это позволяет нам использовать разные настройки для двух алгоритмов для получения высокого качества финального изображения. Рассмотрим настройку алгоритмов на следующем примере:




Это изображение было визуализировано со следующими настройками для двух  алгоритмов. Время визуализации составило 1:24:16.



Обратите внимание на потолок, особенно на места стыковки балок, а также на их нижнюю часть. Насколько реалистично выглядит светотень. И это при том что источником света для неона выступает геометрия с самосветящимся материалом! 

Как было достигнуто такое качество? 

Смысл заключается в том, что диффузные переотражения рассчитывались в режиме Brute Force для каждого пикселя ("gi gpu presample density" 1), задействуя при этом 4096 лучей ("gi gpu rays" 4 * "gi gpu passes" 1024 = 4096). Также я добавил gpu filter, благодоря которому произошло сглаживание между 4 соседними пикселями, что устранило легкий шум. Справедливости ради, хочу заметить, что обладатели топовых карт с 4ГБ памяти и более могут увеличить количество проходов до 4096 и получить чистое изображение без применения фильтра. Глобальное освещение в прозрачных и отражающих объектах, рассчитывалось с помощью интерполированного FG используя пресет Medium с величиной интерполяции равной 100. Такой подход дает большое преимущество, так как площадь зеркальных и стеклянных поверхностей в проектах  обычно относительно небольшая, а остальные поверхности имеют размытые отражения, которые скрывают недостатки интерполяции. В итоге самую важную часть - диффузные переотражения мы рассчитываем на скоростном ГПУ в режиме brute force, в то время, как уступающий в скорости процессор рассчитывает переотражения в прозрачных и отражающих поверхностях более быстрым методом интерполированого FG.

Для сравнения ниже приведен тот же пример, визуализированный с помощью пресета Medium и увеличенной до 100 интерполяцией. Время визуализации 2:11:39


Как видим, данное изображение уступает не только во времени, но и очень сильно в качестве глобального освещения.

На заметку

Возможно вы обратили внимание, что в последнем примере я использовал большое количество проходов, при малом количестве лучей. Такой подход хоть и увеличивает время которое затрачивает ГПУ на расчет, но дает наилучший результат, так как каждый новый проход направляет лучи в наиболее необходимые места. В итоге, при использовании "gi gpu rays" 4 + "gi gpu passes" 1024 даст намного более качественный результат, чем "gi gpu rays" 64 + "gi gpu passes" 64. Хотя в обоих случаях итоговое количество лучей будет равно 4096.


Happy renderings! Enjoy!

3 комментария: