Palette de couleur sur vos consoles ? (neogeo)
3 participants
Page 1 sur 1
Palette de couleur sur vos consoles ? (neogeo)
Bonjour à tous,
Je suis entrain de developper sur la neogeo un jeu, et cette console manque d'outil, alors je suis entrain de les fabriquer pour mon jeu avec tomna.
Mon problème est la gestion du FixLayer, comme son nom l'indique, c'est un calque fix qui sert aux credit, score, ou autre données fixes.
Seulement, j'ai besoin de gérer les palettes en Asm, et de récupérer en byte les codes couleurs.
Mon outil est en c# sur visual studio, je load mon image et je parcours pixel par pixel pour stocker ma palette dans un tableau. (pas compliqué)
Là ou cela se corse, c'est que je recupere une valeur RGB ou Hexa et j'ai besoin de l'encode en 4 bytes dit (4bpp) comme la snes pas dans le meme ordre.
voilà ce que j'ai dans l'aide
https://wiki.neogeodev.org/index.php?title=Palettes
https://wiki.neogeodev.org/index.php?title=Fix_layer
https://wiki.neogeodev.org/index.php?title=Fix_graphics_format
Mon format est : D RGBRRRRGGGGBBBB
j'ai trouvé une info sur le forum de GBA.
http://www.playeradvance.org/forum/archive/index.php/t-3709.html
il code la couleur sur 5 bit. mais au format : xbbbbbgggggrrrrr
((((b)>>3)<<10)+(((g)>>3)<<5)+((r)>>3))
En faisant mes calculs je suis arrivé à çà mais c'est pas bon :
int nColor =((pixelColor.ToArgb())>>3<<12)+((dRed)>>4<<8)+((dGreen)>>4<<4)+((dBlue)>>4);
Comment vous faites sur megadrive, pcengine, nes, ou autre console pour ceux qui programme.
D'avance merci à vous,
Je suis entrain de developper sur la neogeo un jeu, et cette console manque d'outil, alors je suis entrain de les fabriquer pour mon jeu avec tomna.
Mon problème est la gestion du FixLayer, comme son nom l'indique, c'est un calque fix qui sert aux credit, score, ou autre données fixes.
Seulement, j'ai besoin de gérer les palettes en Asm, et de récupérer en byte les codes couleurs.
Mon outil est en c# sur visual studio, je load mon image et je parcours pixel par pixel pour stocker ma palette dans un tableau. (pas compliqué)
Là ou cela se corse, c'est que je recupere une valeur RGB ou Hexa et j'ai besoin de l'encode en 4 bytes dit (4bpp) comme la snes pas dans le meme ordre.
voilà ce que j'ai dans l'aide
https://wiki.neogeodev.org/index.php?title=Palettes
https://wiki.neogeodev.org/index.php?title=Fix_layer
https://wiki.neogeodev.org/index.php?title=Fix_graphics_format
Mon format est : D RGBRRRRGGGGBBBB
j'ai trouvé une info sur le forum de GBA.
http://www.playeradvance.org/forum/archive/index.php/t-3709.html
il code la couleur sur 5 bit. mais au format : xbbbbbgggggrrrrr
((((b)>>3)<<10)+(((g)>>3)<<5)+((r)>>3))
En faisant mes calculs je suis arrivé à çà mais c'est pas bon :
int nColor =((pixelColor.ToArgb())>>3<<12)+((dRed)>>4<<8)+((dGreen)>>4<<4)+((dBlue)>>4);
Comment vous faites sur megadrive, pcengine, nes, ou autre console pour ceux qui programme.
D'avance merci à vous,
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Re: Palette de couleur sur vos consoles ? (neogeo)
Plusieurs questions pour pouvoir t'aider :
- de quelle taille sont tes composantes R V B (dRed, dGreen, dBlue) - j'imagine du 8 bits par composante ?
- c'est quoi pixelColor.ToArgb() ?
- as-tu une valeur de Dark bit à ajouter dans ton code palette (le bit n°15 d'après le lien que tu as donné ?
- de quelle taille sont tes composantes R V B (dRed, dGreen, dBlue) - j'imagine du 8 bits par composante ?
- c'est quoi pixelColor.ToArgb() ?
- as-tu une valeur de Dark bit à ajouter dans ton code palette (le bit n°15 d'après le lien que tu as donné ?
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Palette de couleur sur vos consoles ? (neogeo)
Salut vingazole.
Alors oui les couleurs sont en.8bit
Le pixelColor.toArgb est la valeur décimale de la.couleur du pixel.
Et pour le darkbit tu mets 1 la neogeo l utilise et 0 ne l utilise pas.
Alors oui les couleurs sont en.8bit
Le pixelColor.toArgb est la valeur décimale de la.couleur du pixel.
Et pour le darkbit tu mets 1 la neogeo l utilise et 0 ne l utilise pas.
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Re: Palette de couleur sur vos consoles ? (neogeo)
Si tu as tes 3 composantes dRed, dGreen et dBlue sur 8 bits, je te propose d'utiliser 3 nouvelles variables représentant les composantes RVB sur 5 bits pour simplifier le calcul de nColor :
- Code:
unsigned int nBlue, nGreen, nRed;
nBlue = dBlue >> 3;
nGreen = dGreen >> 3;
nRed = dRed >>3;
nColor = (nBlue >> 1) + (nGreen >> 1) << 4 + (nRed >> 1) << 8 + (nBlue & 1) << 12 + (nGreen & 1) << 13 + (nRed & 1) << 14 + nDarkbit <<15;
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Palette de couleur sur vos consoles ? (neogeo)
vingazole a écrit:Si tu as tes 3 composantes dRed, dGreen et dBlue sur 8 bits, je te propose d'utiliser 3 nouvelles variables représentant les composantes RVB sur 5 bits pour simplifier le calcul de nColor :
- Code:
unsigned int nBlue, nGreen, nRed;
nBlue = dBlue >> 3;
nGreen = dGreen >> 3;
nRed = dRed >>3;
nColor = (nBlue >> 1) + (nGreen >> 1) << 4 + (nRed >> 1) << 8 + (nBlue & 1) << 12 + (nGreen & 1) << 13 + (nRed & 1) << 14 + nDarkbit <<15;
Merci vingazole,
Ca marche, en comparant avec l'outil FixConv qui sort une palette, mais l'exe est trop limité, je suis entrain de le réécrire.
Comment tu as fait pour comprendre qu'il fallait fait BGR BRG + DARKBIT dans ton code
alors que le format attendue : D RGB RRRR GGGG BBBB
ce serait super de comprendre.
vraiment merci,
ps : fabrice me targue d'eloge sur toi, et ce que tu fais en sms, c'est vraiment fort.
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Re: Palette de couleur sur vos consoles ? (neogeo)
Quand tu dis que le format attendu est D RGB RRRR GGGG BBBB, ce n'est pas assez précis.
Le lien que tu as donné (https://wiki.neogeodev.org/index.php?title=Palettes) est plus explicite :
D R0 G0 B0 R4 R3 R2 R1 G4 G3 G2 G1 B4 B3 B2 B1
D représente le Dark bit, R0..4 G0..4 B0..4 indiquent où placer les bits de différents poids des composantes RGB.
Il suffit alors de placer les différents bits aux bons endroits, je vais t'expliquer pour la composante verte, c'est similaire pour le rouge et le bleu.
Au départ on a :
nGreen = 0 0 0 0 0 0 0 0 0 0 0 G4 G3 G2 G1 G0
On décale de 1 bit vers la droite pour "éliminer" G0 :
nGreen >> 1 = 0 0 0 0 0 0 0 0 0 0 0 0 G4 G3 G2 G1
Et on place G1..4 au bon endroit en décalant de 4 positions vers la gauche :
(nGreen >> 1) << 4 = 0 0 0 0 0 0 0 0 G4 G3 G2 G1 0 0 0 0
Il reste le bit de poids le plus faible (G0) à placer en position 13 :
On isole d'abord ce bit en mettant tous les autres à zéro :
nGreen & 1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 G0
et on décale de 13 positions vers la gauche pour envoyer G0 à la position voulue :
(nGreen & 1) << 13 = 0 0 G0 0 0 0 0 0 0 0 0 0 0 0 0 0
En additionnant les deux résultats on a bien tous les bits de la composante verte en place :
(nGreen >> 1) << 4 + (nGreen & 1) << 13 = 0 0 G0 0 0 0 0 0 G4 G3 G2 G1 0 0 0 0
ps: merci pour le compliment
Le lien que tu as donné (https://wiki.neogeodev.org/index.php?title=Palettes) est plus explicite :
D R0 G0 B0 R4 R3 R2 R1 G4 G3 G2 G1 B4 B3 B2 B1
D représente le Dark bit, R0..4 G0..4 B0..4 indiquent où placer les bits de différents poids des composantes RGB.
Il suffit alors de placer les différents bits aux bons endroits, je vais t'expliquer pour la composante verte, c'est similaire pour le rouge et le bleu.
Au départ on a :
nGreen = 0 0 0 0 0 0 0 0 0 0 0 G4 G3 G2 G1 G0
On décale de 1 bit vers la droite pour "éliminer" G0 :
nGreen >> 1 = 0 0 0 0 0 0 0 0 0 0 0 0 G4 G3 G2 G1
Et on place G1..4 au bon endroit en décalant de 4 positions vers la gauche :
(nGreen >> 1) << 4 = 0 0 0 0 0 0 0 0 G4 G3 G2 G1 0 0 0 0
Il reste le bit de poids le plus faible (G0) à placer en position 13 :
On isole d'abord ce bit en mettant tous les autres à zéro :
nGreen & 1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 G0
et on décale de 13 positions vers la gauche pour envoyer G0 à la position voulue :
(nGreen & 1) << 13 = 0 0 G0 0 0 0 0 0 0 0 0 0 0 0 0 0
En additionnant les deux résultats on a bien tous les bits de la composante verte en place :
(nGreen >> 1) << 4 + (nGreen & 1) << 13 = 0 0 G0 0 0 0 0 0 G4 G3 G2 G1 0 0 0 0
ps: merci pour le compliment
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Palette de couleur sur vos consoles ? (neogeo)
Vingazole,
Un grand merci à toi, j'ai tout compris, c'est nickel.
finalement, on garde les 5 bits de couleurs, on en perd aucune, alors que je pensais que c'etait codé en 4 bits.
Tu as du faire des outils de fou pour la master system.
encore merci , tu es un bon pédagogue, et cela m'aide beaucoup
Un grand merci à toi, j'ai tout compris, c'est nickel.
finalement, on garde les 5 bits de couleurs, on en perd aucune, alors que je pensais que c'etait codé en 4 bits.
Tu as du faire des outils de fou pour la master system.
encore merci , tu es un bon pédagogue, et cela m'aide beaucoup
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Re: Palette de couleur sur vos consoles ? (neogeo)
Il faut reconnaître que le format de palette avec le bit de poids le plus faible de chaque composante "envoyé" dans les positions 12, 13, 14 est un peu spécial !pckid a écrit:finalement, on garde les 5 bits de couleurs, on en perd aucune, alors que je pensais que c'etait codé en 4 bits.
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Palette de couleur sur vos consoles ? (neogeo)
Salut Vingazole
dans le nColor en int, j'ai une erreur de conversion ça sort à 0,
tu aurais une idée ?
j'ai essaye aussi avec l'operateur pour les bytes en c# c'est |
nColor = (nBlue >> 1) | ((nGreen >> 1) << 4) | ((nRed >> 1) << 8) | ((nBlue & 1) << 12) | ((nGreen & 1) << 13) | ((nRed & 1) << 14) | (nDarkBit <<15);
mais la valeur n'est pas bonne.
Sinon j'ai cette function qui vient d'un outil pour la neogeo que j'ai converti
dans le nColor en int, j'ai une erreur de conversion ça sort à 0,
tu aurais une idée ?
- Code:
/// D RGB RRRR GGGG BBBB
/// D R0 G0 B0 R4 R3 R2 R1 G4 G3 G2 G1 B4 B3 B2 B1
public int GetColorVingazole(Color cPixColor) {
int nColor = 0;
int nBlue, nGreen, nRed, nDarkBit;
nBlue = cPixColor.B >> 3;
nGreen = cPixColor.G >> 3;
nRed = cPixColor.R >> 3;
nDarkBit= 0;
nColor = (nBlue >> 1) + (nGreen >> 1) << 4 + (nRed >> 1) << 8 + (nBlue & 1) << 12 + (nGreen & 1) << 13 + (nRed & 1) << 14 + nDarkBit <<15;
return nColor;
}
j'ai essaye aussi avec l'operateur pour les bytes en c# c'est |
nColor = (nBlue >> 1) | ((nGreen >> 1) << 4) | ((nRed >> 1) << 8) | ((nBlue & 1) << 12) | ((nGreen & 1) << 13) | ((nRed & 1) << 14) | (nDarkBit <<15);
mais la valeur n'est pas bonne.
Sinon j'ai cette function qui vient d'un outil pour la neogeo que j'ai converti
- Code:
public int GetColorFixConv(Color cPixColor) {
int nColor = 0;
// Ancien Code
//quad.r /= (double)8.2258064516;
//quad.g /= (double)8.2258064516;
//quad.b /= (double)8.2258064516;
Byte dRed = Convert.ToByte(cPixColor.R / (double)8.2258064516);
Byte dGreen = Convert.ToByte(cPixColor.G / (double)8.2258064516);
Byte dBlue = Convert.ToByte(cPixColor.B / (double)8.2258064516);
nColor = ((dRed&1)<<6)|((dGreen&1)<<5)|((dBlue&1)<<4);
dRed >>= 1;
dGreen >>= 1;
dBlue >>= 1;
nColor |= ((dBlue&15)<<8)|((dGreen&15)<<12)|(dRed&15);
return nColor;
}
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Re: Palette de couleur sur vos consoles ? (neogeo)
Alors d'abord, au temps pour moi, j'aurais dû mettre des parenthèses partout pour que la formule marche avec des additions (sinon on a des problèmes de priorités entre les différents opérateurs) :
nColor = (nBlue >> 1) + ((nGreen >> 1) << 4) + ((nRed >> 1) << 8) + ((nBlue & 1) << 12) + ((nGreen & 1) << 13) + ((nRed & 1) << 14) + (nDarkBit <<15);
mais tu as raison, c'est plus propre d'utiliser le OU bit à bit (opérateur |) :
nColor = (nBlue >> 1) | (nGreen >> 1) << 4 | (nRed >> 1) << 8 | (nBlue & 1) << 12 | (nGreen & 1) << 13 | (nRed & 1) << 14 | nDarkBit <<15;
J'ai vérifié en fixant des valeurs pour nBlue, nGreen et nRed : la formule fonctionne, elle répartit bien les bits de chaque composante selon le schéma D R0 G0 B0 R4 R3 R2 R1 G4 G3 G2 G1 B4 B3 B2 B1.
Si on ne trouve pas les valeurs que tu attends ça peut venir de deux choses :
- soit le schéma de palette qu'on utilise n'est pas le bon (j'ai un doute car la fonction GetColorFixConv que tu donnes semble suivre le schéma G4 G3 G2 G1 B4 B3 B2 B1 0 R0 G0 B0 R4 R3 R2 R1 (sauf erreur de ma part, j'ai tracé ça "à la main"...)).
- soit la manière de convertir les valeurs RGB 8 bits en valeurs 5 bits n'est pas la même que celle que ton outil (FixConv si j'ai bien suivi) utilise.
En effet en faisant cPixColor.B >> 3 on fait une simple division entière par 8; dans la fonction GetColorFixConv on a une "mise à l'échelle" (255/31=8.2258064516...), donnant un résultat plus précis. Néanmoins, les valeurs obtenues par ces méthodes doivent produire des valeurs proches et le résultat à l'écran ne doit pas être très éloigné.
nColor = (nBlue >> 1) + ((nGreen >> 1) << 4) + ((nRed >> 1) << 8) + ((nBlue & 1) << 12) + ((nGreen & 1) << 13) + ((nRed & 1) << 14) + (nDarkBit <<15);
mais tu as raison, c'est plus propre d'utiliser le OU bit à bit (opérateur |) :
nColor = (nBlue >> 1) | (nGreen >> 1) << 4 | (nRed >> 1) << 8 | (nBlue & 1) << 12 | (nGreen & 1) << 13 | (nRed & 1) << 14 | nDarkBit <<15;
J'ai vérifié en fixant des valeurs pour nBlue, nGreen et nRed : la formule fonctionne, elle répartit bien les bits de chaque composante selon le schéma D R0 G0 B0 R4 R3 R2 R1 G4 G3 G2 G1 B4 B3 B2 B1.
Si on ne trouve pas les valeurs que tu attends ça peut venir de deux choses :
- soit le schéma de palette qu'on utilise n'est pas le bon (j'ai un doute car la fonction GetColorFixConv que tu donnes semble suivre le schéma G4 G3 G2 G1 B4 B3 B2 B1 0 R0 G0 B0 R4 R3 R2 R1 (sauf erreur de ma part, j'ai tracé ça "à la main"...)).
- soit la manière de convertir les valeurs RGB 8 bits en valeurs 5 bits n'est pas la même que celle que ton outil (FixConv si j'ai bien suivi) utilise.
En effet en faisant cPixColor.B >> 3 on fait une simple division entière par 8; dans la fonction GetColorFixConv on a une "mise à l'échelle" (255/31=8.2258064516...), donnant un résultat plus précis. Néanmoins, les valeurs obtenues par ces méthodes doivent produire des valeurs proches et le résultat à l'écran ne doit pas être très éloigné.
Dernière édition par vingazole le Lun 28 Sep 2015 - 4:50, édité 1 fois (Raison : + au lieu de |)
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Palette de couleur sur vos consoles ? (neogeo)
bah comme tu as voulu que je réponde , mais vingazole a très bien répondu.
C'est le code épurée le seul 'hic' c'est qu'il converti en 4096 couleur mais ça te donne l'idée de l'algo , mais c'est en plus pas très visible a l'oeil nu ces pertes de couleur
Celle qui est plus complète :
- Code:
red = pixel[i+0]/16; //Rouge
green = pixel[i+1]/16; //Vert
blue = pixel[i+2]/16; //Bleu
couleur = red + (green<<4) + (blue<<8);
C'est le code épurée le seul 'hic' c'est qu'il converti en 4096 couleur mais ça te donne l'idée de l'algo , mais c'est en plus pas très visible a l'oeil nu ces pertes de couleur
Celle qui est plus complète :
- Code:
red = pixel[i+0]/31; //Rouge
green = pixel[i+1]/31; //Vert
blue = pixel[i+2]/31; //Bleu
couleur = (red&0x0F) + ( (green&0x0F) << 4) + ( (blue&0x0F) << 8) + (blue&0x01) << 12 + (greenn&0x01) << 13 + (red&0x01) << 14;
Invité- Invité
Re: Palette de couleur sur vos consoles ? (neogeo)
Merci Vingazole et Kannagi.
Je verrais demain ton code mais je vois que tu gères pas le Darkbit,
avec HpMan j'ai compris comment gérer le Darkbit, ce qui me permet avec l'algo de vingazole, très proche des valeurs du Buildchar de Hpman.
J'ai hate de voir ton travail Kannagi sur neogeo, car il y a du boulot pour faire un jeu,
Le fixlayer, le son, le fading, DatLib, et si tu dépasses la taille des eprom, et la gestion des palettes.
Tu fais tout à la mano , ou tu te crées des tools ?
Je verrais demain ton code mais je vois que tu gères pas le Darkbit,
avec HpMan j'ai compris comment gérer le Darkbit, ce qui me permet avec l'algo de vingazole, très proche des valeurs du Buildchar de Hpman.
J'ai hate de voir ton travail Kannagi sur neogeo, car il y a du boulot pour faire un jeu,
Le fixlayer, le son, le fading, DatLib, et si tu dépasses la taille des eprom, et la gestion des palettes.
Tu fais tout à la mano , ou tu te crées des tools ?
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Re: Palette de couleur sur vos consoles ? (neogeo)
Non je gere pas vraiment le Darkbit (enfin j'ai pas eu le temps de me pencher dessus) m ais disons que visuellement ça me va donc bon :)
Bah ça dépend quel jeu je dois faire un beat them all ça peut aller très vite , a vrai dire je suis tres occupé IRL donc j'ai mis ça de coté mais des que j'ai du temps libre je bosserai dessus
Je te l'ai deja dit je fait juste de l'assembleur + outils perso.
De plus la plupart des outils sont pour windows donc je ne les utilise mème pas.
pckid a écrit:J'ai hate de voir ton travail Kannagi sur neogeo, car il y a du boulot pour faire un jeu,
Le fixlayer, le son, le fading, DatLib, et si tu dépasses la taille des eprom, et la gestion des palettes.
Tu fais tout à la mano , ou tu te crées des tools ?
Bah ça dépend quel jeu je dois faire un beat them all ça peut aller très vite , a vrai dire je suis tres occupé IRL donc j'ai mis ça de coté mais des que j'ai du temps libre je bosserai dessus
Je te l'ai deja dit je fait juste de l'assembleur + outils perso.
De plus la plupart des outils sont pour windows donc je ne les utilise mème pas.
Invité- Invité
Re: Palette de couleur sur vos consoles ? (neogeo)
Je renvoie ceux que ça intéresse ici, découvrir les joies du DAC neo geo.
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: Palette de couleur sur vos consoles ? (neogeo)
Pfff, tout ça pour nous faire lire ça :Je renvoie ceux que ça intéresse ici, découvrir les joies du DAC neo geo.
Quel frimeur ce HpmanMy actual project is to develop a side-scrolling shooting game for the Neo-Geo, which is really not an all-new idea but comparatively easy to program - particularly by using HPMAN's amazing DATlib.
PS:Intéressant ton lien soit dit en passant .
Invité- Invité
Re: Palette de couleur sur vos consoles ? (neogeo)
[HS]
@Touko
Il y a aussi ce projet sur Datlib
http://www.yaronet.com/board/topic/171575#post-16
@Touko
Il y a aussi ce projet sur Datlib
http://www.yaronet.com/board/topic/171575#post-16
pckid- Infirmier
- Nombre de messages : 3753
Age : 47
Localisation : ile de france (94)
Date d'inscription : 29/09/2011
Sujets similaires
» [rech] console neogeo pocket couleur
» [Rch] Consoles N64 de couleur
» [Rche] Toutes consoles N64 de couleur en loose
» [EST] Estimation consoles NeoGeo CD et jeux
» [VDS] Jeux et consoles JPN (NeoGeo/360/GC) >> Baisse des prix
» [Rch] Consoles N64 de couleur
» [Rche] Toutes consoles N64 de couleur en loose
» [EST] Estimation consoles NeoGeo CD et jeux
» [VDS] Jeux et consoles JPN (NeoGeo/360/GC) >> Baisse des prix
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum