Изображение ниже показывает два спрайта, визуализированных с точечной выборкой поверх фона:
- К левому черепу не применяется вращение / масштабирование, поэтому каждый пиксель идеально соответствует фону.
- Правый череп поворачивается / масштабируется, и это приводит к большим пикселям , которые больше не выровнены по оси .
Как я могу разработать пиксельный шейдер, который бы отображал преобразованный спрайт справа с выровненными по оси пикселями того же размера, что и остальная часть сцены?
Это может быть связано с тем, как масштабирование спрайтов было реализовано в старых играх, таких как Monkey Island, потому что это тот эффект, которого я пытаюсь достичь, но с добавленной ротацией.
редактировать
Согласно предложениям kaoD, я попытался решить проблему как пост-процесс. Самый простой подход состоял в том, чтобы сначала выполнить рендеринг в отдельную цель рендеринга (с понижением дискретизации, чтобы соответствовать желаемому размеру пикселя), а затем увеличить его при рендеринге во второй раз. Это действительно отвечало моим требованиям выше.
Сначала я попытался сделать это, Linear -> Point
и результат был такой:
Искажений нет, но результат выглядит размытым, и он теряет большинство ярких цветов. На мой взгляд, это нарушает стиль ретро, который мне был нужен.
Второй раз я попробовал, Point -> Point
и результат был такой:
Несмотря на искажения, я думаю, что это может быть достаточно для моих нужд, хотя выглядит как неподвижное изображение лучше, чем в движении.
Чтобы продемонстрировать, вот видео эффекта, хотя YouTube отфильтровал пиксели из этого:
Однако я оставлю вопрос открытым еще на несколько дней на случай, если кто-то придумает лучшее решение для выборки, которое сохранит четкий внешний вид и уменьшит количество искажений при движении.
источник
SpriteBatch
требует от меня использования немедленного режима, так что это не стоит хлопот. Я пойду с этим :)Ответы:
Вы должны применять свой шейдер ПОСЛЕ того, как ваш спрайт был повернут.
Если вся сцена еще не была затенена, а ваши спрайты фактически пикселированы, вам нужен какой-то пост-FX фильтр для всей вашей сцены. Усреднение областей пикселей будет работать нормально. Это не совсем то, что вы намереваетесь (это будет выглядеть немного странно при движении / вращении), но это может помочь.
Единственный способ сохранить правдивость этого ретро-стиля в том, что вы хотите, - это на самом деле нарисовать свои вращения спрайтов самостоятельно. Это не имеет никакого отношения к тому, как было реализовано масштабирование: разрешение было на самом деле плохим, говоря о том, пробовали ли вы с крайне низкими разрешениями? Это также может помочь, и будет выглядеть более естественно, так как, на самом деле, именно это и привело к тому эффекту, который вы ищете. И это дешево! Очень дешевый! На самом деле это будет дешевле, чем то, что у вас уже есть (меньше выполнения фрагмента шейдера.)
Эффект разрушен в вашем образце изображения, потому что ваше разрешение выше по сравнению с вашими спрайтами, поэтому он позволяет вам видеть реальные пиксели на сцене.
источник
SpriteBatch
точечной выборкой. Но пост-FX может действительно сработать. Для начала я попробую сделать рендеринг с линейной выборкой для цели рендеринга, а затем отрендерить всю цель рендеринга в буферный буфер с точечной выборкой.