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这个后缀好像已经被取消了。文章开始提到的那篇去试验吧。