Как мы знаем на сегодняшний момент существует всего два ключевых рендера это 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 грамотно выставив источники света все по тому же принципу. При том что в программе нет трассировки, нет настоящего рефлекшена и рефракшена, нет трассировочных теней. На входе использовалась простая геометрия, без материалов, на выходе вот такая красивая картинка.
Свет в экстерьере
С экстерьерами дела обстоят еще проще. Для качественного освещения экстерьера достаточно всего два источника света. Первый будет имитировать рассеянное освещение от окружения второй будет имитировать солнце. Для примера думал что взять город или природу, в итоге подвернулась универсальная сцена где есть и архитектура и растительность, сцена бесплатная от 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 мы потом можем задать в редакторе материалов. В итоге на рендере у нас получается такая картинка
Как видите на рендере получился цветной объект с затемнением и бликами. Стандартный материал на который наложен шейдер имеет 100% самосвечения и отсутствуют блики. Почему шейдер исполнен в виде отдельной карты расскажу в следующем разделе, так он получается гораздо более универсален нежели просто материал.
А теперь в чем плюсы GLSL. Во первых это стандарт для всех шейдеров, включая игровые для OpenGL, а значит имеется большое количество примеров, осталось только не забыть поменять системные переменные. Во вторых для написания шейдеров можно пользоваться Visual Studio. Кроме того существует множество нодовых инструментов для создания таких шейдеров как например MentalMill и аналогичного инструмента от NVidia. А в скором времени такие инструменты будут уже встроены в сам 3DS MAX.
А теперь самое интересное. 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
Не забываем посетить сайт автора www.labeg.ru.
Если вам понравилась статья вы можете помочь распространить ее щелкнув лайк на вашей социальной кнопочке здесь или на сайте автора, а если она принесла вам большую пользу или выгоду, и вы хотите отблагодарить автора, или вдохновить меня на новые еще более интересные статьи вы можете сделать пожертвования. Все собранные деньги пойдут на совершенствование сайта и удовлетворения собственных потребностей. |
Следующие статьи: 1. Rendering в облаке - как не вкладывая ни копейки создать рендер ферму хоть на 100 или 1000 компьютеров, и платить только за ее использования, что иногда даже дешевле чем покупать ферму и точно дешевле большинства коммерческих рендер ферм. 2. Необыкновенный композ во Fusion - Несколько крайне необычных приемов по композу, включая скульптинг в композе и композ в обход рендера в 3д пакете.