open GLES学习笔记(一)

前面写过一文博客《iPhone OpenGL ES项目基本模型》介绍了open GL ES的基本框架。好像距这次写博时间有点长了。不过在开始这片文章之前,要对前面的基本模型做个补充。(顺便说明,在开始这篇文章的时候iPhone的Open GLES框架已有所修改,并且提供了基础操作封装。当然这个不是我们要说的重点)
由于那片模型中的模板是针对2D界面的所以没有启用深度缓冲,如果要使用3D模型处理就应该在其初始化的时候启用深度缓冲。

glEnable(GL_DEPTH_TEST);

glGenRenderbuffers(1, &depthRenderbuffer);

    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

代码。至于坐标的点的设置
若用了

const GLfloat zNear = 0.01, zFar = 1000.0, fieldOfView = 45.0; 

GLfloat size; 

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

CGRect rect = self.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);  

这样的代码这采取0~1间的坐标值模式,否则采用点像素坐标(当然,我这里直接采用了像素点坐标,不过openGL ES的坐标与iphone本身的坐标几点是不同的,我这里没有进行坐标转换,希望谅解,毕竟我们的目的是学习openGL ES)。至于,远点位置及对其进行修改的问题,这里就不讨论了,本人现在也是刚跨入学习的行列还不甚了解。


好了,接下来,我们开始我们真正的学习之旅吧。先目标不要太大,今天的目标很简单,能够随意绘制三个基本的图元(点,线,三角形)就可以了。好了,开始吧。

既然要绘制三角行,我们需要做的就是了解,这些图元有些什么特点,openGL ES能够接受的处理有那些。既然如此,那么就先让我们来讨论一下这些图元的特点吧。

首先是点,每一个点都把括可x,y,z三个坐标,对2维图形而言z值被忽略,后面不在说明。所以,我们如果要绘制点,那么我们就必须要给出这些点的坐标信息。当然,这很容易理解。

既然如此,我们就来看看,线的信息。线是由无数的点组成,所以我们可以把线当作无限的点组成的。那么,我们要绘制点自然可以采取描绘无限的点了,当然我们不必描绘无限多的点,我们只需要他们只见的间隙不被肉眼看到就行。而对于我们的图形绘制处理中,像素点只需要整数就行,虽然如此,我们还有其他的方法吗?当然,我们可以直接确定两点根据两点来绘制线了,不过这样出来的都是直线。其实不用怕,我们只要我们的线段间距离足够小就可以了。

同样的道理,三角形也是如此。就不做描绘了。


现在,我们来讨论openGL ES对三个基本图元的处理问题。

点:GL_POINTS 这时处理点像素的参数,当然他也只要这个参数就能说明他该怎么绘制了。

线:GL_LINES,GL_LINE_LOOP,GL_LINE_SMOOTH,GL_LINE_SMOOTH_HINT,GL_LINT_STRIP..对线的处理模式就比较多一些了,比如直接每两点组合,又或者每点和前一点组合等等,各种模式自己选择吧。都列出来了,用用就知道了。

三角形:GL_TRIANGLES,GL_TRIANGLE_FAN,GL_TRIANGLE_STRIP.对这三个参数做个说明,GL_TRIANGLES没三点组合构成一个三角形。GL_TRIANGLE_FAN每一点都和前面的两个点组合构成三角形,而GL_TRIANGLE_STRIP则是每一点都和前一点前面的两点组合构成三角形。


好了,了解了这些,我们就可以来展示图形的绘制了:下面给一个最简单的三角形例子,其他的图形绘制,只需要用上面提到的参数修改GL_TRIANGLES参数就可以了。

glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);

GLfloat vextureBuffer[9];

    vextureBuffer[0] =100.0;

    vextureBuffer[1] =100.0;

    vextureBuffer[2] =0.0;

    vextureBuffer[3] =10.0;

    vextureBuffer[4] =100.0;

    vextureBuffer[5] =0.0;

    vextureBuffer[6] =55.0;

    vextureBuffer[7] =10.0;

    vextureBuffer[8] =0.0;

    

    [EAGLContextsetCurrentContext:context];

    glVertexPointer(3, GL_FLOAT, 0, vextureBuffer);

   glDrawArrays(GL_TRIANGLES,0, 3);

   glBindRenderbuffer(GL_RENDERBUFFER,viewRenderbuffer);

    [contextpresentRenderbuffer:GL_RENDERBUFFER];

好了,去试试吧。。运行你的代码。


最后做点补充,在最新的iOS SDK中OES,openGLES的API中OES这个后缀好像已经被取消了。文章开始提到的那篇去试验吧。

你可能感兴趣的:(iphone之路,openGL,ES)