OpenGL ES тени для 2D спрайтов - PullRequest
12 голосов
/ 07 марта 2012

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

enter image description here

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

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

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

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

1 Ответ

5 голосов
/ 07 марта 2012

Это все хорошо продуманные варианты, вот мои мысли по каждому

  1. Определенно возможно использовать шейдер, но это может быть не самый производительный вариант, так как размытие будет иметьЭто может быть сделано внутри шейдера и может потребовать многократного поиска текстур.
  2. Рисование текстуры несколько раз будет работать и будет выглядеть как тень, потому что каждое "дрожащее" изображение будет иметь слегка измененные альфа-значения.Но опять же, смешивание и несколько рендеров каждого спрайта могут сложиться и могут повлиять на производительность.
  3. Мне нравится и рекомендуется этот вариант, потому что вы можете установить шейдер, который помещает черные пиксели вместо цветных (с учетом альфа) вцель рендеринга меньше экрана (1/4?), а затем использовать ее в качестве текстуры тени.Поскольку текстура теперь растягивается, вы также получите «размытие» бесплатно.Пиксельный шейдер, который выполняет «чернение», будет очень простым и не окажет слишком сильного влияния на производительность.
  4. Если вам действительно не нужны высококачественные тени (а предыдущего метода недостаточно), я бы не рекомендовал это.
  5. Это, конечно, наиболее гибкий вариант, имеющий сложность рендеринга x2.К сожалению, он будет занимать больше памяти, чем все остальные опции выше.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...