Войти
ПрограммированиеФорумГрафика

Идея отрисовки фейковой дальней травы

Страницы: 1 2 3 Следующая »
#0
0:47, 29 янв. 2015

Появилась тут одна идея, как можно рендерить дальнюю траву.

Из вот такой текстуры (RGB, без прозрачности)
Grass Sample Texture | Идея отрисовки фейковой дальней травы


Получается такой результат:
CFTG Grass - результат | Идея отрисовки фейковой дальней травы

Побегать можно здесь: https://goo.gl/rh1HcD (нужен Unity Web Player)

В этой сцене 2 треугольника, альфабленда нет, всё в шейдере. Шейдер делает 4 сэмплирования текстуры на пиксель.
Unity пишет, что на моей мобильной видеокарте AMD Radeon HD 7470M рендер занимает 0.1 мс.
Пока всё выглядит хорошо. Есть несколько проблем, которые надо решить, но о них позже.


Основная идея проста:
Попробуем наложить текстуру из первой картинки на квад, который будет изображать из себя ландшафт.
Tiled Grass Texture | Идея отрисовки фейковой дальней травы


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


Но не для каждого пикселя, а для небольших участков ландшафта (давайте назовём их гранулами, возможно уже существует подходящий термин для этого, но я не нашел).
Получится как-то так:
Camera-Faced Granules | Идея отрисовки фейковой дальней травы


А теперь будем интерполировать цвет между соседними гранулами:
Interpolated Granules | Идея отрисовки фейковой дальней травы


Похоже на траву, но слишком заметны повторения. Но если при сэмплировании каждой гранулы смещать её центр на исходной текстуре на какой-то псевдослучайный вектор, то повторения исчезают:
CFTG Grass randomized | Идея отрисовки фейковой дальней травы


А можно ли таким образом рисовать сразу несколько типов травы? Можно.
Здесь половина исходной текстуры заполнена другим типом травы:
CFTG Grass 2 types | Идея отрисовки фейковой дальней травы


Кстати, для стороннего наблюдателя, который смотрит на всё это дело сверху, участок ландшафта рядом с камерой будет выглядеть так:
CFTG Grass top-down view | Идея отрисовки фейковой дальней травы


Чтобы не писать много слов, которые указывают на эту технику рендера, пусть она называется Camera-faced Texture Granules, а трава "CFTG Grass".
Умнее ничего не придумал, но для обсуждения пока должно хватить.


Теперь о проблемах, для которых хочется обсудить возможные решения:

* Рядом с игроком артефакты настолько заметны, что с ними жить нельзя, вероятно надо засаживать плотной геометрической травой.
Ещё не проверял, но думаю, если дифуз геометрической травы будет такой же как и у CFTG, должно прокатить.
geom grass | Идея отрисовки фейковой дальней травы

* Не понятно как будут в эту траву втыкать камни, деревья и прочие объекты.
Не проверял, но думаю, достаточно поставить плашку с травинками вокруг этих объектов.

* Не понятно что делать на силуэтах холмов.


#1
1:06, 29 янв. 2015
+ Показать
#2
1:19, 29 янв. 2015

The Player
> Поздравляю, ты изобрел parallax mapping!

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

#3
1:38, 29 янв. 2015

Imp5
Геометрической травы пока нет? Просто думаю вот о чём? если не рисовать уровни плоской травы рядом с игроком вообще, а заменять текстурой почвы, трава пусть начинает рисоваться в дали, именно там, где перестаём вырисовывать геометрическую траву. По идее таким образом всё должно стать норм. Ты знаешь такая трава(в том виде как есть) очень недурственно будет смотреться в винтажном RayCasting движке ) и артефактов таких по ряду причин не видно будет.

#4
2:27, 29 янв. 2015

Imp5
Выглядит очень прилично, если не смотреть под ноги. Не мог бы ты в демке добавить ещё одну текстуру с шахматной доской, чтобы наглядно посмотреть как всё работает.

#5
2:28, 29 янв. 2015

забавный трюк

#6
2:33, 29 янв. 2015

Для дальней травы действительно годный трюк, пили статью! :)

#7
2:34, 29 янв. 2015

А не сделаешь демку чтоб холмы были разной формы, а не плоскость? Интересно, как себя поведёт.

#8
2:54, 29 янв. 2015

На GeForce 9600 GT у меня не заработало (чёрный прямоугольник вместо травы), но по картинкам выглядит интересно. А можно подробнее, каким трансформациям подвергаются текстурные координаты в гранулах, чтобы заставить текстуру выглядеть везде так, будто трава растёт вертикально?

#9
4:46, 29 янв. 2015

Аккордеон HD 6570 - чёрный прямоугольник.

#10
8:02, 29 янв. 2015

Смотрится неплохо, но в движении есть недостатки. Например, при стрейфе очень заметны "блоки" травы на ближней дистанции, которые ведут себя как биллборды (всегда повернуты в камеру), которые на фоне соседей явственно проворачиваются.

#11
8:08, 29 янв. 2015

Imp5
Осталось все это добро подружить с тенями.

#12
9:43, 29 янв. 2015

Выглядит отлично! Сделай демку на холмистой местности, интересно как будет выглядеть.

#13
10:03, 29 янв. 2015

Очень круто смотрится

#14
10:16, 29 янв. 2015

Odin P. Morgan
> Геометрической травы пока нет? Просто думаю вот о чём? если не рисовать уровни
> плоской травы рядом с игроком вообще, а заменять текстурой почвы, трава пусть
> начинает рисоваться в дали, именно там, где перестаём вырисовывать
> геометрическую траву.
Да, так и планирую сделать.


BUzer
> А можно подробнее, каким трансформациям подвергаются текстурные координаты в
> гранулах, чтобы заставить текстуру выглядеть везде так, будто трава растёт
> вертикально?
вот кусок кода из шейдера:

          float dist = length(dir_uv);
          float2 grass_dir_y = normalize(dir_uv);
          float2 grass_dir_x = float2(grass_dir_y.y, -grass_dir_y.x);
          float2 d = duv.y * grass_dir_x + duv.x * grass_dir_y;
          float2 projected_uv = float2(d.y, d.x * 2.0 / (dist + 2.0 * 2.0));
dir_uv - это направление от камеры к грануле
projected_uv - по этим координатам надо сэмплировать текстуру


Zloten
> Сделай демку на холмистой местности, интересно как будет выглядеть.
Чуть позже, сейчас пока времени нет.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.