У меня есть сцена OpenGL, созданная с кучей спрайтов, и я хотел бы автоматически добавлять тени для всех. Вот картина, показывающая, что я имею в виду:
Сцена использует орфографическую проекцию, спрайты - текстурированные квадрациклы, и я использую буфер глубины, чтобы нарисовать их спереди назад. Я работаю с OpenGL ES 2.0, но мысли из iOS или не-ES-миров будут оценены. Я бросил в голове несколько идей о том, как я могу это сделать, и я хотел бы узнать, какие из них обещают.
- Нарисуйте каждый спрайт дважды, первый обычно, второй с каким-то шейдером тени, немного глубже в сцене. Не уверен, что это возможно?
- Нарисуйте спрайт, затем снова нарисуйте его, затемненный и с некоторой альфа, несколько раз с некоторым случайным дрожанием, применяемым к вершинам. Это может показаться глупым и совсем не похожим на тень.
- Нарисуйте базовую сцену без фона текстуры, затем размывайте и затемните ее, чтобы создать одну большую тень. Затем нарисуйте базовую сцену поверх текстуры тени, затем, наконец, над фоном. Тем не менее это потеряло бы тени между спрайтами.
- SSAO в поле для последующей обработки. Могут быть самыми динамичными и автоматическими, но могут выглядеть нечеткими/зернистыми и действительно замедлить работу.
- Во время создания создайте текстуру тени для каждого спрайта. Для рендеринга нарисуйте спрайт, а затем его теневой текст немного глубже в сцене. Я думаю, что я бы хотел избежать этого из-за времени загрузки и дополнительных требований к памяти, но это может быть самым быстрым и лучшим способом?
Я не хочу делать теневую работу с внешними текстурами, так как я использую те же текстуры спрайтов в разных масштабах, и предварительно испеченные тени будут масштабироваться неестественно.
Значит ли кто-нибудь из них лучше других? Есть ли другие варианты, о которых я не думаю? Спасибо!