VirtualVoid
оно в exilecon на искривлённый ландшафт так-то накладывается. ещё тем же шейдером мы делали мех, поэтому он обязан корректно накладываться на любую поверхность. нормальных видео с заметно кривыми поверхностями у меня нет под рукой, но вот, например, очень ранние эксперименты с чем-то вроде меха: https://drive.google.com/file/d/1lcOnglXhhOfd42g_U7_F5gExKSxGzdz5… w?usp=sharing
> у меня нет сейчас доступа шейдерам пое (я дома), но формула была примерно такая
Формула немного не такая, но не суть. Из вот этого:
> имея угол запекания для точки C, модифицирую прочитанное расстоение AC, чтобы оно совпадало с длиной AB для текущего направления взгляда
выводится:
// length - значение из текстуры. Я запёк саму длину до пересечения, а не горинтальную составляющую. // texCoord - пространственные составляющие текстурной координаты. vec3 rayHit = vec3(texCoord, 0.0) + bakeDirection * length; length_corrected abs(rayHit.z) * cosViewAngle;
Что идеально работает для горизонтальных плоскостей.
Моя же проблема была в том, что я использовал для отладки либо пару вертикальных плоскостей, либо сложную модель круглого (в плане) куста.
Вертикальные плоскости подчёркивают артефакты при любом способе компенсации, кроме тупого поиска правильного семпла.
Вывод: трава действительно должна быть примятой :)
А патч - квадратным.
наверное дурацкий вопрос, но как выглядит текстура в итоге, которую предрасчитываешь?
kinyz
вполне резонный вопрос. текстура трёхмерная, поэтому всю её отобразить не так-то просто. но вот так выглядит её срез, то есть расстояние до первого пересечения для фиксированного угла (на самом деле это 1/(расстояние + 1) из-за особенностей компрессии):
точно, зд текстуру сложнова-то запостить)
это что-то типо "взгляда" на текстуру "сбоку"? боковой вертикальный срез?
но я так понимаю это один канал, ты вроде говорил что там ещё нормали хранятся ?
kinyz
> это что-то типо "взгляда" на текстуру "сбоку"? боковой вертикальный срез?
> но я так понимаю это один канал, ты вроде говорил что там ещё нормали хранятся
> ?
да, это примерно оно и есть. хранится длина луча до первого пересечения, нормаль и альбедо-цвет в точке пересечения. но тут всё от задачи зависит: например, если рендерятся волосы, то цвет можно не хранить отдельной текстурой, если нормали хорошие, то их можно из градиента глубины посчитать итп.
спасибо, крутой подход)
Я правильно понял, что в данной технике нет эффекта параллакса, т.е. расположение травинок не меняется относительно друг друга при движении камеры в вертикальной плоскости? И получается что-то вроде импостора, захваченного под определенным углом?
Spartan
> Я правильно понял, что в данной технике нет эффекта параллакса, т.е.
> расположение травинок не меняется относительно друг друга при движении камеры в
> вертикальной плоскости? И получается что-то вроде импостора, захваченного под
> определенным углом?
нет, неправильно. параллакс 100% корректный, если запечённая геометрия травинок строго вертикальная и меняется только их общее направление (например, в случае примятой травы). если же запечённые травинки отклоняются от вертикали, то параллакс в вертикальной плоскости приближённый.
А что, если строить не 3d, а 4d текстуру - для всевозможных углов взгляда по горизонтали и по вертикали? Тогда можно было бы запекать произвольную геометрию или не ограничиваться фиксированным углом взгляда. Для текстуры 128x128 и 16x8 углов будет потребление памяти всего в 8 мегабайт (RGBA). Нелокальность доступа не будет страшной, если хранить в одном 2d слое предрасчёт для одного набора углов.
Panzerschrek[CN]
> А что, если строить не 3d, а 4d текстуру - для всевозможных углов взгляда по
> горизонтали и по вертикали? Тогда можно было бы запекать произвольную геометрию
> или не ограничиваться фиксированным углом взгляда.
я тоже много про это думал, но тут становится очевидно, что эти данные надо как-то жать. да даже в случае с 3д текстурой данные на самом деле можно жать: можно в 2д текстуре по x хранить угол, по y — вход луча, а в каналах цвета хранить по четыре значения rgba — точки пересечения. это гораздо эффективнее по памяти (на одну размерность меньше), но такие данные очень трудно интерполировать и не работает для случая, если больше 4х точек пересечения.
Suslik
> эти данные надо как-то жать
А зачем их жать? Неужели объём занимаемой памяти слишком высок или дорог доступ к ней? Скажи, для примера, сколько занимает набор текстур на одну высокодетализированную модель (персонажа, объекта уровня и т. д.)?
Panzerschrek[CN]
> А зачем их жать? Неужели объём занимаемой памяти слишком высок или дорог доступ
> к ней?
ну трёхмерная текстура травы занимает 1Мб. из-за этого скорость шейдера по большей части упирается в локальность чтения текстурной памяти. если добавить ещё одну размерность (даже хотя бы х8), то и размер, соответственно, увеличится ещё в 8 раз. но на практике для нормального разрешения x8 едва ли хватит, поэтому самое главное здесь — это как оно скейлится. если для того, чтобы увеличить качество объекта в 2 раза, надо будет увеличивать размер ассета в 16 раз, это плохо.
Suslik
> нет, неправильно. параллакс 100% корректный, если запечённая геометрия травинок
> строго вертикальная и меняется только их общее направление (например, в случае
> примятой травы). если же запечённые травинки отклоняются от вертикали, то
> параллакс в вертикальной плоскости приближённый.
Я говорю про случай когда травинки отклоняются от вертикали.
Трассировка вглубь со смещением травинок и изменением их толщины эквивалентна просто захвату карты глубины и нормали для травы из ортографической камеры под углом(например) 45 градусов к вертикали для 8 разных направлений. Это видно даже по приведённому срезу 3D текстуры.
Т.е. мы имеем 8 импосторов травы для 8 направлений между которыми интерполируемся, делая поправку для глубины и искажение косоугольной матрицей для имитации движения.
Визуальное пересечение травинок не меняется при движении камеры в вертикальной плоскости, корни травинок не двигаются относительно концов.
Ради такого дела скачал PoE, пробежал пару уровней, но так и не увидел волшебной травы.
P.S. На макс настройках тормозит на RTX 2070 просто стоя на берегу, без монстров и эффектов. Это нормально?
Тема в архиве.