Qual è un buon metodo per colorare trame basate su una tavolozza in XNA?


8

Ho provato a lavorare su un gioco con l'aspetto di un gioco a 8 bit usando XNA, in particolare usando il NES come guida.

Il NES ha una palette molto specifica e ogni sprite può usare fino a 4 colori da quella palette. Come potrei emularlo? Il modo in cui realizzo ciò è che ho una trama con valori definiti che fungono da indici a una matrice di colori che passo alla GPU. Immagino che ci debba essere un modo migliore di questo, ma forse questo è il modo migliore?

Non voglio semplicemente assicurarmi di disegnare ogni sprite con i colori giusti perché voglio essere in grado di modificare dinamicamente la palette. Preferirei anche non alterare la trama direttamente utilizzando la CPU.

Risposte:


7

Penso che quello che stai facendo vada bene.

Se avessi più di quattro colori, potrei suggerire di leggere una trama dipendente: Invece di usare il valore della trama per cercare una matrice di colori (suppongo che tu li passi come parametri shader), potresti usarla per cercare un colore in un'altra trama 1D contenente la tavolozza.

Ma questo ha alcune implicazioni sulle prestazioni - e penso che ti limiti a PS 2.0.

(Ci sono alcune altre ottimizzazioni subdole possibili se devi cambiare tavolozza ogni sprite e tutti i lotti extra stanno uccidendo le prestazioni. Ma immagino che in un gioco simile a NES non sia così.)

Penso che ciò che potrebbe essere utile nella tua situazione sia usare la pipeline di contenuti XNA per prendere una versione a colori dello sprite facilmente modificabile, controllare che usi solo quattro colori, convertirlo in una trama con i tuoi quattro livelli di scala di grigi (utilizzabile dal tuo shader), e forse anche l'output della tavolozza dei colori originale lungo il lato della trama.

I campioni di Creators Club per la pipeline di contenuti potrebbero essere un buon punto di partenza.


1
+1 La pipeline di contenuti può essere talvolta tua amica. Usalo a tuo vantaggio.
Michael Coleman,

1

Sarebbe rallentare la creazione di una classe composita che può contenere fino a 4 oggetti che sono uno di ogni colore per lo sprite e combinarli nello sprite che viene disegnato. Quindi ogni sprite è un composto di un massimo di 4 sprite combinati e quindi disegnati.

Quindi potresti cambiare 1 colore tramite quella classe e l'intero sprite cambierebbe.

(nota, non ho fatto XNA ma questo potrebbe scatenare alcune idee con te.)


1

Se non ti interessa nulla delle prestazioni della memoria, potresti memorizzare i tuoi sprite non compressi in modo tale che i pixel con il colore 0 siano rosso puro, 1 verde puro, 2 blu puro e 3 alfa puro.

Quando stai per eseguire il rendering di uno sprite, imposta una costante di shader pixel matrix composta da quattro vettori che corrispondono ai colori 0, 1, 2, 3. Nel pixel shader, esegui il codice seguente per ricolorare lo sprite texel:

float4 unpaletted = tex2D( texture, uv );
float4 paletted = mul( unpaletted, paletteMatrix );

Questo funziona perché quando un pixel è di colore 0, è rosso puro e quindi finirà come

1 * palette[0] + 0 * palette[1] + 0 * palette[2] + 0 * palette[3]

o

1 * palette[0]

e lo stesso vale per i colori 1, 2 e 3.

Se ti preoccupi delle prestazioni della memoria, allora memorizza la tua tavolozza NES come una trama non compressa RGB 256x1, imposta il filtro delle trame sul vicino più vicino, archivia i tuoi sprite come trame a canale singolo non compresso a 8 bit e fai un codice shader simile a questo :

float palette_index = tex2D( texture, uv );
float4 color = tex1D( palette, palette_index * 255 );
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.