Знакомство с Gelato как системой рендеринга

Вступление.

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

Так же на сайте Nvidia есть несколько видео уроков.

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

Одно из отличий этого рендера в том, что он должен работать быстрее использую GPU. Не уверен что он его использует на моей видеокарте 7800GT, по этому просто поэкспериментирую что он может не заостряя на этом внимание.

Использовать будем NVIDIA-Gelato-WinNT-x86-2.1R1-pkg и maya 8.5.

Так как мы будем использовать Maya то помимо самого gelato нужен plugin-экспортер, он ставится вместе с установкой самого рендера. Для maya он называется mango, для max-а amaretto.

После установки можно заметить, что у нас появилось несколько дополнительных переменных окружения:

GELATOHOME=C:\Program Files\NVIDIA Corporation\Gelato

MANGOHOME=%GELATOHOME%\mango\maya8.5

Соответственно это путь к папке самого рендера и путь к Маевскому плугину.

И так же он дописал пути к плугину и скриптам к Маевским переменным соответствующей версии, чтобы мая могла их использовать:

MAYA_PLUG_IN_PATH=%MANGOHOME%\plug-ins; и т.д.

MAYA_SCRIPT_PATH= %MANGOHOME%\scripts; и т.д.

Следовательно, перенастраивая эти переменные, возможно, загружать (или не загружать) рендер для различных версий maya.

После установки в папке с ярлыками появиться иконка CheckGelato, с помощью нее можно проверить заработает ли рендер. На 7800GT после проверки пишется Gelato checking succeeded..., а вот на 6600GT SLI hardware problem.

Так же можно позапускать примеры расположенные в различных папках …\Gelato\examples\... (запускать следует *.bat файлы). Там содержатся примеры, как для майи (в папках mango-*) так и для gelato отдельно (*.pyg файлы, в некотором роде аналог, например mi-файлов MentalRay-я). Есть несколько примеров для Gelato API.

Теперь можно запускать maya и смотреть, как все это работает.


Ambient Occlusion

Майские шейдеры GelatoRender автоматически заменяет своими. Их можно найти в папке …\Gelato\mango\maya8.5\shaders\. Что поддерживается, а что нет, описано в документации. Исследовать их не очень интересно, поэтому рассмотрим, как реализована такая популярная и полезная вещь как ambient occlusion.

В качестве сцены создадим кубик с удаленными 3-мя сторонами и шарик (с мягкими ребрами!), прижатый к одному из получившихся углов.

Первое что находим это наличие в настройках рендера самой последнего раскрывающегося списка outputs elements. В котором перечислены различные render pass-ы. Снимаем галку beauty, ставим ambient occlusion (в дальнейшем AO). Теперь при рендере все материалы заменятся на AO, а настройки для него можно будет задавать в раскрывающемся списке «Ambient Occlusion» в настройках рендера.

Сразу предполагаем что потребуется raytracing, его можно включить в разделе Raytracing Quality.

Рендерим. Картинка получилась довольно страшная. Увеличение AO rays конечно помогает, но по швам видны белые линии, обратите внимание.

Значение всех параметров хорошо рассмотрено в Gelato Shader Library Documentation. Там все изложено с картинками, поэтому не буду сильно повторяться, кратко приведу несколько тестов, и опишу основные.


AmbientOcclusionRays=256, MaxError=0




AmbientOcclusionRays=256, MaxError=0.28




AmbientOcclusionRays=64, MaxError=0




AmbientOcclusionRays=64, MaxError=0.28



AmbientOcclusionRays – Количество испускаемых лучей, влияет на качество картинки.

MaxError – При выпуске каждого следующего луча значение яркости точки уточняется и если оно меняется меньше чем на это указанное значение то считается что дальнейшие лучи выпускать не требуется.

MaxHitDist – Максимальное расстояние на котором объекты еще могут затенить точку. Параметр просто необходим для замкнутых помещений.

Bias – объект ближе чем заданное значение игнорируется. (т.е. что-то типа MaxHitDist с низу, он то и поможет избавиться от белых швов).

Все что относится к falloff это соответственно затухание, тип и сила.

Все значения идущие дальше не оказали влияния на картинку.

Так как я пользуюсь MentalRay то искал параметр, который бы задавал угол в котором бы испускались лучи и который бы соответственно регулировал жесткость тени. Но не нашел.

Кроме ambient occlusion можно посчитать reflection occlusion pass. Обратите внимание, что угол задается в радианах.



Теперь попробуем назначить AO в качестве шейдера.

Включим beauty pass. Назначим на все объекты lambert2, откроем его в attribute editor-е, в закладке Gelato/override shader поставим галку Use Override Shader и ткнув на папочку справа от Shader Name выберем ambocclude. У меня он находится вторым в списке шейдеров Gelato (а не Mango).

Заполним все уже известные параметры. После рендера все белое, т.е. геометрия не затеняет друг друга. Как я понимаю, не хватает geometry set-а. Как его сделать я не нашел.

Зато если сделать Ambient Light и в его настройках поставить галку use occlusion, то AO начинает работать. Причем настраивается он уже в каждом материале отдельно. Так же если галка use occlusion установлена, то даже если источник не добавлен в maya render layer, то AO все равно считается. (Возможно, в качестве geometry set берутся объекты, связанные со светом light linker-ами, но это необоснованное предположение).

Эту зависимость я до конца не успел понять, но пользоваться можно, и довольно успешно.


Subsurface Scattering.

В примерах есть хорошая сцена с рыбками, демонстрирующая работу sss.

А в видео-уроках есть пример с настройками. Но как обычно сразу эффект не виден и появляется сомнение работает ли это вообще.



Для эксперемента я создал куб, сделав его потоньше с одной из сторон. Позади него шар. И directional light в направлении из-за шара к камере. Включил у него raytraced shadows. Так же в настройках рендера надо не забыть включить Enable Raytracing в закладке Raytracing Quality.

На куб я назначил другой материал – lambert2 например и включил на нем галку Subsurface Scattering. При этом к материалу добавляется свойства SSS, но основные параметры самого материала (lambert) так же продолжают работать.



Рассмотрим параметры sss.



Intensity – делает эффект sss более ярким. Я сделал для начала его равным 3-м



Scattering Color – указывает величину рассеивания. И так как задается в rgb то для каждой составляющей цвета. По-моему наиболее сложно подбираемая величина.


результат рендера с красным Scattering Color



Absorbtion Color – коэффициент поглощения света. Если используется источник света с белым светом (а Scattring Color так же белый) то можно легко предсказать какой свет пройдет сквозь объект. Если вы например указали что поглощаться должен желтый свет, то на выходе у вас будет синий. Это сразу можно увидеть в маевском Color Chooser


Color Chooser


результат рендера




Параметр Eta – задает индекс преломления материала (исходя из документации для большинства материалов 1.3 - 1.5). Но если использовать значение близкое к 1 – например 1.01 то картинка становиться более контрастной и хорошо становиться различим силуэт объекта позади куба (шара).



Max Solid Angle – влияет на погрешность вычислений. Чем больше, тем быстрее, но хуже результат, чем меньше, тем соответственно качественнее и дольше.


Max Solid Angle = 0.3


Max Solid Angle = 1.0 Видимый вертикальный градиент справа это не погрешность jpeg.



Subsurface Color – Позволяет задать свет sss. Но этот параметр не является физически правильным и просто позволяет скорректировать цвет sss. Для физической корректности следует использовать Scattring Color и Absorbtion Color (хотя это и сложнее). А этот свет установить просто в белый чтобы он не влиял на картинку. Соответственно если сделать его черным то результат у вас всегда будет черным как бы вы не старались.

Или вы можете установить белыми остальные цвета и пользоваться только этим задавая оттенок sss.



Scale – Позволяет дополнительно манипулировать толщиной объекта. Увеличение этого значение делает объект как бы толще.



Расчет происходит в 2 захода. Первый считает файл диффузного освещения diffuse.sdb – видимо это карта освещенности объекта с обратной стороны.




Сцена с цветами



Теперь я попробую получить картинку поля, с цветами, чтобы было, что поставить в шапку статьи, пользуясь только gelato render-ом. В поле у нас будут только ромашки. Причем лепестки будут просвечиваться sss. Будет летать бабочка с motion blur на крыльях.

Т.к. я не художник результат довольно страшненький.

Сразу скажу, что ambient occlusion в этой сцене я не успел получить т.к. на лепестках стали появляться непонятные черные точки. Проблема так же возникла с альфа-каналом в AO, но в принципе это можно решить при композинге и взять его из слоя color. Так же при попытке посчитать глубину картинка никак не хотела сохраняться в формат которые бы прочитать другие программы, хотя она была помечена как tif. В результате оставил только color, т.к. решать остальные проблемы не было времени.

Есть субъективное ощущение, что сцена считалась излишне долго. Так же при использовании рендера постоянно возникали странные проблемы с интерфейсом. Есть ощущение что до конца не все отлажено в плане интеграции в maya.

Но вообще возможности и реализация некоторых вещей в gelato понравилось.


Простейший шейдер

Попробуем воспользоваться документацией (в поставке есть pdf с описанием языка шейдеров) и примерами шейдеров (вместе с gelato есть исходный код шейдеров - *.gsl фалы) и написать свой простейший шейдер. Буду приводить сразу готовый текст программы и потом разбирать что в нем делается.

Компилируется шейдер в файл имеющий расширение *.gso с помощью утилиты gslc.exe находящейся в папке bin. Достаточно просто выполнить команду «gslc. exe test_shader.gsl» а получившийся шейдер «test_shader.gso» скопировать в папку где находятся шейдера, т.е.

$MANGOHOME/shaders:$GELATOHOME/shaders

//test_shader.gsl
surface test_shader
[[ string description = "Test Shader" ]]
(
color colorin = 0.5
[[ string description = "Input: test input" ]]
)
{
C = colorin*random();
}

Создадим сцену с простейшим шариком и назначим на него
Если указать в шейдере красный цвет то получится следующая картинка.

test_shader.gso

Итак, что мы делаем.
Эти строчки описывают название шейдера «test_shader», его принадлежность «surface» и его описание.
surface test_shader
[[ string description = "Test Shader" ]]
Эти строчки описывают задаваемый параметр (атрибут) типа color, его значение по умолчанию и опять же его описание.
(
color colorin = 0.5
[[ string description = "Input: test input" ]]
)
И наконец само вычисление цвета в точках выглядит так
{
C = colorin*random();
}
где colorin – это задаваемый нами цвет, а random() – функция возвращающая случайное число от 0 до 1 (за счет нее мы и имеем крапинки на картинке). Если убрать random() то у нас получится некий аналог майского surface shader, его можно использовать для получения масок.

196 0 850 8
2
2007-05-16
Яросная борьба за 7950GX2 :)
2007-05-17
Поздравляю с призом)
RENDER.RU