png flou d'image lorsqu'il est chargé sur la texture
-
02-10-2019 - |
Question
J'ai créé une image .png dans Photoshop avec des transparents que je l'ai chargé et programme OpenGL. Je binded à une texture et dans le programme les regards d'image floue et je ne sais pas pourquoi.
texte alt http://img685.imageshack.us/img685/9130/upload2 .png
texte alt http://img695.imageshack.us/img695/2424/upload1e .png
Code de Chargement
// Texture loading object
nv::Image title;
// Return true on success
if(title.loadImageFromFile("test.png"))
{
glGenTextures(1, &titleTex);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}
else
MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);
Afficher le code
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
EDIT: Je ne pense pas que je étendais chaque pixel doit être deux dans le système de coordonnées
int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
La solution
OpenGL (normalement) exiger que la texture elle-même ont une taille qui est une puissance de 2, donc ce qui est (probablement) se passe est que votre texture est mise à l'échelle à une taille où les dimensions sont une puissance de 2, puis il est d'être revu à la baisse à la taille originale -. dans le processus d'être mis à l'échelle deux fois, vous perdre une certaine qualité
Vous voulez apparemment juste pour afficher votre bitmap sans mise à l'échelle, sans l'emballer à la surface d'un autre objet, ou quelque chose comme ça (à savoir, l'une des textures choses sont destinées à être). Cela étant le cas, je voudrais simplement l'afficher comme un bitmap, pas une texture (par exemple, voir glRasterPos2i et href="http://www.opengl.org/sdk/docs/man/xhtml/glBitmap.xml" rel="nofollow noreferrer"> glBitmap
).
Autres conseils
Pourquoi voudriez-vous utiliser mipmapping et le filtrage anisotrope pour une image statique sur votre écran de démarrage en premier lieu? Il semble peu probable que l'image pivote (ce que le filtrage anisotropique est pour) ou doit être redimensionnée à plusieurs reprises très vite (ce qui est pour mipmapping).
Si la texture est étirée. Essayez d'utiliser GL_NEAREST
pour votre GL_MAG_FILTER
, dans ce cas, il pourrait donner de meilleurs résultats (GL_LINEAR
est plus précis, mais a une nature de flou)
Si la texture est réduite au minimum. Même chose, essayez d'utiliser GL_NEAREST_MIPMAP_NEAREST
, ou mieux encore, essayez d'utiliser sans mipmaps et GL_NEAREST
(ou GL_LINEAR
, selon ce qui vous donne le meilleur résultat)
Je vous suggère que vous faire le .png ont une résolution d'une puissance de 2 de. -À-dire 1024x512 et placer la partie que vous voulez dessiné dans le coin supérieur gauche de celui-ci reste dans la résolution de l'écran. Ensuite, les rescale texcoords être 800,0 / 1024,0 et 600,0 / 512,0 pour obtenir la partie droite de la texture. Je belive que ce qui se passe est glTexImage2D
peut parfois gérer la largeur et la hauteur qui ne sont pas une puissance de 2, mais peut alors redimensionner l'image d'entrée ainsi filtrer.
Un exemple de la manipulation de ce peut être consulté ici (a iPhone - OpenGLES - projet qui saisit une partie de l'écran non-puissance de 2 et en tire que dans une texture 512x512 et redimensionne la matrice de GL_TEXTURE
, ligne 123, au lieu de faire une remise à l'échelle manuelle des texcoords)
Voici une hypothèse:
La fenêtre est 800x600 (et peut-être votre framebuffer aussi), mais votre espace client n'est pas, en raison de la décoration de fenêtre sur les côtés.
Ainsi, votre tampon de trame se redimensionnée lors de son blittée à la zone client de la fenêtre. Pouvez-vous vérifier votre code de création de fenêtre?
- Méfiez-vous de la taille exacte de la zone client de la fenêtre. Double contrôle est ce que vous attendez qu'il soit
- Attention aux règles d'alignement de pixel. Vous pourriez avoir besoin d'ajouter 0,5 à vos coordonnées x / y pour frapper les centres de pixels. Description DirectX se trouve - règles OpenGL peuvent être différentes, cependant.