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);
Était-ce utile?

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)

est un autre poste citant ce méthode.

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top