简体   繁体   English

OpenGL精灵在渲染时有些发抖

[英]OpenGL sprites are trembling slightly at rendering

I made a class which manage sprites in an iphone application by using opengl es. 我做了一个使用opengl es管理iphone应用程序中的sprite的类。 rendering works well but when the sprite sheet is large (more than 512x512px) and the sprite has a part which doesn't move, this part seems trembling slightly (like if antialiasing was computed differently for each frame). 渲染效果很好,但是当Sprite工作表很大(大于512x512px)并且Sprite的一部分不动时,该部分似乎有些发抖(例如,如果对每帧计算的抗锯齿效果不同)。 Is it normal or is it a bug in my code ? 是正常的还是我的代码中的错误?

Here is the 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);

I tried to change the type of my texture coordinates with GL_FIXED but it doesn't change anything 我尝试使用GL_FIXED更改纹理坐标的类型,但没有任何改变

Does anybody have an idea ? 有人有主意吗?

I don't use depth buffer and I've set the projection matrix like that : 我不使用深度缓冲区,而是这样设置投影矩阵:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM