Normal'ный ликбез
тут @MrGonar, спросил.
Очень хороший вопрос, я бегло на него ответил, однако прикинул, что эту тему можно обозреть подробнее, с примерами в картинах.
Это будет наша "высокодетализированная" модель, хайполи, усложнять не будем, здесь и так все необходимое есть.
В качестве низко-детализированной модельки будет куб.
Что мы можем получить? Т.к. тема у нас про бамп и дисплейсмент, то их и получим, не буду вдаваться в технический процесс создания подобных карт, после него имеем две текстуры:
Черно-белая карта высот (она же карта дисплейсмента, названия гуляют от движка к движку)
И цветастая карта нормалей. Начну с первой, как более простой в плане понимания и реализации.
Карта высот черно белая, потому что в ней не требуется ничего кроме одного значения- непосредственно высоты, для этого достаточно одного канала в rgb картинке, или просто монохромного формата файла. Черный соответствует нулевой высоте, белый - максимально возможной.
Но тут важно помнить про дискретность цифрового мира и ограничения возможностей растровых форматов, к примеру, у большинства форматов на один канал всего 8bit, а это означает всего-то 256 градаций, вот и представьте себе рельеф, например, метр высотой, а мелкие детали на нём будет по 3 сантиметра, так себе детализация. Можно увеличивать разрядность картинки, её разрешение, но все это ведет к существенному увеличению веса файла. Как полумера - интерполяция между значениями высот, как видно из пэйнт примера- это лишь отчасти приблизит данные в текстуре к исходной поверхности.
Вторая текстура - карта нормалей. Вообще, нормали - это что-то из школьной геометрии, но если по простому, то, тыкая пальцем перпендикулярно поверхности, ваш палец и будет "нормалью", т.е. вектором перпендикулярным касательной.
Почему текстура цветная? Да это только так кажется, на самом деле там две черно-белых карты перемешаны, наклон нормали по X и Y. Даже в фотошопе можно глянуть, если зайти в режим отображения RGB каналов. Серый цвет соответствует полностью перпендикулярному вектору нормали, черный - наклон в одну в сторону, белый - в противоположную.
Она могла бы так и остаться серой, если бы в синий канал не записывали дополнительную информацию об общем отклонении вектора от строго перпендикулярного положения, где белый - вектор никуда не отклонен, черный - вектор сильно отклонен, практически упал на поверхность. Не шибко полезные данные.
Вот мои и подобрались, к самому вопросу, бамп мэппинг что это? Возможные переводы bump - кочка,ухаб, выпуклость. В названии и лежит вся суть. При прорисовке светотени на полигоне, движок анализирует яркости рядом стоящих текселей из карты высот и на основе перепада высот, наклоняет уже новый вектор нормали в нужную сторону. Важно понимать, что все это работает только на уровне, сделать потемнее/сделать посветлее пиксель, т.н. пиксельный шейдер, хорошо видно по правой стенке куба, что там никакая не Семенович, а нулевой размер (кстати женщины активно пользуются похожими фэйками в макияже, но там это ближе к ambient occlusion :DDD)
Алгоритм такого бампа не позволяет полностью передавать все детали рельефа, основные проблемы - это та самая низкая битность растровых файлов и лимит градаций, поверхности с легким наклоном не будут выглядеть таковыми, на них появятся ступеньки.
Поэтому удел старого доброго бампа - текстуры микрорельефа, небольших неровностей, трещинок, бугорков, только чтобы создать небольшие затенения или игру бликов на шероховатых поверхностях.
Но зачем напрягать движок вычислением нормали из каких-то там перепадов, давайте скормим ему уже предпросчитанные нормали, запеченные в текстуре. Заодно и от ступенек можно избавиться, ведь 256 градаций на поворот нормали по одной оси + интерполяция = на глаз уже не заметно дискретности.
Большая прелесть карты нормалей в том, что для длинного затяжного подъема или спуска поверхности не нужно постоянно повышать или понижать яркость текселей, достаточно одного цвета, который говорит движку: "вот тут нормаль всегда смотрит на юго-запад, рисуй тень вот так, а блик вот так". Однако разрешение текстуры, чем оно ниже, тем заметнее артефакты, например здесь заметен тонкий блик по контуру объекта, это блестит ненарочно образованная фаска, промежуточное значение между перпендикулярно записанной нормалью на плоскости и горизонтально нормалью на боку объекта.
Обратите внимание на конус сверху, от него не осталось и следа, это пример той детали, которую просто технически нормал бамп не может запечь, для него это таже плоскость, подумаешь немного выше, если карта высот оставляла хотябы кружок, то тут константа - #7f7fff.
Если убавить интенсивность, то "кочки", нарисованные по методу normal bump выглядят неплохо, подходит такой метод уже для более глубоких деформаций: трещин, впадин, труб и панелей на объекте, болтиков, фэйковых фасок, закруглений граней, но кубик как был плоским, таковым и остался. Это не рельеф, а скорее барельеф.
Придется что-то делать непосредственно с геометрией объекта, раздробить полигон на 4 мелких, а потом еще раз и еще раз...
Узнаете форму?
Вот и я нет, дробим дальше.
1,700,000 полигонов на кубике. Круто, че... До изначальной формы все еще далеко.
Хорошо, что в vray есть свои методы displacement. Позволяющие раздробить поверхность на сотни миллионов полигонов, при этом не забивая ВСЮ память.
И тут не без ложки дегтя, пресловутые 8 бит, выглядит будто пьяный столяр ночью стамеской орудовал. Ярко-выраженные ступеньки, там где их не должно быть.
Но если все же прибегнуть к помощи 32-битных форматов, да с плавающей запятой, тогда можно сохранить очень много информации о высоте в каждом текселе, появляется плавность, но такая текстура весит в разы больше 8-битного собрата, а о jpeg вообще умолчу, там информации еще меньше.
Помните как выглядели эти элементы в оригинале.
Так я напомню. Пример того, что неподвластно простому дисплейсменту.
Но и это научились обходить, объединив подходы height map и normal bump в так называемый vector displacement map, к сожалению на своем примере мне нечем было запечь подобную текстуру, но пример из интернета намекает на возможности.
Еще я намеренно упустил parallax mapping, тоже сугубо попиксельный эффект, промежуточный способ между бампом и дисплейсментом, но т.к. в моей специализации параллакс практически не применим, то и рассказать со своим взглядом на эту технологию у меня не выйдет. Знаю только, что у параллакса тоже свои ограничения по применению, связанные с тем, что текстура как бы вдавливается в полигон, вызывая всякие артефакты на гранях поверхностей, кубик с параллаксом все равно останется кубиком, но с хитронарисовынными тенями и бликами, чтобы глаз обмануть.
На этом пожалуй закончу, думал в ограничение по картинкам упрусь, хоть и хотел вначале попроще да побыстрее, такая вот длинная портянка получилась...