2010-10-15 8 views
0

J'ai créé une classe qui gère les sprites dans une application iphone en utilisant opengl es. Le rendu fonctionne bien mais lorsque la feuille de sprite est grande (plus de 512x512px) et que le sprite a une partie qui ne bouge pas, cette partie semble trembler légèrement (comme si l'antialiasing était calculé différemment pour chaque image). Est-ce normal ou est-ce un bug dans mon code?Les sprites OpenGL tremblent légèrement au rendu

Voici le code:

//set bounds of the cell 
int t_x1 = position.x; 
int t_y1 = MAX_SPRITE_HEIGHT - position.y; 
int t_x2 = t_x1 + width; 
int t_y2 = t_y1 - height; 

//set vertices position 
GLshort verticesBuffer[4*3]; 
verticesBuffer[0] = t_x1; 
verticesBuffer[1] = t_y1; 
verticesBuffer[2] = depth; 

verticesBuffer[3] = t_x1; 
verticesBuffer[4] = t_y2; 
verticesBuffer[5] = depth; 

verticesBuffer[6] = t_x2; 
verticesBuffer[7] = t_y1; 
verticesBuffer[8] = depth; 

verticesBuffer[9] = t_x2; 
verticesBuffer[10] = t_y2; 
verticesBuffer[11] = depth; 

//set texture coordinates 
GLfloat texCoordBuffer[2*4] 
texCoordBuffer[0] = a_cellLayer.origin.x/CGImageGetWidth(texture.textureImage); 
texCoordBuffer[1] = a_cellLayer.origin.y/CGImageGetHeight(texture.textureImage); 

texCoordBuffer[2] = texCoordBuffer[0]; 
texCoordBuffer[3] = texCoordBuffer[1] + (float)(t_y1-t_y2)/CGImageGetHeight(texture.textureImage); 

texCoordBuffer[4] = texCoordBuffer[6]; 
texCoordBuffer[5] = texCoordBuffer[1]; 

texCoordBuffer[6] = texCoordBuffer[0] + (float)(t_x2-t_x1)/CGImageGetWidth(texture.textureImage); 
texCoordBuffer[7] = texCoordBuffer[3]; 

//set texture 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, [texture getTexture]); 

//set vertices 
glVertexPointer(3, GL_SHORT, 0, verticesBuffer); 
glEnableClientState(GL_VERTEX_ARRAY); 

//apply texture 
glTexCoordPointer(2, GL_FLOAT, 0, texCoordBuffer); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

//render 
glColor4f(1.0, 1.0, 1.0, 1.0); // R V B Alpha 

glNormal3f(0.0f, 0.0f, 1.0f); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4*nbOfXSudivisions*nbOfYSudivisions); 

J'ai essayé de changer le type de ma coordonnées de texture avec GL_FIXED mais il ne change rien

Est-ce que quelqu'un a une idée?

+0

Difficile à dire. Utilisez-vous le tampon de profondeur? À quoi ressemble votre matrice de projection? NbOfXSudivisions et nbOfYSudivisions sont-ils définis sur 1? – CiscoIPPhone

+0

Oui nbOfXSudivisions & nbOfYSudivisions sont mis à 1. – Klem

+0

Très drôle ... sprites tremblants !!! – SegFault

Répondre

0

Je ne me tampon de profondeur et j'ai mis la matrice de projection comme ça:

const GLfloat zNear = 100, zFar = 1000, fieldOfView = 22.5; 

glMatrixMode(GL_PROJECTION); 

GLfloat size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); 

CGRect rect = oGLView.bounds; 

glFrustumf(-size, size, -size/(rect.size.width/rect.size.height), size/
      (rect.size.width/rect.size.height), zNear, zFar); 

glViewport(0, 0, rect.size.width, rect.size.height); 

glMatrixMode(GL_MODELVIEW); 

glLoadIdentity(); 

//set perspective 
gluLookAt(PAGE_WIDTH/2, PAGE_HEIGHT/2, PAGE_WIDTH/2.0f/(tanf(DEGREES_TO_RADIANS(fieldOfView/2.0f))), 
      PAGE_WIDTH/2, PAGE_HEIGHT/2, 0, 
      0, 1, 0);