OpenGL ES отбрасывает тени для 2D спрайтов
У меня есть сцена OpenGL, созданная с кучей спрайтов, и я хотел бы автоматически добавлять тени для всех. Вот картина, показывающая, что я имею в виду:
![enter image description here]()
Сцена использует орфографическую проекцию, спрайты - текстурированные квадрациклы, и я использую буфер глубины, чтобы нарисовать их спереди назад. Я работаю с OpenGL ES 2.0, но мысли из iOS или не-ES-миров будут оценены. Я бросил в голове несколько идей о том, как я могу это сделать, и я хотел бы узнать, какие из них обещают.
- Нарисуйте каждый спрайт дважды, первый обычно, второй с каким-то шейдером тени, немного глубже в сцене. Не уверен, что это возможно?
- Нарисуйте спрайт, затем снова нарисуйте его, затемненный и с некоторой альфа, несколько раз с некоторым случайным дрожанием, применяемым к вершинам. Это может показаться глупым и совсем не похожим на тень.
- Нарисуйте базовую сцену без фона текстуры, затем размывайте и затемните ее, чтобы создать одну большую тень. Затем нарисуйте базовую сцену поверх текстуры тени, затем, наконец, над фоном. Тем не менее это потеряло бы тени между спрайтами.
- SSAO в поле для последующей обработки. Могут быть самыми динамичными и автоматическими, но могут выглядеть нечеткими/зернистыми и действительно замедлить работу.
- Во время создания создайте текстуру тени для каждого спрайта. Для рендеринга нарисуйте спрайт, а затем его теневой текст немного глубже в сцене. Я думаю, что я бы хотел избежать этого из-за времени загрузки и дополнительных требований к памяти, но это может быть самым быстрым и лучшим способом?
Я не хочу делать теневую работу с внешними текстурами, так как я использую те же текстуры спрайтов в разных масштабах, и предварительно испеченные тени будут масштабироваться неестественно.
Значит ли кто-нибудь из них лучше других? Есть ли другие варианты, о которых я не думаю? Спасибо!
Ответы
Ответ 1
Это все хорошо продуманные варианты, вот мои мысли о каждом
- Определенно можно использовать шейдер, но это может быть не самый эффективный вариант, так как размытие должно выполняться внутри шейдера и может включать несколько текстурных поисков.
- Рисование текстуры несколько раз будет работать и будет выглядеть как тень, потому что каждое "дрожащее" изображение будет иметь слегка измененные альфа-значения. Но опять же, смешение и множественные рендеринги каждого спрайта будут складываться и могут повлиять на производительность.
- Мне нравится и рекомендую этот параметр, потому что вы можете установить шейдер, который помещает черные пиксели вместо цветных пикселей (учитывая альфу) в цель рендеринга, меньшую, чем экран (1/4th?), а затем использовать это как текстуру тени, Поскольку текстура теперь растягивается, вы также получите "размытие". Шейдер пикселя, который выполняет "чернение", будет очень простым и не слишком сильно влияет на производительность.
- Если вам действительно не нужны высококачественные тени (и предыдущего метода не хватает), я бы не рекомендовал этого.
- Это, конечно, самый гибкий вариант и имеет сложность рендеринга x2. К сожалению, он будет потреблять больше памяти, чем все другие варианты выше.
Надеюсь, это поможет!