Тени OpenGL ES для 2D-спрайтов

У меня есть сцена OpenGL, отрендеренная с набором спрайтов, и я хотел бы автоматически добавить тени ко всем из них. Вот рисунок, показывающий, что я имею в виду:

enter image description here

В сцене используется ортогональная проекция, спрайты представляют собой текстурированные квадраты, и я использую буфер глубины, чтобы отрисовывать их спереди назад. Я работаю с OpenGL ES 2.0, но также буду признателен за мысли из мира iOS или не-ES. У меня в голове появилось несколько идей о том, как я могу это сделать, и я хотел бы выяснить, какая из них наиболее перспективна.

  1. Нарисуйте каждый спрайт дважды, первый раз в обычном режиме, второй с помощью какого-нибудь шейдера тени немного глубже в сцене.Не уверены, возможно ли это?
  2. Нарисуйте спрайт, затем нарисуйте его снова, затемнив и с некоторой альфой, несколько раз со случайным дрожанием, примененным к вершинам. Это может выглядеть глупо и совсем не похоже на тень.
  3. Нарисуйте базовую сцену без фона в виде текстуры, затем размойте и затемните ее, чтобы создать одну большую тень. Затем нарисуйте базовую сцену поверх текстуры тени и, наконец, поверх фона. Однако это приведет к потере теней между спрайтами.
  4. SSAO на этапе постобработки. Может быть самым динамичным и автоматическим, но может выглядеть нечетким/зернистым и действительно замедлять работу.
  5. Во время создания создайте текстуру тени для каждого спрайта. Для рендеринга нарисуйте спрайт, а затем текстуру его тени немного глубже в сцене. Я думаю, что хотел бы избежать этого из-за времени загрузки и дополнительных требований к памяти, но это может быть самым быстрым и красивым?

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

Так что же лучше, чем другие? Есть ли другие варианты, о которых я не думаю? Спасибо!

13
задан genpfault 7 March 2012 в 14:53
поделиться