Решение проблемы «гранёных» поверхностей в Cycles Blender. Terminator problem
2014-12-11 15:10:00
+ развернуть текст сохранённая копия
Проблема эта возникала у меня уже давно и решение я тоже нашёл давно, но с написанием статьи на эту тему я очень сильно затянул.
Когда изучал рендеринг в Cycles, то столкнулся с одной проблемой. Моя модель получалась «гранёной», будто бы я забыл применить шейдинг Smooth. Но режим шейдинга был включён. Однако модель всё равно рендерилась таким образом, что видны были грани. Проанализировав проблему, я заметил, что возникает этот дефект на границе светотени. Именно в области где освещённая часть переходит в неосвещённую. Вся остальная часть модели, которая освещена или которая не освещена выглядит сглаженной.
Пока есть несколько выходов из ситуации. Первый заключается в том, чтобы подобрать положение объекта и ракурс так, чтобы дефект был заметен как можно меньше. Согласитесь, это не всегда приемлемо. Второй способ – использовать рассеянное освещение. Это тоже не всегда подходит. Третий способ, на мой взгляд наиболее универсален, но может быть чуть более ресурсоёмким. Он заключается в увеличении итераций сабсёрф модификатора. В разделе
Subdivisions в поле
Render поставьте значение 2 (оно там по умолчанию уже стоит) или больше. Иногда хватает даже одной итерации. Если не хотите, чтобы модель замедляла работу вьюпорта, то значение поля
Viewможете поставить на 0. Учтите, что при визуализации в реальном времени будет действовать значение
View, так что если у вас там стоит 0, то это будет означать, что модификатор вообще не воздействует на модель. Зато работать со сценой будет быстрее. А вот при финальном рендеринге модель будет сглаживаться столько раз, сколько прописано в поле
Render в модификаторе
Subdivision Surface.
Это конечно костыль, но пока это единственный универсальный выход из положения. Рад буду узнать, если имеются другие решения этой проблемы. Ещё хочу отметить, что в Internalрендере такой проблемы не должно возникать, поскольку это условный рендер, а Cycles это непредвзятый рендер (Biasedи Unbiasedсоответственно).
Чтобы не перегружать сцену модификаторами сабсёрфа, можно наладить драйвер, который связывает расстояние от камеры до объекта. Т.е. если объект будет далеко, то значение сабсёрфа будет нулевое, но при приближении объекта значение будет увеличиваться. Таким образом, как бы мы сильно не приблизились к объекту, он всегда будет достаточно сглаженным и эффект
Terminator problem заметен не будет.
Если делать скульптинг на простых вещах, например на полисфере, то даже после применения Multires модификатора с разбиением до 7 уровня мы всё ещё можем более мене комфортно делать скульптинг. Но вот что делать если изначальная модель даже на низкополигональном уровне уже содержит большое количество треугольников? Например модель человека может содержать около 30 000 треугольников. И это только изначальный низкополигональный уровень. А чтобы нанести мелкие детали на такую модель, нужно подразбить её как минимум до 6 уровня. Но в таком случае получится свыше 300 миллионов треугольников! Не знаю как ваш, но мой компьютер зависает намертво на этом моменте, не давай не то что скульптить, а даже просто вращать модель. И что уж говорить о таком ресурсоёмком процессе, как запекание карты нормалей - тут вообще никаких шансов. Как же выйти из этой ситуации? Решение довольно простое. Не обязательно делать мультирес 7 уровня для всей модели. Мы можем работать кусками. Действительно, а зачем глотать кусок целиком, если мы можем поделить его на порции и, спокойно пережёвывая, скушать. Конечно это не так комфортно, как если бы мы работали со всей моделью сразу, но к сожалению этот вариант недоступен (ну по крайней мере я других вариантов не встречал). Кстати в Zbrush есть подобное решение на вкладке HD Geometry. Когда вы включаете режим высокой детализации, программа вырезает определённую часть модели, которую ваш компьютер способен более менее нормально обрабатывать и вы с этой частью работаете. Когда вы хотите перейти к другой части модели, вы переключаетесь на неё. Это конечно удобнее, поскольку детализация хранится автоматически.
И так, вот мой способ работать с деталями в Blender
1. Заходим в режим редактирования и выделяем полигоны части объекта, с которой мы собрались работать. Давайте возьмём за пример модель человека. Например, мы хотим детализировать лицо. Я выделяю часть лица с которой хочу поработать. Мне было бы комфортнее работать с этой частью, если бы в ней было как можно меньше полигонов. Поэтому я не стану копировать всю голову. Я не стану выделять скальп, уши (которые кстати содержат много полигонов), затылок и шею. Теперь я нажимаю SHIFT+D, а затем ESC. Конечно в данном случае не обязательно следить за тем, чтобы модель оставалась на том же месте, имела тот же объём и пропорции, расположение ориджина, потому что самое главное для нас - сохранить первоначальное расположение полигонов и UV. Эта часть, которую мы сейчас скопировали будет удалена в дальнейшем, поэтому вы можете делать с ней всё что угодно, пока это не изменяет UV.
2. Теперь отделяем нашу скопированную часть от основного объекта. Делается это нажатием клавиши P. Выберите вариант Selection.
3. Для удобства рекомендую спрятать все лишние модели, в том числе и оригинал. Оставьте только ту модель, которую отделили. Сделать это проще, если выделить только эту модель, затем нажав CTRL+I и потом H.
4. Теперь мы можем работать с нашим участком. Накладывайте модификатор Multires (я не буду описывать его принцип, надеюсь, что вы уже с ним работали). Я стараюсь разбивать модель до 7 уровня. Но это зависит от плотности сетки модели. Чем она менее плотная изначально, тем больше нужен уровень сабдивов. В общем делайте скульпт так, как вы это умеете и делайте разбиение настолько насколько считаете оправданным. Теперь руки у вас развязаны.
5. Когда вы закончили скульптинг, пришло время запечь карту нормалей. Тут вы тоже справитесь сами. Но я всё же отмечу один важный момент. Когда вы будете создавать в блендере чистое изображение на которое будете запекать карту нормалей, важно выставить ему нейтральный цвет. Это конечно можно будет сделать и на этапе с Photoshop, но удобнее это сделать заранее здесь. Нейтральный цвет, который не влияет на нормали это - 0.5, 0.5, 1 (последнее значение для синего канала). В Photoshop это нейтральный серый (50% серый) в красном и зелёном каналах и абсолютно белый в синем канале. Теперь перед запеканием важно отключить опцию Clear. В общем не важно на каком этапе и каким способом вы его сделаете, главное, чтобы вся карта нормалей имела правильные цвета иначе, если в каких-то участках цвета не будет и сохраните это в Jpg или png, то в этом месте будет белый цвет (в случае с png чёрный) и тогда в этих местах возникнут ошибки отображения карты нормалей. Например, мы сделали детализацию лица и рук, забыли убрать галочку Clear, в Photoshop не исправили нашу ошибку и сохранили. В блендере будет отображаться правильно только та часть лица, которую мы детализировали, всё остальное будет иметь более тёмный оттенок.
6. Карта нормалей запеклась, мы её сохранили под соответствующим именем (можно добавить название части объекта, чтобы не запутаться потом, если их будет много. Я бы назвал так Normal_face. Объект, который мы скульптили теперь можно спокойно удалить (ну или спрятать, мало ли, вдруг вы потом заметите что-то и захотите внести мелкие изменения).
Далее вы можете повторить все эти пункты для других частей тела, которые вы хотите детализировать. Когда вы всё закончите, то просто откройте все полученные карты нормалей в Photoshop и накидайте в один файл (можно взять один из файлов с картой нормалей, например, Normal_face). Важно, чтобы каждый слой не был сдвинут в сторону. Если на предыдущих этапах вы забыли отключить галочку Clear в каком-то из файлов, то сейчас самое время всё исправить. Создайте слой и залейте его цветами 127,127,255 и переместите его так чтобы он был самым нижним. Включите у всех слоёв, кроме нижнего, режим Overlay. Если вы забыли установить нейтральный цвет перед запеканием, но галочку Clear не забыли убрать и в итоге у вас получилась текстура с чёрным фоном, то тут уже исправить сложнее. В данном случае вы можете только лишь удалить чёрную часть стёркой. Теперь сохраните этот файл в любой доступный для Blender'a формат (например png). Готово!
Эту карту вы можете теперь применить к вашей модели и все детализированные участки будут единым целым.
Теперь совет
Карта нормалей не сохраняет инофрмацию о геометрии, поэтому если глядеть на поверхность под очень плоским углом, она будет плоская. Поэтому желательно сделать небольшую предварительную детализацию с модификатором multires на уровне сабдива 2 или 3 (если мощность компьютера позволяет). Таким образом вы создадите крупные детали на вашей модели, которые будут иметь объём даже под плоским углом. Например, это могут быть складки, бугорки. Для этих деталей не обязательна сверхвысокая детализация.
Эти детали важно нанести до всего того что я описал выше. По крайней мере конкретно те участки которые вы собрались детализировать.
В чём смысл? Эти детали сохранятся на вашей модели, но чтобы при работе с моделью (анимирование например) компьютер не тормозил, вы можете отключить модификатор Multires или установить Preview на 1 или 0. Это позволит вам комфортно работать с моделью, а при рендеринге включится детализация.
А когда вы перейдёте к детализации и отделите часть меша, модификатор Multires и информация о нанесённых вами деталях останутся! В этом и вся прелесть данного метода. Вам только останется добавить уровней сабдива до нужного и нанести более мелкие детали. Таким образом получается, что во вьюпорте вы (после того как закончите детализацию и сведёте карту нормалей) будете работать с низкополигональной моделью, но при рендеринге она будет содержать более детализированную геометрию, а карта нормалей добавит ещё и мелких деталей!
Надеюсь этот совет поможет вам справиться со страхом, перед детализацией больших моделей))
Ну а если я по невнимательности пропустил альтернативный способ сделать высокую детализацию в Blender, буду рад если кто подскажет.