2010-03-07 5 views
1

Lors du dessin de textures OpenGL ES, elles semblent "s'aligner" sur des emplacements de pixels arrondis, comme si l'emplacement de dessin était arrondi. c'est à dire. Dessiner à (x: 1.1, y: 5.4) dessine réellement à (x: 1, y: 5). Cela fait apparaître les textures "sauter" lors du défilement, plutôt que de se déplacer sans à-coup.Impossible de dessiner des textures OpenGL ES sur des emplacements non ronds

Oui, j'utilise les types de virgule flottante pour mes sommets, etc.

lignes de dessin, etc. fonctionne très bien avec des emplacements non rondes.

Il n'y a que deux facteurs dans l'emplacement de la texture:

  1. traduction de la fenêtre: glTranslatef(viewWidth/2.0f, viewHeight/2.0f, 0.0f);

  2. L'emplacement du tirage: glVertexPointer(...); // see below

J'utilise le code suivant pour dessiner la texture:

glTranslatef(scrollX, scrollY, 0.0f); 

... 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 

// Overlay map. 
glTexCoordPointer(2, GL_FLOAT, 0, textureSTs); 
glBindTexture(GL_TEXTURE_2D, texture.glTtextureKeyD); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

GLfloat vertices[] = { 
x1, y2, 
x1, y1, 
x2, y1, 
x2, y2, 
}; 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

Ai-je raté quelque chose?

+0

Quels sont les types pour scrollX et scrollY? peut-être les traiterez-vous comme des ints même s'ils sont flottants? – fazo

Répondre

2

Votre code de téléchargement d'image est très probablement en utilisant le filtrage GL_NEAREST, si vous voulez obtenir un bon filtrage Pour les valeurs de pixel entre les deux, votre meilleur pari est le filtrage GL_LINEAR. Essayez de mettre glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); après la liaison. L'utilisation de FSAA peut également réduire l'effet.

Une autre possibilité est dans vos coordonnées de texture, essayez de les ajuster de 1/2 pixel. Donc, si votre texture est 256 * 256, ajoutez .5/256 à la valeur en virgule flottante de chaque coordonnée.

+0

C'était exactement le problème. Merci Medran et PeanutPower. –

1

sont votre x1, y2, x1, y1, x2, y1, x2, y2,

flotteurs ou sont-ils tronqués?

également le code qui définit x1, y1, etc. est-ce que vous lancez des flottants avant de faire la multiplication de division, etc.?

x1 = (float) somevar * 0.5f

et la même chose pour scrollx que vous nourrissez dans glTranslate

+0

bonne estimation, mais j'utilise CGFloats. –

+0

donc tous les opérandes sont flottants dans vos déclarations mathématiques? – PeanutPower

+0

peut-être essayer d'appeler glLoadIdentity pour vous assurer que votre traduction est propre? – PeanutPower

Questions connexes