Как реализовать ложные 3D-эффекты искажения для 2D-игры с боковой прокруткой?

14

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

Я видел такие игры, как « Я хочу быть болтливым и ты должен выиграть игру», в которых можно изменить перспективу 2D-игр, чтобы придать им своего рода 3D-эффект (см. Изображения ниже). По сути, Boshy создает впечатление, будто вы находитесь в башне (цилиндре), в то время как игра «Вы должны выиграть» искажает изображение так, что оно выглядит так, будто вы играете на старом ЭЛТ-мониторе, в частности, слегка округленный вид.

  • Есть ли термин для этого эффекта?
  • Каков стандартный способ реализации этого эффекта (терминология)?
  • Как мне реализовать такой эффект в движке / среде высокого уровня, таких как Unity или XNA / Monogame, с высоты 20 000 футов? (подробный код успешно принят, но не обязателен - я понимаю, что точные детали реализации могут отличаться, но подробности высокого уровня о том, что должно быть сделано, будут высоко оценены)

Я хочу быть Boshy Я хочу быть Boshy

Вы должны выиграть игру введите описание изображения здесь

SpartanDonut
источник
Да. Мне всегда было интересно узнать точный термин для техники. Лучшее, что я могу придумать, это «старый экранный эффект телевизора»
Tofu_Craving_Redish_BlueDragon
Точно! И это работает только для последнего примера
SpartanDonut

Ответы:

7

Это может быть реализовано как эффект пост-обработки. (При использовании Unity / XNA / Dx / OGL / ...)

Метод геометрии

Начните с создания меша, который напоминает эффект искажения, которого вы хотите достичь. (например, смоделируйте полуцилиндр (или конус, сферу, куб, ...), убедитесь, что вы задали координаты текстуры). Визуализируйте свою 2D-игру как обычно, но передайте конечный результат в текстуру. Затем визуализируйте геометрию искажения с помощью текстуры, которую вы только что создали. Вы можете использовать мир / вид / проекцию или изменять фактические координаты геометрии / текстуры, чтобы контролировать силу искажения. (изображение 1 показывает обычную 2D-игру, изображение 2 показывает ту же текстуру, спроецированную на сферу)

Пример игры Пример проецируемого на сферу (с использованием блендера)

Метод искажения

Инструменты обработки изображений часто предлагают эффекты искажения, которые могут эмулировать проекцию (немного похоже на оптические иллюзии). Например, изображение 3 было сгенерировано с использованием фильтра выпуклости из Paint.Net

Выпуклость искажения,

(Вы можете найти реализацию (OpenGL ES 2.0) этого эффекта искажения из проекта GPUImage - см. GPUImageBulgeDistortionFilter)

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

Миклас
источник
Фантастический ответ!
Tholle
1
Оба требуют обработки одинакового количества изображения. Проекция никогда не будет быстрее, чем ничего не делать , а обработка изображений в любом случае стоит одинаково. - Метод "Искажение" быстрее, потому что вы пропускаете преобразование и растеризацию вершин, а также вы даете драйверу больше свободы для итерации пикселей, где многоугольный подход более конкретно определяет порядок рисования. Наконец, полигоны храните меньше информации о предполагаемом эффекте, прибегайте к общему решению, которое подчеркивает аппаратное обеспечение фильтрации текстур и выдает приближенное значение вместо реального фильтра.
MickLH
@MickLH: Вершины для такой проекции постобработки можно рассчитать в автономном режиме или под нагрузкой, что дает очень дешевый сквозной вершинный шейдер. Для фильтра с выпуклостью также необходимо отобразить и растеризовать полноэкранный квад (кроме случаев, когда SpartanDonut имеет доступ, например, к вычислительным шейдерам), и для каждого пикселя смещение должно быть вычислено, а не интерполировано. Поэтому я считаю (в зависимости от доступных инструментов и реализации) оба метода могут быть одинаково быстрыми. Я обновил свой ответ, спасибо за ваш вклад.
Миклас