2009-08-23 5 views
2

J'ai un moteur de jeu qui utilise OpenGL pour l'affichage. J'ai codé un petit menu pour cela, puis j'ai remarqué quelque chose d'étrange après avoir rendu le texte. Comme vous le voyez, la police est quelque peu illisible, mais les parties inférieures (comme "Tests") semblent comme prévu. Apparaît que la position sur l'écran affecte la lisibilité lorsque les bords sont coupés. La police est 9x5, une valeur que je divise par 2 pour obtenir largeur/hauteur et rendre l'objet à partir du centre. Donc, avec 4.5x2.5 pixels (j'utilise des flottants pour x, y, la largeur et la hauteur de rectangles simples), la texture est foirée si elle est restée ailleurs que x.5. Cependant, il ne le fait que dans deux ordinateurs pour le moment, mais je n'aimerais pas que cette erreur apparaisse car cela rend le texte illisible. Je peux le faire 4.55x2.55 (en ajoutant un peu de taille supplémentaire en divisant par 2), et puis il rend correctement dans toutes les machines (ou au moins ne se produit pas aussi souvent dans les deux problématiques), mais je crains cela est un hack trop grossier pour le garder et ne résout pas complètement le problème, et il pourrait redimensionner le texte en faisant ressembler la police ... "gras". Donc, ma question est ... est-ce que je peux empêcher cela, et ne pas échanger ces valeurs avec des nombres entiers? (J'ai besoin des légères différences de flotteurs offre en comparaison). Puis-je savoir quelles largeurs/hauteurs sont divisibles par deux, et celles qui ne le sont pas, les gérer différemment? Si c'est effectivement un problème de carte vidéo, est-ce qu'il serait possible de le contourner? Désolé s'il y a quoi que ce soit qui manque à la question, je n'ai pas l'habitude de questionner l'Internet souvent et je n'ai aucune étude de codage. Je serai heureux de fournir toute ligne ou morceau de code qui pourrait être nécessaire.OpenGL: textures déformées quand elles ne sont pas divisibles par 2

Répondre

0

Si vous devez dessiner votre texte à des coordonnées non entières, vous devez activer le filtrage de texture. Utilisez glTexParameterfv pour définir GL_TEXTURE_MIN_FILTER et GL_TEXTURE_MAG_FILTER sur GL_LINEAR. Votre texte sera flou, mais cela ne peut pas être évité sans avoir recours aux coordonnées pixel parfait (= entier). Notez que votre solution de contournement 0.05 ne fait que modifier la façon dont les coordonnées efficaces sont arrondies à des nombres entiers. Lorsque vous utilisez le filtrage de texture GL_NEAREST, il n'y a pas de décalage de moitié de pixel. Même si vous spécifiez ces coordonnées, le filtre de texture les arrondira pour vous. Vous venez de le pousser dans la bonne direction avec le 0,05 supplémentaire.

+0

Je vise à obtenir une sensation rétro (16 bits), qui est complètement détruite par le filtrage. Cependant, votre réponse m'a donné une solution. Oui, j'ajoute 0,05 pour aider à la mise à l'échelle, mais en lisant comment vous l'avez exposé, j'ai juste besoin de "pousser dans la bonne direction" en effet. Je vous remercie. –

0

Pour une meilleure fiabilité, je trouverais un moyen d'éliminer les fractions. J'ai seulement un peu d'expérience avec XNA et MDX, donc je ne sais pas s'il y a une bonne raison, mais pourquoi allez-vous au centre plutôt qu'au coin?

+0

J'utilise les positions XY pour centrer toutes les hitbox et les centres de rotation. Je pensais que c'était la façon normale, en fait ...Peut-être que je peux tout traduire et juste faire un dessin au coin de la rue. –

+0

Eh bien, cela a beaucoup de sens, certainement en ce qui concerne la rotation. J'ai toujours coincé avec des multiples de deux, de toute façon. J'ai une paranoïa sur ce qui se passe quand les choses ne tombent pas sur les limites des pixels, avec des problèmes comme l'anti-aliasing forcé et le lissage des textures. – snarf

0

Essayer de faire des choses de pixel parfait comme cela peut être difficile en OpenGL en raison de différentes résolutions, le filtrage, etc. texture

Certaines choses que vous pouvez essayer:

  • Dessinez votre police dans une grande texture (disons 512x512). Dessinez les glyphes plus grands que vous avez besoin et anti-alias en utilisant le canal alpha (transparence).
  • Laissez un espace vide (4 ou 8 pixels) autour de chaque glyphe. Si vous les avez poussés l'un contre l'autre (comme vous le feriez si vous dessiniez une police pour le rendu des logiciels dans les jours DOS), le filtrage les ferait se saigner les uns les autres.
  • Ou vous pourriez adopter une approche différente et en faire des segments hors ligne. Cela peut fonctionner mieux pour les polices sur les échelles que vous avez affaire.
Questions connexes