L'immagine seguente mostra due sprite resi con campionamento di punti su uno sfondo:
- Il cranio sinistro non ha rotazione / ridimensionamento applicati, quindi ogni pixel si abbina perfettamente allo sfondo.
- Il cranio destro viene ruotato / ridimensionato e ciò si traduce in pixel più grandi che non sono più allineati agli assi .
Come potrei sviluppare un pixel shader che renderebbe lo sprite trasformato sulla destra con pixel allineati agli assi della stessa dimensione del resto della scena?
Ciò potrebbe essere correlato al modo in cui il ridimensionamento dello sprite è stato implementato nei vecchi giochi come Monkey Island, perché è l'effetto che sto cercando di ottenere, ma con l'aggiunta della rotazione.
modificare
Secondo i suggerimenti di kaoD, ho cercato di affrontare il problema come post-processo. L'approccio più semplice è stato il rendering prima su una destinazione di rendering separata (downsampling per corrispondere alla dimensione del pixel desiderata) e quindi l'upscaling quando si esegue il rendering una seconda volta. Ha soddisfatto le mie esigenze di cui sopra.
Per prima cosa ho provato a farlo Linear -> Point
e il risultato è stato questo:
Non c'è distorsione ma il risultato appare sfocato e perde la maggior parte dei colori delle luci. Secondo me rompe il look retrò di cui avevo bisogno.
La seconda volta che ho provato Point -> Point
e il risultato è stato questo:
Nonostante la distorsione, penso che potrebbe essere abbastanza buono per le mie esigenze, sebbene appaia meglio come fermo immagine che in movimento.
Per dimostrare, ecco un video dell'effetto, sebbene YouTube ne abbia filtrato i pixel:
Tuttavia, lascerò la domanda aperta per qualche giorno in più nel caso in cui qualcuno trovi una soluzione di campionamento migliore che mantenga l'aspetto nitido mentre diminuisce la quantità di distorsione durante lo spostamento.
SpriteBatch
richiede l'utilizzo della modalità Immediata, quindi non vale la pena. Vado con questo :)