У меня есть сцена OpenGL, визуализированная с кучей спрайтов, и я хотел бы автоматически добавить тени для всех из них. Вот картинка, показывающая, что я имею в виду:
![enter image description here](https://i.stack.imgur.com/b2hIs.jpg)
Сцена использует ортографическую проекцию, спрайты - это текстурированные квадраты, и я использую буфер глубины, чтобы рисовать их спереди назад. Я работаю с OpenGL ES 2.0, но мы также будем благодарны за мысли из мира iOS или не-ES. В моей голове было несколько идей о том, как я могу это сделать, и я хотел бы выяснить, какие из них наиболее перспективны.
- Нарисуйте каждый спрайт дважды, первый обычно, второй с каким-то шейдером тени, немного глубже в сцене. Не уверены, возможно ли это?
- Нарисуйте спрайт, затем нарисуйте его снова, затемненный и с некоторым количеством альфа, несколько раз с некоторым случайным джиттером, примененным к вершинам. Это может выглядеть глупо и совсем не похоже на тень.
- Нарисуйте базовую сцену без фона для текстуры, затем размыте и затемните ее, чтобы создать одну большую тень. Затем нарисуйте базовую сцену поверх текстуры падающей тени, а затем над фоном. Это потеряло бы тени между спрайтами.
- SSAO в проходе постобработки. Может быть самым динамичным и автоматическим, но может выглядеть нечетким / зернистым и действительно замедлять процесс.
- Во время создания генерируйте теневую текстуру для каждого спрайта. Для рендеринга нарисуйте спрайт, а затем его теневое будущее немного глубже в сцене. Я думаю, что хотел бы избежать этого из-за времени загрузки и дополнительных требований к памяти, но это может быть самым быстрым и лучшим видом?
Я не хочу выполнять какую-либо работу с тенями с внешними текстурами, поскольку я использую одни и те же текстуры спрайтов в различных масштабах, и предварительно запеченные тени будут масштабироваться неестественно.
Так что из этого лучше других? Есть ли другие варианты, о которых я не думаю? Спасибо!