Подтвердить что ты не робот

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

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

enter image description here

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

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

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

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

4b9b3361

Ответ 1

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

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

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