Как мы знаем на сегодняшний момент существует всего два ключевых рендера это VRay и Renderman. Совсем недавно существовал еще и mental ray, но он уже 4 года как мертв и не выпускает новых версий, лишь иногда для падания иллюзий жизни приписывает номера не вводя абсолютно никакого функционала, именно поэтому мы его рассматривать не будем. Так вот в этой статье хочу рассмотреть ключевые различия между Vray и Renderman.

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

    А благодаря освобождающемуся полю от mental ray у него это хорошо получается. Сейчас в VRay мы смело пользуемся трассировкой для просчета отражения, преломления, SSS и глобалки. А вот Renderman наоборот, старый рендер, был еще написан в те времена когда компьютеры были крайне слабы и не способны были трассировать ничего вообще, точнее это было очень долго. И для симуляции естественного освещения использовались всевозможные приемы со светом. Прошло уже 25 лет, а Renderman до сих пор работает на тех же принципах, но появились новые очень интересные технологии по симуляции трассировочных эффектов, а вот сама трассировка у Renderman не задалась, хоть она и есть, но работает она крайне медленно. В этом уроке как раз хочется рассмотреть момент, как же сделать красивое освещение не используя глобалку, т.е. так как это делается в Renderman. Так как статья рассчитана на всех и относится к общим принципам, не будет глубокого погружения в технологии и банального передергивания технологий. Принципы возьмем от Renderman, технологии возьмем от VRay. Также эти принципы потом сможете применить в любой другой программе, photoshop, fusion, mudbox и другие. Кроме того без глобалки анимацию гораздо проще посчитать на рендер ферме.

    Свет в интерьере

    Начнем с самого распространенного метода применения VRay – визуализация интерьеров. Пробовать будем на бесплатной сцене от Evermotion (качаем тут). Для начала просто перегоним сцену в нашу версию 3DS MAX и VRay. Самый простой способ сделать это через Merge в новую сцену всего содержания файла, тем самым мы имеем ту же сцену, но с абсолютно чистыми настройками рендера. Теперь остается настроить сцену под себя, для этого я у всех отражающих предметов увеличил семплинг отражения до 32, глобальное освещение стандартное с высокими настройками, гамма в настройках макса 2.2, остальные настройки сделал такими:

    Настройки Рендера

    Настройки Рендера

    После чего рендерим и смотрим что получается при рендеринге с глобальным освещением.

    Рендеринг с глобальным освещением

    Рендеринг с глобальным освещением

    Итого получилась очень симпатичная картинка, на рендеринг которой на моем компьютере ушло 32 минуты. Но при таком подходе рендеринга есть один минус, очень тяжело посчитать анимацию, глобальное освещение при недостаточном уходе как известно шумит, а еще сложнее посчитать если в сцене есть анимированые объекты или персонажи, а совсем уже невероятная задача посчитать такую анимацию на рендер ферме. А как же это делается в Renderman? Для того чтобы проще это понять мы не будем погружаться ни в дебри технологий Renderman, ни в дебри технологий VRay. Рассмотрим на одном из множества вариантов решении этой проблемы, самом простом. А уже потом исходя из этих знаний вы сможете применить более сложные приемы, каждый по своим способностям.

    Помните те времена когда еще объекты освещались простыми тремя источниками света? Нет? Вам сильно повезло! Но применим похожий принцип только для всего интерьера. Уже имеющиеся источники света можно пока выключить, или вовсе удалить, глобальное освещение отключаем. При рендеринге без глобального освещения мы пойдем обратным путем, сначало мы настроим симуляцию глобального освещения, а потом само освещение. Для этого достаточно всего лишь по интерьеру равномерно раскидать простые источники света Omni, на первое время для простоты настройки удобнее копировать через Instance. Источники света по высоте располагать по вкусу, начинать настраивать проще от середины. У меня получилось вот так

    Расположение источников света

    Расположение источников света

    Расположение может быть самым разнообразным, на любой вкус и цвет. Чтобы оценить имеющийся результат сделаем Overid светло серым материалом и отрендерим картинку, должно получиться нечто вроде этого

    Предварительный рендер

    Предварительный рендер

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

    Финальные настройки света

    Финальные настройки света

    Теперь когда мы настроили симуляцию глобального освещения можно выключить Overid материалов, и вернуть источники света на окна. Наконец можно попробовать отсчитать финальную картинку.

    Почти финальный рендер

    Почти финальный рендер

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

    Финальный рендер интерьера

    Финальный рендер интерьера

    Вот и всё. Наш интерьер готов.  И как видите он не чуть не хуже того интерьера что был посчитан с глобальным освещением. Как минус увеличилось время рендера, до 45 минут на моем компьютере. Как плюс теперь мы сможем смело санимировать в этой сцене все что угодно и как угодно, и посчитать без предварительных подготовок, для этого можно просто послать сцену сразу на сотни машин тысячи кадров на рендер ферму. И на выходе у вас не будет абсолютно никакого шума.

    А теперь почему я выбрал этот принцип. Он универсальных для всех 2.5D и 3D программ. Я специально не стал усложнять сложными элементами что бы все могли понять принцип и применить в любой другой программе, и в дальнейшем по мере имеющихся знаний оптимизировать этот принцип для сокращения времени рендера, т.е. можно сделать так чтобы эта же самая сцена считалась в 3 раза быстрее, т.е. 20 минут на моем компьютере. Кроме того это один из основных принципов получения интерьера в Renderman.

    Кольцо отрендереное во Fusion

    Кольцо отрендереное во Fusion, Автор www.derbauer.de

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

    Свет в экстерьере

    С экстерьерами дела обстоят еще проще. Для качественного освещения экстерьера достаточно всего два источника света. Первый будет имитировать рассеянное освещение от окружения второй будет имитировать солнце. Для примера думал что взять город или природу, в итоге подвернулась универсальная сцена где есть и архитектура и растительность, сцена бесплатная от Evermotion (часть 1 и часть 2).

    Для начала также перетаскиваем все в новую чистую сцену и делаем те же настройки что делали в интерьере, так же не забываем перекинуть часть настроек VRay из старой сцены вручную. В этот раз я не стал перебивать семплинг материалов и света на 32, а вместо этого сделал Adaptive DMC min 10 max 50, это гораздо более расточительный к времени рендера способ, но не будем сейчас заморачиваться с этим. Рендерим и смотрим что мы имеем при включеном глобальном освещении.

    Экстерьер с глобальным освещением

    Экстерьер с глобальным освещением

    На рендере получается красивая картинка, на которую мы и будем в дальнейшем ориентироваться. Как я говорил в экстерьере дела обстоят гораздо проще, фактически все что надо сделать в этой сцене это отключить глобальное освещение и сделать его эмуляцию. Для удобства и более легкого понимания отключаем весь свет в сцене, не удаляем, он нам еще пригодится, и выключаем все глобальное освещение. Для эмуляции глобального освещения будем пользоваться VrayLight который будет работать в режиме Dome. В качестве текстуры для источника света будем использовать HDRI который до этого находилась в Environment для симуляции глобального освещения. Для этого просто перетаскиваем ее из окружения на слот текстуры источника света. Рендерим и смотрим получившийся результат.

    Симуляция глобального освещения

    Симуляция глобального освещения

    И как видим этот метод превосходно отработал. Теперь мы имеем симуляцию глобального освещения ничуть не уступающую настоящему глобальному освещению. Осталось сделать небольшие настройки по яркости, семплингу и прочие улудшайзеры на свой вкуси. Что бы подсветить слишком темные места, а заодно и придать определенный цвет картинке можно использовать AmbientLight с небольшими значениями интенсивности света. После всех настроек можно вернуть остальное освещение в сцену и отрендерить ее.

    Экстерьер без глобального освещения

    Экстерьер без глобального освещения

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

    Примечание: Установка Adaptive DMC min 10 max 50 оказалось не лучшим решением, из-за желания упростить пример на настройках материала и света, очень значительно возросло время рендера, с 40 минут до 10 часов. Значительно более выгодным ходом является установка Adaptive DMC min 1 max 4 и персональная настройка семплинга каждого материала и источника света. В таком случае время рендера не превысило бы и 1 часа. Кроме того как видно на картинке немного по другому повели себя листья, но это уже небольшой вопрос к настройкам материала под конкретный тип освещения.

    Написать шейдер VRay

    Кто сказал что для VRay нельзя писать шейдера? На самом деле можно и можно было всегда. Имеющиеся во Vray шейдера охватывают 99% всех необходимых случаев, и даже Pixar в своих последних проектах пошли по принципу VRay, когда пишется один шейдер который охватывает 99% материалов. Но если вы попали в те 1% случаев тогда этот раздел для вас. В Vray 1-ой версии достаточно было открыть лучшую среду разработки Microsoft Visual Studio “затянуть” в него VRay SDK, написать шейдер для VRay на языке C++ и использовать его как угодно. Причем для написания шейдеров нет необходимости учить новый язык программирования, программист может писать на уже давно ему знакомому языке C++. Примеры таких шейдеров имеются во VRay SDK.

    Во 2-ой версии VRay даже эта процедура сильно упростилась. Появилась поддержка шейдеров GLSL. Перед использованием рекомендуется прочитать руководство, потому что VRay GLSL отличается от OpenGL GLSL системными переменными, такие как цвет, координата, нормали и остальные. Для примера привожу код простейшего щейдера с простейшей моделью затемнения и простейшими бликами, пример взят из официального руководства.

    #version 110

    uniform vec4 diffuse_color = vec4(1.0, 1.0, 0.0, 1.0);
    uniform float diffuse_scalar = 0.7;
    uniform vec4 specular_color = vec4(1.0, 1.0, 1.0 ,1.0);
    uniform float specular_scalar = 0.06;
    uniform float diffuse_deviation = 0.5;
    uniform float specular_shininess = 10.0;

    float orennayar_diffuse(vec3 light_dir, vec3 view_dir, vec3 normal) {
    float sigma_sqred = diffuse_deviation * diffuse_deviation;
    float A = 1.0 – (sigma_sqred / (2.0 * (sigma_sqred + 0.33)));
    float B = (0.45 * sigma_sqred) / (sigma_sqred + 0.09);
    float cosThetaI = dot(light_dir, normal);
    float cosThetaO = -dot(view_dir, normal);
    float sinThetaI = sqrt(max(0.0, 1.0 – (cosThetaI * cosThetaI)));
    float sinThetaO = sqrt(max(0.0, 1.0 – (cosThetaO * cosThetaO)));
    float cosPhiI = dot(light_dir, vr_TexTangent);
    float cosPhiO = -dot(view_dir, vr_TexTangent);
    float sinPhiI = sqrt(max(0.0, 1.0 – (cosPhiI * cosPhiI)));
    float sinPhiO = sqrt(max(0.0, 1.0 – (cosPhiO * cosPhiO)));
    float temp = max(0.0, (cosPhiI * cosPhiO) + (sinPhiI * sinPhiO));
    float sinAlpha;
    float tanBeta;
    if (cosThetaI > cosThetaO) {
    sinAlpha = sinThetaO;
    tanBeta = (sinThetaI / cosThetaI);
    }
    else {
    sinAlpha = sinThetaI;
    tanBeta = (sinThetaO / cosThetaO);
    }
    float result = (A + (B * temp * sinAlpha * tanBeta));
    return clamp(result, 0.0, 1.0);
    }

    float phong_specular(vec3 light_dir, vec3 view_dir, vec3 normal) {
    vec3 reflection = reflect(view_dir, normal);
    float cos_rl = clamp(dot(reflection, light_dir), 0.0, 1.0);
    return (pow(cos_rl, specular_shininess) * (specular_shininess + 2.0));
    }

    void main() {

    vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;

    vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);
    vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);

    vec4 diffuse_contrib = vec4(vec3(diffuse_color) * diffuse_scalar, 1.0);
    vec4 specular_contrib = vec4(vec3(specular_color) * specular_scalar, 1.0);

    vec4 temp = diffuse_contrib + specular_contrib;
    float max_color_component = max(max(temp.r,temp.g),temp.b);
    if (max_color_component > 1.0) {
    diffuse_contrib.rgb /= max_color_component;
    specular_contrib.rgb /= max_color_component;
    }

    vec3 view_dir = vr_Direction;

    vr_LightIterator lightIter;
    for(int i = 0; i < vr_NumLights; ++i) { vr_evalLight(i, vr_Position, normal, lightIter); float cos_nl = clamp(lightIter.dot_nl, 0.0, 1.0); if (cos_nl > 0.0) {
    float diffuse_term = orennayar_diffuse(lightIter.direction, view_dir, normal);
    diffuse += vec4(vec3(diffuse_term * cos_nl) * lightIter.contribution, 0.0);
    float specular_term = phong_specular(lightIter.direction, view_dir, normal);
    specular += vec4(vec3(specular_term * cos_nl) * lightIter.contribution, 0.0);
    }
    }

    diffuse *= diffuse_contrib;
    specular *= specular_contrib;

    vec3 gi_contrib = vr_irradiance(normal, 1.0);
    diffuse += vec4(vec3(diffuse_contrib) * gi_contrib, 0.0);

    gl_FragColor = diffuse + specular;
    }

    Все переменные которые объявляются через Uniform мы потом можем задать в редакторе материалов. В итоге на рендере у нас получается такая картинка

    Работа GLSL шейдера

    Работа GLSL шейдера

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

    А теперь в чем плюсы GLSL. Во первых это стандарт для всех шейдеров, включая игровые для OpenGL, а значит имеется большое количество примеров, осталось только не забыть поменять системные переменные. Во вторых для написания шейдеров можно пользоваться Visual Studio. Кроме того существует множество нодовых инструментов для создания таких шейдеров как например MentalMill и аналогичного инструмента от NVidia. А в скором времени такие инструменты будут уже встроены в сам 3DS MAX.

    Mental mill

    Mental mill

    А теперь самое интересное. Renderman Shading Language использует тот же самый С подобный язык для шейдеров, за исключением опять же системных переменных и элементов синтаксиса, C отличается от C++. И фактически абсолютно любой шейдер из рендермана можно элементарно переделать в шейдер VRay, достаточно поменять несколько переменных и местами поменять синтаксис. Естественно это действует и в обратном направлении. В принципе эту процедуру можно реализовать даже в автоматическом режиме.

    Выгнать нужный слой VRay

    В этом плане у VRay опять же все просто превосходно по сравнению с Renderman. Главная фишка чем гордятся люди рендерящие в Renderman заключается в том что на объект можно повесить любой параметр, а потом это параметр выгнать в отдельный слой, т.е. в слой можно вытащить все что захочется.  На самом деле в VRay имеется тоже самое и даже больше. Что касается вытащить чего угодно в отдельный слой во VRay это реализуется через слой VRayExtraTex. Например необходимо отрендерить одну и туже картинку, но неизвестно какая из трех-шести текстур будет применена позже или необходимо иметь несколько независимых текстур на одном и том же объекте, для этого вешаете несколько слоев VRayExtraTex и на каждый вешается своя текстура, в итоге у вас в каждом слое на объекте будет своя текстура, и все это за один проход, практически не увеличивая время рендера. Так же в VRayExtraTex можно вытащить к примеру карту VrayDirt и тогда у нас в отдельном слое будет AO.

    Настройка слоев

    Настройка слоев

     А теперь что касается вытащить в отдельный слой чего нибудь необычного. К примеру можно взять свой сложный материал и любую его часть вытащить в отдельный слой или например что если вы опять попали в тот 1% случаев и вы хотите вытащить то чего нет, тут опять же прибегаем к помощи уже готового самописного шейдера GLSL, его тоже можно вытащить в отдельный слой, а внутри этого шейдера может находиться все что вам туда захотелось запихнуть. Именно поэтому шейдера лучше писать в виде отдельных карт, а не материалов, так вы сможете достич максимальной производительности и отпадает необходимость считать один и тот же слой, например нет никакой необходимости считать одни и те же тени или блики два раза.

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

    Полученые слои за один проход

    Полученые слои за один проход

    Например можно освещение от каждого источника света, в т.ч. глобальное, сохранить в отдельный слой. А потом уже на композе решить яркость и цвет персонально для каждого источника света. В том числе возможны такие варианты когда рендерится одна полностью освещенная сцена с внутренним и внешнем светом, а уже на композе решается будет это день или ночь, утро или вечер. И все это практически не увеличивая время рендера, а вот рендерману для каждого такого слоя понадобится +50% к времени рендера с каждого источника света. Кроме того существует еще одна возможность вытащить слой, написать его самостоятельно через VRay SDK. В таком случае туда еще проще вытащить самые невероятные вещи, например я встречал такие случаи когда в слой вытаскивают параметры и анимация камер, освещения, всякие вспомогательные параметры, а потом в композе воспроизводят параметры 3D сцены через этот слой. Или например можно вывести схему плотности текстур, чтобы видеть где текстура недостаточно детальная и при увеличении она может размазаться, или слой в котором будет указано время рендера каждого пикселя, для оптимизации проблемных материалов и настроек.

    Итог

    Статья получилась хоть и большая, но это всего лишь отправная точка для того чтобы более активно применять принципы Renderman в других программах. Я не призываю совсем отказаться от принципов VRay, но кажется большинство забыло с чего все начиналось и теперь испытывают определенные трудности в работе. Кроме того эта статья показывает что между Renderman и Vray не такая уж и большая разница, как о ней любят некоторые рассказывать, фактически она сводится к тому что в Renderman очень медленная трассировка, и чтобы как то нивелировать этот эффект изобретается много обходных технологий, которыми вполне благополучно можно воспользоваться и в других программах где также нет трассировки, например композ. А мы уже можем активно пользоваться этими технологиями. Надеюсь эта статья поможет многим людям справится с имеющимися трудностями и вдохновит их на новые подвиги.

    Happy END

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




    5th Апрель 2012 Главная, Статьи

    4 Responses to Рендеринг на VRay на принципах Renderman

      Статья, мягко скажем предвзятая. Про рендерман, его особенности вообще нет ни слова. Про ментал, что он умер – не верно! Да он развивается плохо, инвидиа его не хочет развивать, но это не означает что он умер. На сегодня он по прежнему остается самым популярным рендером в мире, благодаря тому, что это рендер для практически всего софта (тут надо понимать 3D тройку макс, майка и ксюха, которые занимают почти 90% рынка) прямо из коробки. Про то что вирей позволяет выводить кастомные пасы – тоже не верно, это как раз основная проблемма вирея – у него с кастомными пасами весьма плохо, в отличие от рейс рендеров (рендермана и прочих). По всей видимости автор мало сталкивался с выводим кастомных пасов, ограничаваясь только плотностью текстур. Для большого компоузинга это вообще недостаточно! А стандартные пасы (дифузы и прочее) сейчас практически все выводят более или мене внятно. Нет ни слова про работу рейс рендеров с просто безумным количеством геометрии, которое вирее и многие другие не тянут. Еще один важный момент это стабильность рендера, то есть получение одной и тей-же картинки на выхлопе. Здесь вирей с его методами просчета глобалки просто даже нельзя сравнивать с рейс рендерами. Потом автор забывает про то что у виреея самая худшая альясинг фильтрация, наверно из всего что есть на рынке, это не критично но может очень мешать. И наконец очень проблемное написание собственный шейдеров, то что автор приводит как пример – это баловство а не шейдер, реально пишутся совершенно другие вещи для работы. Рендеры разные рейс и рейтрейсеры, это сравнение вообще не корректно, скорее это статья из серии – “все на магз!”.

        LabEG

        У вас много неверной информации о врее, может быть с версией 6 летний давности по некоторым моментам я и соглашусь, но сейчас все совсем по другому. На сайте 3dcenter.ru нашлись смелые рендерманщики которые решили на деле, а не на словах, доказать разницу. На практике оказалось что никто из них не смог отрендерить 3 млрд. полигонов, не говоря уже о 3 трлн., рендерили огромные лесные массивы. Там же было показано что все задачи по выводу любых пасов выполняются точно также как и в рендермане. Ну и доф, дисплейс, моушен блюр и все остальные тесты VRAY не проиграл, как правило на равных все было.

      Армен

      Вот спасибо! Актуальная информация, как раз кстати.
      А как быть с Unbiased GPU-рендерами? Так не хочется ждать по часу (а то и более) на кадр анимации, когда нужно сделать ролик длительностью в 60 секунд…

      Как быть? Тут только render farms спасут?

        LabEG

        На моей практике получается что пользоваться рейтрейс рендером намного выгоднее чем анбиасед рендером. Тем более что изобретены они были не вчера. Максвелл существует уже много лет, но все равно пока остается уделом энтузиастов. В скором времени когда компы станут достаточно мощными все конечно перейдут на анбиасед, но пока приходится довольствоваться только тем что есть.

    Leave a Reply