2010-10-15 71 views
0

我做了一個使用opengl管理iphone應用程序中的精靈的類。 渲染效果很好,但當精靈表很大(超過512x512px),精靈有一部分不能移動時,這個部分看起來有點顫抖(就像對每幀計算抗鋸齒一樣)。 這是正常的還是它是我的代碼中的錯誤?OpenGL精靈在渲染時會有些顫抖

下面是代碼:

//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); 

我試圖改變我的紋理類型與GL_FIXED座標,但它不會改變任何東西

沒有任何人有一個想法?

+0

很難說。你在使用深度緩衝區嗎?你的投影矩陣是怎樣設置的? nbOfXSudivisions和nbOfYSudivisions是否設置爲1? – CiscoIPPhone 2010-10-15 09:00:17

+0

是nbOfXSudivisions&nbOfYSudivisions設置爲1. – Klem 2010-10-15 09:23:53

+0

非常有趣...顫抖的小精靈! – SegFault 2010-10-15 15:38:55

回答

0

我不使用深度緩衝和我設置的投影矩陣這樣的:

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);