作者: sqw0312
如何建立iPhone的OpenGL ES项目,请参考本站的游戏是这样写成的系列,非常清楚。
1 将EAGLView设置成一个单例模式,这样可以用别的类来调用其的 swapBuffers 来画图。
- (void) swapBuffers
{
EAGLContext *oldContext = [EAGLContext currentContext];
GLuint oldRenderbuffer;
if(oldContext != context)
[EAGLContext setCurrentContext:context];
glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, (GLint *) &oldRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
if(![context presentRenderbuffer:GL_RENDERBUFFER_OES])
printf("Failed to swap renderbuffer in %s\n", __FUNCTION__);
if(oldContext != context)
[EAGLContext setCurrentContext:oldContext];
}
swapBuffers是一个很好的方法,利用双缓冲,先将图画到一个context上,然后交换当前context和画好的,这样避免屏幕闪烁。
2. 画图原理以及如何一次画多图
因为很多游戏一次要画很多图,所以不要每画一个小的就画到View上,这样屏幕会频繁闪动。我将下面代码使用了99次,也就是画了99张图,然后再调用 swapBuffers 这个方法来一次性画出来。千万避免每画一张图,就swapBuffer一次。
glLoadIdentity(); //必须使用这个再每一次新画一个图之前,否则原始坐标会丢失
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glPushMatrix();
glTranslatef(x, y, 0.0f);//移位
glRotatef(angle, 0.0f, 0.0f, 1.0f);//旋转
glScalef(xScale, yScale, 1.0f);//缩放
glVertexPointer(2, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glPopMatrix();
好了, 下面介绍一下画图的基本步骤与原理。简单的画图我就不介绍了,这里主要介绍就是怎么把一个图像画到View上,就是所谓的纹理映射。在EAGLView的drawView方法里用如下代码实现 画一幅简单的图:bg.png(可以在游戏是这样写成的里面找到)
- (void)drawView {
[EAGLContext setCurrentContext:context];
const GLfloat zNear = 0.01, zFar = 1000.0, fieldOfView = 45.0;
GLfloat size;
//glEnable可以用来实现很多东西,具体的参数可以去opengl网站查
glEnable(GL_DEPTH_TEST);