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