Кто-нибудь знает хорошие алгоритмы для рендеринга травы?

PooH

Желательно чтобы реализация была на OpenGL ES2.0 (там нету геометрических шейдеров)
стандартный способ через рендеринг вот такого примитива:
при низких углах наклона камеры (относительно горизонтали) все выглядит приятно:

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

нагрузка при вычислениях приемлимая
подскажите, как с этим бороться?
какие-нибудь хитрые способы рендеринга?
при этом надо учитывать, что целевой девайс - мобилка и там не особо с пропускной способностью и производительностью шейдеров, да и сами шейдеры сильно урезаны в функциональности (ES 2.0)

danilov

Положи текстуру на пол, например.

danilov

Или как вариант, вместо второго варианта сделай односторонние текстуры, видимой стороной внутрь, и не вертикальные, а под углом к нормали (букетиком)

PooH

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

добавим еще один уровень LOD (3d-модель кустика для примитивов для второго уровня LOD будем использовать 3x3+1 плоскости с спроектированными изображениями модели кустика
с букетиком проблемы в том, что эффект проявляется, но под другими углами (соответствует углу наклона плоскостей в букетике)
+ т.к. трава в основном имеет вертикальную структуру (если молодая то из-за букетика мозг чувствует себя обманутым ( уже попробовал разные букетики - выглядит получше, но кардинально картину не меняет)
для интересующихся: Вот тут очень хорошо все расписано
PS чует моя головушка, что придется очень сильно играться потом с оптимизацией
текущая сцена без оптимизаций, но с динамическими тенями (2 направленных источника света, VSM) на пятом айфоне выдает 20 фпс, что радует

PooH

Положи текстуру на пол, например.
не всегда приемлимо - т.к. трава будет строиться процедурно(вся сцена разбита на квадраты с указнием плотности, преимущественной окраски, преимущественного типа травы) - соответственно единая текстура на полу не работает
или ты имеешь в виду под каждый куст класть горизонтальную плоскость?

Dasar

или ты имеешь в виду под каждый куст класть горизонтальную плоскость?
скорее вот так

yroslavasako

соответственно единая текстура на полу не работает
что тебе мешает генерировать текстуру из атласа примитивов и текстуры разметки прямо в пиксельном шейдере?

PooH

что тебе мешает генерировать текстуру из атласа примитивов и текстуры разметки прямо в пиксельном шейдере?
поясни свою мысль
текстура разметки - это, я так понимаю, карта для уровня с указанием плотности и прочих характеристик
атлас примитивов - это что?
дополнительная проблема в том, что я могу передать всего 4 текстуры в шейдер, причем 2 из них уже используются для карт глубины теней
для процедурной генерации еще один слот уйдет для карты разметки (если я правильно понял твое определение)
и еще надо учитывать, что формат текстур - максимум 4 канала по 8bit

yroslavasako

атлас примитивов - это что?
ну, общий зеленовытый фон в горошек, листки травы и прочие элементы, которые вытягиваются, изгибаются, раскрашиваются, накладываются друга на друга с альфой в зависимости от разметки свойств травы для уровня. Бери размер текстуры побольше, чтобы на одной картинке 4х8 бит разместить и диффузку, и нормалку.

apl13

сегодня решил, что будем реализовывать все это чуток посложнее:
Вы изобрели мип-маппинг?

yroslavasako

нет. Он изобрёл несколько графических представлений для одной логической сущности

PooH

Вы изобрели мип-маппинг?
я где-то это утверждал?

PooH

ну, общий зеленовытый фон в горошек, листки травы и прочие элементы, которые вытягиваются, изгибаются, раскрашиваются, накладываются друга на друга с альфой в зависимости от разметки свойств травы для уровня. Бери размер текстуры побольше, чтобы на одной картинке 4х8 бит разместить и диффузку, и нормалку.
не совсем понимаю зачем так извращаться?
вижу преимущество в том, что для смены окраски можно одну текстуру менять и хранить это тоже просто
но тут есть проблема: MAX_TEXTURE_SIZE = 1024x1024
соответственно в такую текстуру влезет разве что 8-12 текстур элементов (и это если упаковать и диффузку, и нормалку)
пока не вижу в этом необходимости (блиде к альфе скорее всего буду таким заниматься)

PooH

что тебе мешает генерировать текстуру из атласа примитивов и текстуры разметки прямо в пиксельном шейдере?
с этим проблем нет
короче, никаких проблем с текстурами на полу нет вообще
ну проблемы как таковой тоже нет
просто я интересовался, есть ли какие-то общепринятые методы рендеринга травы с перечислением недостатков, преимуществ
видел интересный способ без генерации геометрии - расчеты чисто в пиксельном шейдере - что-то вроде 3d-текстур, точнее их эмуляция, но по моим прикидкам это очень тяжелая техника

PooH

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

tokuchu

А почему не использовать наклонные плоскости? Типа зигзагом.

PooH

А почему не использовать наклонные плоскости? Типа зигзагом.
все проще - можно и наклонные - сильно зависит от структуры травы (величина изгибов, плотность, кустистость)
визуальное качество достигается за счет хитрой обработки: к примеру, нелинейно изменять прозрачность плоскостей в зависимости от степени "параллельности" линии взгляда
Оставить комментарий
Имя или ник:
Комментарий: