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
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.
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?
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. –
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
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.
- 1. Comment les valeurs de profondeur sont-elles résolues dans les textures OpenGL lors du multi-échantillonnage?
- 2. OpenGL avec RTF FBO, mélange quand il ne devrait pas
- 3. Les barres de défilement flex 3 ne sont pas ajoutées/activées quand elles le devraient
- 4. Quand deux colonnes qui se ressemblent ne sont-elles pas les mêmes en oracle?
- 5. Les textures ne fonctionnent pas dans opengl/Tao pour C# sur les chipsets Intel
- 6. Images de caméra iPhone comme textures OpenGL ES
- 7. Pourquoi mes dates ne sont-elles pas triées correctement?
- 8. Pourquoi mes prises ne sont-elles pas toutes exécutées?
- 9. Pourquoi les énumérations ne sont-elles pas itératives?
- 10. Pourquoi mes pages ne sont-elles pas encore gzippées?
- 11. Les images redimensionnées ne sont pas lisses en flexion
- 12. Quand les variables de classe sont-elles chargées?
- 13. Pourquoi les commandes utilisateur ne sont-elles pas collectées par Gargabe Collector?
- 14. Cookie ne sont pas envoyées par IE7
- 15. Quand les données d'espace de noms anonymes sont-elles initialisées?
- 16. Les propriétés «lourdes» ont-elles un poids, même si elles ne sont pas remplies?
- 17. Quand les variables d'instance Ruby sont-elles définies?
- 18. Quand les propriétés hal sont-elles mises à jour?
- 19. Les pages iframe peuvent-elles indiquer quand elles sont en iframe?
- 20. Dans quel espace de nommage mes classes sont-elles quand je ne mets pas un espace de noms?
- 21. Les transactions sont-elles autorisées par défaut dans SQLServer?
- 22. Les extensions Python sont-elles produites par Cython/Pyrex threadsafe?
- 23. Problème d'utilisation des textures PVRTC
- 24. Pourquoi les données de la vue de ma barre d'onglets ne sont-elles pas à jour?
- 25. Regex ne pas retourner 2 groupes
- 26. Pourquoi les valeurs ne sont-elles pas stockées dans le NSDictionary?
- 27. Menu contextuel Systray - pourquoi mes commandes ne sont-elles pas activées?
- 28. Pourquoi mes sauvegardes SQL Server 2005 ne sont-elles pas supprimées?
- 29. Sous-classe d'un UIViewController, quand et quand ne pas
- 30. Pourquoi les aides-rails ne sont-elles pas plus orientées objet?
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. –