Я делаю игру на основе спрайтов, и у меня есть куча изображений, которые я получаю с невероятно большим разрешением, и я масштабирую их до желаемого размера спрайта (например, 64x64 пикселей), прежде чем преобразовать их в игровой ресурс, поэтому, когда рисую спрайт внутри игры, мне не нужно его масштабировать.
Однако, если я поверну этот маленький спрайт внутри игры (независимо от движка), некоторые пиксели назначения будут интерполированы, и спрайт будет выглядеть нечетким.
Это, конечно, зависит от угла поворота, а также от алгоритма интерполяции, но, тем не менее, недостаточно данных для правильной выборки определенного целевого пикселя.
Так что я могу придумать два решения. Во-первых, использовать исходное огромное изображение, повернуть его на нужные углы, а затем уменьшить масштаб всех возникающих вариантов и поместить их в атлас, который имеет преимущество в простоте реализации, но наивно потребляет в два раза больше спрайта. место для каждого вращения (каждое вращение должно быть вписано в круг, диаметр которого является диагональю прямоугольника исходного спрайта, площадь которого в два раза больше этого исходного прямоугольника, предполагая квадратные спрайты).
Он также имеет недостаток, заключающийся в наличии только заранее определенного набора вращений, который может быть нормальным или нет в зависимости от игры.
Таким образом, другой выбор - хранить увеличенное изображение, а также поворачивать и уменьшать его масштаб при рендеринге, что приводит к моему вопросу.
Каков оптимальный размер для этого спрайта? Оптимальный смысл, что большее изображение не будет иметь никакого эффекта в получающемся изображении.
Это определенно зависит от размера изображения, количества желаемых поворотов без потери данных до 1/256, что является минимальной представимой разницей в цвете.
Я ищу теоретический общий ответ на эту проблему, потому что попробовать кучу размеров может быть хорошо, но далеко не оптимально.
Ответы:
Я думаю, что вы пытаетесь сделать, это пространство двухмерного изображения, эквивалентное двойному скруглению . Я могу построить свободное доказательство того, что невозможно найти такой промежуточный размер, по крайней мере, в случае простых алгоритмов уменьшения масштаба, таких как линейная интерполяция.
Предположим, мы нашли
N
такое, что промежуточное изображение имеет размерN×N
больше, чем64×64
. Предположим, что мы даже не применяем вращение (угол равен нулю).Теперь давайте создадим картинку, которая не работает.
Построение промежуточного изображения
Рассмотрим полностью черное промежуточное изображение. Очевидно, что окончательное изображение также будет полностью черным. Затем добавьте один серый пиксель минимальной интенсивности (R¸G, B = 1,1,1). Окончательное изображение должно быть полностью черным. Добавьте еще один серый пиксель, касающийся первого. Продолжайте строить круг, пока окончательное изображение больше не станет полностью черным.
Изображение 1
Теперь один пиксель в конечном изображении серого цвета (если мы будем продолжать вечно, полученное изображение будет полностью серым, поэтому очевидно, что в какой-то момент один пиксель станет серым), и если мы удалим этот последний пиксель, он снова станет полностью черным.
Создание исходного изображения
Рассмотрим гипотетическое исходное изображение, которое привело к нашему промежуточному изображению. Я не могу доказать, что это существует, но у меня есть сильное чувство, что оно существует. Например, если исходное изображение имеет размер
2N×2N
, это может быть:Изображение 2
При уменьшении изображения 2 до промежуточного размера мы получаем изображение 1.
И по гипотезе, при уменьшении до
64×64
, мы получаем одну серую точку на конечном изображении.Теперь давайте разберем последний добавленный пиксель и рассредоточим его вокруг исходного кластера:
Изображение 3
Это наш контрпример.
При уменьшении до окончательного размера это изображение должно дать нам серый пиксель, потому что рассеянные пиксели находятся еще ближе к кластеру, поэтому глобальная интенсивность, по крайней мере, так же высока.
При уменьшении до промежуточного размера это изображение должно пропустить специальный пиксель, потому что они разбросаны вокруг, поэтому мы получаем полностью черное изображение при двухэтапном изменении размера.
Вывод и будущие мысли
Я надеюсь, что это убеждает вас, что то, что вы пытаетесь достичь, не сработает в общем случае.
Мой подход к вашей проблеме должен был бы вычислить лучший размер для изображения : начните с исходного изображения и, например.
N = 128
, затем попробуйте все возможные углы и вычислите максимальную ошибку. Если максимальная ошибка не удовлетворяет, попробуйтеN = 256
и т. Д., Пока не получите правильный размер.источник