IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

Graphics2D : antialiasing avec alpha


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut Graphics2D : antialiasing avec alpha
    Bonjour !

    J'essaye depuis quelques jours de créer ma propre implémentation d'un TextDrawer afin de lui rajouter quelques outils bien pratique. Mais je me suis aperçu que lorsque je met l'antialiasing sur mon texte, une bordure noire apparait.

    Le texte est censé s'afficher sur une image. Pour simplifier le code, je commence par nettoyer l'écran avec une couleur de fondpuis je nettoie le quad qui va servir à plaquer ma texture où le texte apparaît. Cette couleur correspond à 0x00000000, où l'alpha est activé. Je vois donc bien mon background entre les caractères. Tout va bien sauf quand pour améliorer le rendu je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    Là, une bordure grise apparaît. Après avoir fait quelques tests, il s'avère qu'il s'agit de la couleur avec laquelle je nettoie mon quad (le fameux 0x00000000). Un patch pourrait être fait en nettoyant le quad avec la couleur de ma font, mais la classe gère aussi une ombre dont la couleur est déterminable séparément de la couleur du texte.

    Donc je cherche une formule pour avoir un rendu correct face à ce problème, tout en gardant l'antialiasing. Une idée ?

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut
    J'essaye de reformuler mon problème :

    J'essaye d'écrire un texte sur un quad transparent.
    Ce quad sera posé utilisé dans un monde 3D.

    L'antialiasing que j'utilise sur le texte mélange la couleur du texte avec la couleur transparente, donc si mon texte est rose, les bordures virent vers le gris avec un alpha qui diminue.
    Je ne peux pas changer la couleur transparente. (voir le poste précédent pour les raisons)

    J'aimerais que l'antialiasing n'utilise pas cette couleur noire transparente, mais ne fasse que jouer sur l'alpha afin que la composition avec les couleurs derrière le texte (dans le monde 3D) soit correctes.

  3. #3
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Je n'ai quasiment rien compris . Ne dessiner que le texte avec l'anticrénelage pourrait peut-être suffire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    Mais peut-être pas.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut
    Merci pour ta réponse, j'ai déjà essayé, et ça ne résout pas mon problème.

    Donc c'est reparti pour une explication.

    Soit 2 couleurs, la couleur de fond 0x00000000 (noir transparent) et la couleur du texte 0xffff0000 (rouge)
    Quand j'utilise l'antialiasing sur le texte, j'ai une "bordure grise", car je pense que l'antialiasing mélange le noir et le rouge.
    Or ce que je veux, c'est un antialiasing qui sur les bordures joue simplement avec l'alpha sans changer la couleur des pixels, pour ne plus avoir cette bordure grise.

    Et je ne veux pas changer ces 2 couleurs. (pour faire simple)

    Un avis ? Une idée ? Merci !

  5. #5
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Je vois un peu mieux le problème. Une solution consisterait à effectuer le rendu du texte dans une image temporaire avec un fond de couleur valant couleur_du_texte & 0x00ffffff, puis à recopier cette image sur l'image originale. Une autre solution serait de jouer sur le mode de blending via Graphics2D.setComposite(AlphaComposite.SRC), mais ça reste à vérifier.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut
    Je suis aller chercher du côté des "Composite" sur : http://download.oracle.com/javase/tu...mpositing.html
    Ce que j'en comprend, c'est ce que l'on peut jouer sur le style de composition.
    Or dans mon exemple, le texte est opaque, et seul ses bords diminue en opacité. Du coup, je ne sais pas trop comment m'en servir...

    Donc j'suis parti sur du refactoring qui au final était plus simple que de trouver une solution toute faite. J'ai donc 2 rendus, un pour le texte, et un pour l'ombre (par exemple) qui peuvent avoir 2 couleurs différentes, donc avec 2 couleurs de fond différentes.
    Tout fonctionne ... mais quand je met au moins 0.5/255 pour l'alpha pour ces couleurs de fonds. Si je met simplement 0, ou même 0.4999/255 pour l'alpha, je me retrouve avec ces foutues bordures sombres

    Quelqu'un sait d'où sort ce 0.5 ? Parce que même si ça n'a l'air de rien, avec ça j'impose une teinte à l'image final de 1/255 suivant la couleur du texte. Soit un texte rouge pur, la zone proche du texte gagnera 1 point sur sa composante rouge... et ça c'est pas cool, surtout si je me retrouve avec plusieurs textes assez proche, ça va finir par se voir



    On voit bien sur l'image la différence avec en haut la bordure grise mais un blanc vraiment blanc entre les caractères, et en dessous, plus de bordure grise mais un blanc #010000 entre les caractères ...

Discussions similaires

  1. accumulateWeighted mais avec alpha
    Par Garra dans le forum OpenCV
    Réponses: 0
    Dernier message: 12/10/2013, 19h39
  2. masking avec alpha
    Par venomelektro dans le forum OpenGL
    Réponses: 9
    Dernier message: 10/04/2009, 10h17
  3. Problème avec alpha dans un clip
    Par Buuhh dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 08/01/2009, 22h00
  4. Réponses: 0
    Dernier message: 11/05/2008, 22h09
  5. [FLASH 8] Faire disparaitre du texte avec alpha
    Par steeves5 dans le forum Flash
    Réponses: 6
    Dernier message: 08/06/2006, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo