OpenGLES与OpenGL一样,是由khronos维护和定义的免许可、跨平台的3D图形API。然而,与OpenGL不同的是,OpenGLES主要针对嵌入式系统。)环境(如手机、PDA)。近年来,网页上的多媒体技术越来越复杂多样,逐渐需要使用3DGraphics的硬件加速,所以也出现了基于OpenGLES2.0的DevelopWebGL直接在网页上进行3D显示。也因为OpenGLES针对的环境普遍性能较差,支持的功能较少,所以OpenGLES的技术进步会比OpenGL慢,限制也多。目前,OpenGLES有两个主要版本,一个是基于OpenGL1.3/1.5的1.0/1.1,使用“固定功能管道”,另一个是2.x,基于OpenGL2.0,使用“可编程管道”。两者最大的区别是OpenGLES2.0去掉了固定功能管线的功能,转而使用通过顶点/片段着色器实现的可编程管线。以上两张图分别摘自OpenGLES网站的固定功能管线和可编程管线的流程图。根据这两张流程图,应该很清楚vertexshader对应的是originaltransform和(pre-vertex)lighting,fragmentshader对应的是texture、colorsum、fog、alphatest等功能;也就是说,这些(橙色部分)原本在固定功能流水线中由系统完成的计算,现在不得不编写着色器程序来进行可编程流水线中的计算。这样做的好处是render方法可以变得相当灵活,程序开发者可以根据自己的需要调整这两个block的计算方式来实现自己需要的功能;但相对的缺点是,即使是最简单的程序,仍然需要自己编写shader程序,这也在一定程度上提高了入门门槛。此外,在开发上与传统OpenGL有较大区别的部分还包括:在OpenGLES2.0中,没有OpenGL矩阵栈。程序开发人员必须自己计算每个物体的投影矩阵和变换矩阵,然后传递给着色器。做计算;GPU端的程序虽然有矩阵计算的功能,但是需要在CPU端实现矩阵计算的基本算法。OpenGLES中没有glBegin()/glEnd()这样的立即模式函数,顶点数据必须用bufferobject或vertexarray来处理。取消了GL_QUADS/GL_POLYGONS两种图元类型。顶点的所有信息(包括自身的位置、颜色、法线等)由一个抽象的顶点属性处理,需要自己定义并在顶点着色器中计算。光照和材质也以抽象的形式以uniform变量的形式传入shader,自己计算。这些只是一些比较大的区别,还有其他地方也不一样,这里就不一一列举了。事实上,就这些部分而言,OpenGLES2.0在概念上并没有那么接近OpenGL2.0,而是更接近OpenGL3.x的Coreprofile。因此,OpenGLES2.0基本上是基于OpenGL3.0的概念编写的。该程序应该更合适;只是OpenGLES2.0的功能比OpenGL3.x少了一些。
