不知道你在使用glDrawArrays绘制多个几何图形的时候有没有注意到它们的绘制顺序.如你在代码中依次使用glDrawArrays绘制了如下几个几何图形:
(1)绘制一个三角形
(2)绘制一个四边形
(3)绘制一个五角形
那么实际上OpenGL ES在绘制几何图形的时候的顺序和你程序执行的顺序是相反的,即实际的绘制顺序是:
(3)绘制一个五角形
(2)绘制一个四边形
(1)绘制一个三角形
这是为什么呢?你可能也发现了当你设置好了所有的顶点数据,并调用了glDrawArrays,但如果你不接着调用[context presentRenderbuffer:GL_RENDERBUFFER_OES];屏幕上依然没有任何输出。
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
的作用是展示渲染缓冲区,也就是说,你之前调用glDrawArrays绘制的顶点数据实际上先放在了渲染缓冲区中,当你执行了这行代码时才从渲染缓冲区中将顶点数据取出并绘制。从几何图形的绘制顺序可以发现,实际上渲染缓冲区的数据结构是一个栈结构。栈是一种先进后出的数据结构,即压入数据时依次将放进的数据放在栈顶位置,而取出数据的时候依次将栈顶的数据弹出。
代码中执行绘制的顺序和数据压栈的方式如下:
(1)绘制一个三角形
三角形 |
(2)绘制一个四边形
四边形 |
三角形 |
(3)绘制一个五角形
五角形 |
四边形 |
三角形 |
所以才会在最终展示渲染缓冲区的时候出现和代码的执行顺序相反的问题。