2017-02-21 2 views
1

J'ai rendu plusieurs symboles sur un atlas de texture dont l'arrière-plan est totalement transparent (l'image de l'atlas de texture a reçu le canal alpha, formate RGBA). Après cela, j'utilise l'atlas de texture pour dessiner tous les symboles tant que les symboles apparaissent sur la texture.La couleur de texture OpenGL ne s'affiche pas correctement lors de la rotation

Le problème est lorsque le symbole rendu n'est pas pivoté, tout va bien. Cependant, la couleur du symbole semble être incorrecte lors de la rotation. Comme le montre l'image suivante: le symbole de la flèche gauche n'est pas tourné et rendu correctement. La couleur au bord du symbole de droite qui a été tourné a changé d'une manière ou d'une autre.

Ce qui pourrait causer cela?

enter image description here

EDIT:

Comme suggéré @BDL, j'ai changé le paramètre à:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

Mais quelques-uns des symboles ne sera quand même pas comme prévu: Triangle Symbols

Le symbole du triangle à droite est c orrect.

J'ai aussi essayé:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

ne fonctionne pas non plus.

Dois-je changer la couleur de l'arrière-plan de la texture de la même couleur que la couleur des pixels de la limite des symboles, puis utiliser GL_LINEAR comme option de filtre de texture?

+1

vérifier vos techniques anti-aliasing – shan

+2

De quelle couleur sont les pixels transparents dans l'image source? Noir? Blanc? – genpfault

+0

@genpfault Noir –

Répondre

0

Vous obtenez exactement le comportement que l'on est en droit d'attendre lorsqu'on utilise une interpolation linéaire. Chaque fragment est une interpolation pondérée des quatre texels environnants. Aux frontières, cette interpolation produit des pixels semi-transparents puisqu'elle interpole entre pixels opaques et transparents. Les bordures grises proviennent de la fusion de ces pixels semi-transparents avec le fond.

Si vous souhaitez désactiver l'interpolation linéaire, changer le filtre d'agrandissement de la texture en appelant

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
+0

Modifier la question que vous avez suggéré.Le symbole a changé, mais pas de manière satisfaisante cependant. –