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