Dimensione ottimale dello sprite per le rotazioni


8

Sto realizzando un gioco basato su sprite, e ho un sacco di immagini che ottengo in una risoluzione ridicolmente grande e le ridimensiono in base alla dimensione dello sprite desiderata (ad esempio 64x64 pixel) prima di convertirle in una risorsa di gioco, quindi quando disegno il mio sprite all'interno del gioco, non devo ridimensionarlo.

Tuttavia, se ruoto questo piccolo sprite all'interno del gioco (motore in modo agnostico), alcuni pixel di destinazione verranno interpolati e lo sprite sembrerà macchiato.

Ciò dipende ovviamente dall'angolo di rotazione e dall'algoritmo di interpolazione, ma a prescindere, non ci sono dati sufficienti per campionare correttamente un pixel di destinazione specifico.

Quindi ci sono due soluzioni a cui riesco a pensare. Il primo consiste nell'utilizzare l'immagine enorme originale, ruotarla negli angoli desiderati, quindi ridimensionare tutte le varianti ricorrenti e metterle in un atlante, che ha il vantaggio di essere abbastanza semplice da implementare, ma consuma ingenuamente il doppio dello sprite spazio per ciascuna rotazione (ogni rotazione deve essere inscritta in un cerchio il cui diametro è la diagonale del rettangolo dello sprite originale, la cui area è doppia rispetto a quel rettangolo originale, supponendo sprite quadrate).

Ha anche lo svantaggio di avere solo un set predefinito di rotazioni disponibili, che può andare bene o no a seconda del gioco.

Quindi l'altra scelta sarebbe quella di memorizzare un'immagine più grande, e ruotare e ridimensionare durante il rendering, il che porta alla mia domanda.

Qual è la dimensione ottimale per questo sprite? Significato ottimale che un'immagine più grande non avrà alcun effetto sull'immagine risultante.

Ciò dipende sicuramente dalla dimensione dell'immagine, dalla quantità di rotazioni desiderate senza perdita di dati fino a 1/256, che è la differenza cromatica minima rappresentabile.

Sto cercando una risposta teorica generale a questo problema, perché provare un mucchio di taglie può andare bene, ma è tutt'altro che ottimale.


3
Questa non è una risposta utile, ma ho letto la domanda, ho detto "Oh, è facile!", Sono andato a scrivere una risposta, ho aggrottato le sopracciglia, l'ho letto di nuovo, e poi ci ho pensato molto duramente per alcuni minuti prima di concludere che non è, infatti, facile. Detto questo, il mio istinto è "il doppio della risoluzione su ciascun asse è perfetto o decisamente abbastanza buono", ma non ho prove per questo. Infine, sospetto che ciò dipenda in modo significativo dal kernel di downscaling con cui stai confrontando: un semplice kernel con una media di pixel può essere facile da analizzare e replicare, ma un kernel di Lanczos potrebbe rivelarsi impossibile.
ZorbaTHut,

Penso che la tua ipotesi che 1/256 sia il limite della differenza di colore accettabile delta sia errata perché il tradizionale spazio colore (sRGB) non è lineare.
Sam Hocevar,

@sam Potrebbe non essere lineare se confrontato con lo spettro della luce reale, ma la quantizzazione è lineare. Tuttavia, dipende in realtà dall'algoritmo di interpolazione e i risultati possono essere molto diversi per l'interpolazione lineare e dire bicubica. Ma anche senza interpolazione dovrebbe esserci un modo per calcolare la dimensione ottimale.
Panda Pajama,

@zorbathut La risposta è decisamente diversa a seconda dell'algoritmo di downsampling. Ma dovrebbe essere relativamente semplice trovare una soluzione generale per l'interpolazione più vicina o lineare. Ci sto ancora lavorando, ma penso che per 8 direzioni, sqrt (2) l'area sia ottimale. Fammi sapere dove sei arrivato
Panda Pajama,

Risposte:


7

Penso che quello che stai cercando di fare sia lo spazio dell'immagine 2D equivalente al doppio arrotondamento . Sono in grado di costruire una prova libera che è impossibile trovare una dimensione così intermedia, almeno nel caso di semplici algoritmi di downscaling come l'interpolazione lineare.

Supponiamo di aver trovato Ntale che l'immagine intermedia abbia dimensioni N×N, maggiori di 64×64. Supponiamo che non stiamo ancora applicando la rotazione (l'angolo è zero).

Ora costruiamo un'immagine che non funziona.

Costruire l'immagine intermedia

Considera un'immagine intermedia completamente nera. Ovviamente, anche l'immagine finale sarà completamente nera. Quindi, aggiungi un pixel grigio di intensità minima (R¸G, B = 1,1,1). L'immagine finale dovrebbe essere ancora completamente nera. Aggiungi un altro pixel grigio toccando il primo. Procedere costruendo un cerchio fino a quando l'immagine finale non sarà più completamente nera.

costruzione di un'immagine intermedia Immagine 1

Ora un pixel nell'immagine finale è grigio (se continuassimo per sempre, l'immagine risultante sarebbe completamente grigia, quindi ovviamente a un certo punto un pixel diventa grigio), e se rimuoviamo quell'ultimo pixel, sarà di nuovo completamente nero.

Costruire l'immagine originale

Considera l'ipotetica immagine originale che ha portato alla nostra immagine intermedia. Non posso provare che esista, ma ho la netta sensazione che lo sia. Ad esempio, se l'immagine originale ha dimensioni 2N×2N, potrebbe essere questa:

immagine originale Immagine 2

Quando si riduce l'immagine 2 alla dimensione intermedia, si ottiene l'immagine 1.

E per ipotesi, quando si esegue il downscaling 64×64, si ottiene un punto grigio nell'immagine finale.

Ora dividiamo l'ultimo pixel che abbiamo aggiunto e lo dividiamo nel cluster originale:

immagine non funzionanteImmagine 3

Questo è il nostro contro-esempio.

Quando viene ridimensionato alla dimensione finale, questa immagine dovrebbe darci un pixel grigio, perché i pixel che abbiamo sparso sono ancora più vicini al cluster, quindi l'intensità globale è almeno altrettanto elevata.

Quando viene ridimensionato alla dimensione intermedia, questa immagine dovrebbe perdere il pixel speciale perché sono stati sparsi, quindi otteniamo un'immagine completamente nera quando si esegue il ridimensionamento in due passaggi.

Conclusione e pensieri futuri

Spero che questo ti convinca che ciò che stai cercando di ottenere non funzionerà nel caso generale.

Il mio approccio al tuo problema sarebbe quello di calcolare la dimensione migliore per immagine : iniziare con l'immagine originale e ad es. N = 128, quindi prova tutti gli angoli possibili e calcola l'errore massimo. Se l'errore massimo non è soddisfacente, provare N = 256 ecc. Fino ad ottenere la dimensione corretta.


Vedere questo problema come un doppio arrotondamento è un approccio piuttosto interessante, ma vorrei essere in disaccordo con la tua ipotesi che sia impossibile, dal momento che lo stai guardando numericamente, non come un problema di segnale. Consideriamo un segnale monodimensionale. Campionandolo in n punti, conserveremo tutte le informazioni con frequenze fino a 1 / 2n . Usando il teorema di Nyquist, è possibile campionare il segnale in punti m> n , quindi ricampionarlo in n punti e arrivare allo stesso risultato come se lo avessimo inizialmente campionato in n punti. Questo può essere facilmente esteso alle dimensioni n.
Panda Pajama,

1
@PandaPajama purtroppo invocando Nyquist supponi che il segnale possa essere rigorosamente limitato alla banda, il che non accade quando i nostri campioni si trovano su un dominio discreto. Questo è ciò che sfrutta il mio contro-esempio e perché è legato all'arrotondamento.
Sam Hocevar,

Se l'immagine originale è arbitrariamente grande, può essere considerata come se fosse su un dominio continuo. Tuttavia, su una discussione più pratica, il tuo argomento è valido quando si considera un algoritmo molto specifico per il downscaling con una dimensione molto specifica (2x). Le interpolazioni più vicine, bilineari e bicubiche daranno risultati diversi. In particolare per il vicino più vicino, credo che sia possibile costruire geometricamente una soluzione generale, ma che dovrà aspettare il fine settimana.
Panda Pajama,

1
@PandaPajama hai di nuovo ragione, immagini molto grandi possono essere considerate continue, ma il problema è che l'immagine intermedia è ancora su un dominio discreto. Inoltre, il vicino più vicino non soffrirà per definizione del problema dell'arrotondamento, ma a parte casi banali soffrirà di 1) problemi relativi al teorema di equidistribuzione che renderà la dimensione minima vicina a 6400 × 6400, vale a dire. abbastanza poco pratico e 2) gravi problemi di aliasing.
Sam Hocevar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.