Оптимальный размер спрайта для вращений

8

Я делаю игру на основе спрайтов, и у меня есть куча изображений, которые я получаю с невероятно большим разрешением, и я масштабирую их до желаемого размера спрайта (например, 64x64 пикселей), прежде чем преобразовать их в игровой ресурс, поэтому, когда рисую спрайт внутри игры, мне не нужно его масштабировать.

Однако, если я поверну этот маленький спрайт внутри игры (независимо от движка), некоторые пиксели назначения будут интерполированы, и спрайт будет выглядеть нечетким.

Это, конечно, зависит от угла поворота, а также от алгоритма интерполяции, но, тем не менее, недостаточно данных для правильной выборки определенного целевого пикселя.

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

Он также имеет недостаток, заключающийся в наличии только заранее определенного набора вращений, который может быть нормальным или нет в зависимости от игры.

Таким образом, другой выбор - хранить увеличенное изображение, а также поворачивать и уменьшать его масштаб при рендеринге, что приводит к моему вопросу.

Каков оптимальный размер для этого спрайта? Оптимальный смысл, что большее изображение не будет иметь никакого эффекта в получающемся изображении.

Это определенно зависит от размера изображения, количества желаемых поворотов без потери данных до 1/256, что является минимальной представимой разницей в цвете.

Я ищу теоретический общий ответ на эту проблему, потому что попробовать кучу размеров может быть хорошо, но далеко не оптимально.

Панда Пижама
источник
3
Это не очень полезный ответ, но я перечитал вопрос, сказал: «О, это просто!», Пошел писать ответ, нахмурился, прочитал его еще раз, а затем несколько раз задумался над этим, прежде чем заключить, что на самом деле это не так просто. Тем не менее, мой инстинкт инстинкта таков: «Разрешение по каждой оси в два раза превосходно или определенно достаточно хорошо», но у меня нет никаких доказательств этого. Наконец, я подозреваю, что это сильно зависит от ядра для масштабирования, с которым вы сравниваете - простое ядро ​​с усреднением по пикселям может быть легко проанализировать и воспроизвести, но ядро ​​Lanczos может оказаться невозможным.
ZorbaTHut
Я думаю, что ваше предположение, что 1/256 является пределом допустимой разницы в цвете, неверно, поскольку традиционное цветовое пространство (sRGB) является нелинейным.
Сэм Хоцевар
@sam Может быть не линейным при сравнении с фактическим спектром света, но квантование является линейным. Однако это действительно зависит от алгоритма интерполяции, и результаты могут сильно отличаться для линейной и, скажем, бикубической интерполяции. Но даже без интерполяции должен быть способ рассчитать оптимальный размер.
Панда Пижама
@zorbathut Ответ определенно отличается в зависимости от алгоритма понижающей дискретизации. Но должно быть относительно просто придумать общее решение для ближайшего соседа или линейной интерполяции. Я все еще работаю над этим, но я думаю, что для 8 направлений, sqrt (2) площадь является оптимальной. Дайте мне знать, куда вы попали
Panda Pajama

Ответы:

7

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

Предположим, мы нашли Nтакое, что промежуточное изображение имеет размер N×Nбольше, чем 64×64. Предположим, что мы даже не применяем вращение (угол равен нулю).

Теперь давайте создадим картинку, которая не работает.

Построение промежуточного изображения

Рассмотрим полностью черное промежуточное изображение. Очевидно, что окончательное изображение также будет полностью черным. Затем добавьте один серый пиксель минимальной интенсивности (R¸G, B = 1,1,1). Окончательное изображение должно быть полностью черным. Добавьте еще один серый пиксель, касающийся первого. Продолжайте строить круг, пока окончательное изображение больше не станет полностью черным.

построение промежуточного изображения Изображение 1

Теперь один пиксель в конечном изображении серого цвета (если мы будем продолжать вечно, полученное изображение будет полностью серым, поэтому очевидно, что в какой-то момент один пиксель станет серым), и если мы удалим этот последний пиксель, он снова станет полностью черным.

Создание исходного изображения

Рассмотрим гипотетическое исходное изображение, которое привело к нашему промежуточному изображению. Я не могу доказать, что это существует, но у меня есть сильное чувство, что оно существует. Например, если исходное изображение имеет размер 2N×2N, это может быть:

исходное изображение Изображение 2

При уменьшении изображения 2 до промежуточного размера мы получаем изображение 1.

И по гипотезе, при уменьшении до 64×64, мы получаем одну серую точку на конечном изображении.

Теперь давайте разберем последний добавленный пиксель и рассредоточим его вокруг исходного кластера:

нерабочее изображениеИзображение 3

Это наш контрпример.

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

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

Вывод и будущие мысли

Я надеюсь, что это убеждает вас, что то, что вы пытаетесь достичь, не сработает в общем случае.

Мой подход к вашей проблеме должен был бы вычислить лучший размер для изображения : начните с исходного изображения и, например. N = 128, затем попробуйте все возможные углы и вычислите максимальную ошибку. Если максимальная ошибка не удовлетворяет, попробуйте N = 256 и т. Д., Пока не получите правильный размер.

Сэм Хоцевар
источник
Рассматривать эту проблему как двойное округление - довольно интересный подход, но я хотел бы не согласиться с вашей гипотезой о том, что это невозможно, поскольку вы смотрите на это численно, а не как на проблему сигнала. Давайте рассмотрим одномерный сигнал. Выбрав его в n точках, мы сохраним всю информацию с частотами до 1 / 2n . Используя теорему Найквиста, можно попробовать сигнал при т> п точек, а затем ресэмплировать его в п точках, и приходим к тому же результату , как если бы мы первоначально образцы его в п точках. Это может быть легко расширено до n-измерений.
Панда Пижама
1
@PandaPajama, к сожалению, вызывая Nyquist, вы предполагаете, что сигнал может быть строго ограничен по полосе, а это не тот случай, когда наши выборки находятся над дискретной областью. Это то, что использует мой контрпример и почему это связано с округлением.
Сэм Хоцевар
Если исходное изображение произвольно большое, его можно рассматривать так, как если бы оно находилось в непрерывной области. Тем не менее, при более практическом обсуждении ваш аргумент действителен при рассмотрении очень специфического алгоритма для уменьшения масштаба с очень конкретным размером (2x). Блинейная и бикубическая интерполяция ближайших соседей даст разные результаты. Специально для ближайшего соседа, я считаю, что можно геометрически построить общее решение, но это придется подождать до выходных.
Панда Пижама
1
@PandaPajama Вы снова правы, очень большие изображения можно считать непрерывными, но проблема в том, что промежуточное изображение все еще находится в дискретной области. Кроме того, ближайший сосед не будет страдать от проблемы округления по определению, но кроме тривиальных случаев он будет страдать от 1) проблем, связанных с теоремой равнораспределения , которые сделают минимальный размер близким к 6400 × 6400, т.е. довольно непрактично, и 2) серьезные проблемы с алиасами.
Сэм Хоцевар