2015-03-27 2 views
2

Я наткнулся на this удивительный блог об рендеринге травы на Kévin Boulanger.Как реализовать карты плотности с инстансом рендеринга

В своем проекте он использовал определенную карту плотности:

enter image description here

Черные области представляют собой места в 3D мире, где трава должна быть оказаны. И белые области, где нет травы.

Мой вопрос: я передаю траву в своей сцене, используя функцию рендеринга OpenGL. Но трава натянута почти на всю местность. Мне не удалось сопоставить такую ​​карту плотности с позициями травы, которую я получаю.

Как использовать такие карты плотности с инстанционным рендерингом?

ответ

3

Что Кевин делал в основном, читая эту карту плотности (на процессоре) при создании сетки травяного патча и сохранял значение в вершинах (одно и то же значение во всех вершинах 1 лезвия). Затем, когда патч был визуализирован, в пиксельном шейдере, если это значение было меньше некоторого порога, он отбросил пиксель. Система представляет собой несколько разных патчей, сделанных из рекламных щитов, плотность вместо них сохраняется в текстуре. Таким образом, в основном вы делаете траву повсюду, но трава становится невидимой на дороге.

Это объясняется в его диссертации, стр. 67-71.

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

Решение будет состоять в том, чтобы сохранить это значение плотности на один экземпляр носа травы в однородном буфере. Таким образом, каждый травяной патч имеет одинаковую сетку и может быть установлен.

Для патчей из рекламных щитов это сложнее, вам нужно иметь «1 текстуру» для рекламного щита. Вы можете создать большую текстуру (или массив текстур), которая содержит эквивалент нескольких рекламных щитов и сохранить смещение координат текстуры за каждый рекламный щит в постоянном буфере. Не забудьте повторно использовать ту же часть текстуры для рекламных щитов, которые выглядят одинаково в этом случае.