Voir la version complète : [PSP][Aide] Problème de palette
Bonjour à tous,
j'aimerais savoir si certains d'entre vous ont utilisés les palettes d'oslib ?
Je n'arrive pas a voir comment ca marche ?
Comment faire pour créer une palette de 256 entrées avec les composantes RGBA de 8 bits chacunes ?
Comment faire au moment de dessiner une image, à l'écran qui a un pixel format de type OSL_PF_8BIT, en utilisant une palette précedement créée ?
Merci pour vos réponses
C'est de la merde les palettes dans OSLib, attends la version 2.0.
Et c'est pour quand cette version 2 :whst:
Je ne sais pas encore, mais ça devrait pas trop tarder :)
daaa57150
05/06/2007, 12h19
petite remontée de thread vu que la version 2 est là, et que j'ai surement besoin des palettes...
Voilà ce que j'aimerais faire (exemple illustratif):
J'ai une image avec un fond rouge (255,0,0) et du texte blanc dessus (255,255,255). Le texte est antialiasé, c'est à dire que certains pixels du texte étaient un peu translucides sur les bords, résultat ces pixels sont roses maintenant. Je veux faire 2 choses:
1) tout ce qui est rouge doit devenir transparent, ce qui est plus ou moins rose doit devenir plus ou moins transparent. Il faudrait que l'alpha de ce pixel soit égal à 255 - composante rouge + composante bleue ou verte (je pense :hmm: ). Sur ce point peut être que modifier le membre data de l'image est mieux? Comment ca marche?
ensuite
2) je veux pouvoir colorer le texte qui reste, de la couleur que je veux, en permuttant sa palette, ce qui me semble être une solution plûtot optimisée. Ceci afin d'avoir un texte et plusieurs palettes de couleur, histoire de faire clignoter ce texte sans utiliser autant d'images que de couleurs dont j'ai besoin.
Voila si c'est possible, j'aimerai bien savoir comment. Evidemment, c'était juste un exemple et je peux très bien changer toutes les couleurs etc.
Merci à ceux qui m'aideront, et désolé de poser des questions partout tout le temps :)
themouton
05/06/2007, 13h07
salut,
le plus simple c'est de pas utiliser de palette, reste en 32bit.
Utilise une image en png pour avoir la transparence.
- Soit tu refais ton image avec que le text et le fond transparent
- Soit tu prends un logiciel comme paint shop pro, photoshop ou gimp, ils ont des outils pour virer les fonds.
Ton texte, tu le laisses en blanc et tu utilises dans oslib version 2
oslSetAlpha(OSl_FX_TINT,RGB(....));
juste avant de faire le draw image.
daaa57150
05/06/2007, 15h07
Salut, merci pour ta réponse.
salut,
le plus simple c'est de pas utiliser de palette, reste en 32bit.
Utilise une image en png pour avoir la transparence.
- Soit tu refais ton image avec que le text et le fond transparent
- Soit tu prends un logiciel comme paint shop pro, photoshop ou gimp, ils ont des outils pour virer les fonds.
Le problème c'est que j'utilise pas une image toute faite avec du texte dessus, je la crée. J'ai une image avec toutes les lettres (fond transparent), je crée une image a la bonne taille, je la passe en VRAM et je dessine les lettres une a une dessus. Le problème c'est qu'en VRAM, je peux pas avoir d'image transparente pour dessiner dessus apparemment :disgust1:, je dois faire un clear dessus. J'ai donc forcément une image avec un fond à ce moment là :(. Du moins c'est ce que j'ai cru comprendre en lisant de la doc et en testant. Si tu sais comment faire pour dessiner une image avec plusieurs niveaux de transparence sur une image transparente, je prends!!!
Ton texte, tu le laisses en blanc et tu utilises dans oslib version 2
oslSetAlpha(OSl_FX_TINT,RGB(....));
juste avant de faire le draw image.
OK, donc si je fais ceci :
//mon image avec du texte blanc et pas de fond :
OSL_IMAGE * imgTexte;
//init imgTexte ou j'arrive je l'espère à virer le fond
//...
oslSetAlpha(OSl_FX_TINT,RGB(0,0,255));
oslDrawImage(imgTexte);OSL_FX_DEFAULT
oslSetAlpha(OSL_FX_DEFAULT, 0);
j'aurais dessiné mon texte en bleu? Si c'est ca, c'est absolument excellent, je vais tester.
Merci pour ton aide, et si quelqu'un sait comment faire pour le problème 1) :wub:
themouton
05/06/2007, 15h36
Re
bin tu fait un clear de l'image en mettant zero à la couleur alpha !
...RGBA(0,0,0,0)...
pour le point 2
je sais plus si il faut utiliser
oslSetAlpha(OSL_FX_DEFAULT, 0);
ou plutot
oslSetAlpha(OSL_FX_RGBA,0);
mais sinon la teinte est juste, je crois, une multiplication de la couleur de la source avec celle de la teinte. Donc si ta source est blanc (255,255,255) et que ta teinte c'est (0,0,255) bin tu auras du bleu, on multiplie les composantes puis on normalise.
daaa57150
05/06/2007, 16h07
Re
bin tu fait un clear de l'image en mettant zero à la couleur alpha !
...RGBA(0,0,0,0)...
J'avais essayé, et il me semble qu'on perd l'alpha de l'image dessinée dans ce cas, ou alors que plus rien n'est dessiné, je sais plus, j'ai testé tellement de trucs et fait tellement d'erreurs au passage que c'est super confus maintenant, je vais réessayer pour voir.
Et sinon OSL_FX_DEFAULT c'est pareil que OSL_FX_RGBA il me semble.
Merci pour toutes tes réponses en tout cas, je poste mes résultats dès que je peux faire quelques tests.
Si tu veux un pixel semi transparent il faut que sa couleur soit par exemple RGBA(rouge, vert, bleu, 128). Dans un pixel format qui supporte l'alpha bien sûr (4444 ou 8888).
Tu peux aussi utiliser le 4 ou 8 bits, c'est un peu plus compliqué mais plus rapide ;) Et là tes couleurs de palette peuvent avoir de l'alpha (elles sont en 32 bits si tu spécifies OSL_PF_8888 à la création).
daaa57150
05/06/2007, 17h17
@themouton:
Bon j'ai fait comme tu as dis, j'ai créé mon image "A", mis en VRAM, clear avec RGBA(255,255,255,0), dessiné sur "A" avec une image "B" contenant des pixels pleins de différentes couleurs, des pixels vides (alpha=0) et des pixels semi transparents. Résultat: rien n'est affiché lorsqu'après avoir restauré le buffer par défaut et bougé "A" de la VRAM vers la RAM, j'essaie de dessiner "A" sur l'écran.
J'en suis donc toujours au même point pour ce problème. :cry:
@Brunni: je comprends bien le principe des pixels et des couleurs, leur mode de stockage ou les opérations qu'on peut faire dessus, ce que je ne comprend pas pour le moment c'est le lien entre une image et sa palette, et comment associer la palette correcte à une image donnée (puisqu'elle n'est pas créée au chargement n'est ce pas?), et comment accéder à chaque élément pour le modifier selon ce que je veux.
Mais bon, le fait que je ne comprend rien pour l'instant est normal car je n'ai pas trop cherché, ni essayé :). Alors je vais m'y mettre.
themouton
05/06/2007, 18h52
On peut savoir comment tu crées ton image A ? Le code ?
Et aussi l'image B ?
Car il faut bien sur que tu sois en mode PF_8888 ou PF_4444
daaa57150
05/06/2007, 19h26
On peut savoir comment tu crées ton image A ? Le code ?
Et aussi l'image B ?
Car il faut bien sur que tu sois en mode PF_8888 ou PF_4444
oui voila:
image A:
OSL_IMAGE * A=oslCreateImage(width, height, OSL_IN_VRAM, OSL_PF_8888);
image B:
OSL_IMAGE * B = oslLoadImageFilePNG("image.png", OSL_IN_RAM | OSL_SWIZZLED, OSL_PF_8888);
Et l'initialisation du mode graphique est comme ca:
oslInitGfx(OSL_PF_8888, true);
J'ai tout en OSL_PF_8888 pour pas m'emmerder pour l'instant.
EDIT: mes tests:
en utilisant un clear comme cela:
oslClearImage(img, RGBA(255,255,255,255));
j'arrive à dessiner ce que je veux (même pixels semi transparents) sur l'écran au final, mais évidemment le tout avec un fond blanc, qu'on ne pourra pas enlever sous les pixels semi transparents.
en faisant ca:
oslClearImage(img, RGBA(0, 0, 0, 0));
oslSetDrawBuffer(img);
//Every pixel written will take the value 255 (opaque)
oslSetAlphaWrite(OSL_FXAW_SET, 255, 0);
//But do not draw transparent pixels (only those greater than 0).
oslSetAlphaTest(OSL_FXAT_GREATER, 0);
//dessin ici
//[...]
oslDisableAlphaTest();
Je perd les niveaux de transparence, les pixels semi transparents deviennent pleins (alpha = 255).
Je crois pas qu'il est possible de faire mieux pour l'instant...
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org