通常在二维空间中可以绘制点,线,多边形,圆弧,路径等。而OpenGL ES 支持的基本几何图形有三种: 点 、 线段、 三角形。 也就是在OpenGLEs中,任何其他的图形都可以通过这三种基本图形构造出来。比如通常来讲 复杂的3D图形,都需要将其分割成细小的三角形,然后构造出一个3d的基本模体,继而通过处理颜色,添加纹理,添加光照来构造出3d的图形效果。点,线,三角形都是通过顶点 (vertexs)来定义的,即顶点数组。在平面上,将多个孤立的点通过线段连接起来就可以构造出线段(line segment)或者三角形(triangle)。
下面是几种openglES定义的几种模式:
GL_POINTS :绘制独立的点
GL_LINE_STRIP :绘制一系列线段。
GL_LINE_LOOP : 封闭曲线。
GL_LINES:顶点两两连接,为多条线段构成。
GL_TRIANGLES : 每隔三个顶点构成一个三角形,为多个三角形组成。
GL_TRIANGLE_STRIP :每相邻三个顶点组成一个三角形,为一系列相接三角形构成。
GL_TRIANGLE_FAN : 以一个点为三角形公共顶点,组成一系列相邻的三角形。
以上模式对应到 Android 渲染方法:
OpenGL ES 提供了两类方法来绘制一个空间几何图形:
- public abstract void glDrawArrays(int mode, int first, int count)
使用 VetexBuffer 来绘制,顶点的顺序由 vertexBuffer 中的顺序指定。下面是glDrawArrays() 方法的使用说明:
功能:由矩阵数据渲染图元。
详细:
glDrawArrays通过很少的子程序调用指明多层几何图元。你可以设置独立的顶点、法线、颜色矩阵,以及纹理坐标,并仅需调用glDrawArrays就可以通过它们构建一系列图元。
当glDrawArrays被调用,它从被允许访问的矩阵中计算连续count个元素来构建一系列几何图元,从first元素开始。mode指明哪一种图元将被构建及矩阵元素怎样构建这些图元。如果GL_VERTEX_ARRAY没有启用,则不会有图元产生。
当glDrawArrays返回后,由glDrawArrays改变的顶点属性会得到一个未指明的值。举个例子,如果GL_COLOR_ARRAY被启用,则glDrawArrays执行后当前颜色的值是未定义的。未改变的属性仍然是已定义的。
错误:
如果mode不是被允许的值,将会产生GL_INVALID_ENUM。
如果count是负数,将会产生GL_INVALID_VALUE。
参数:
mode——指明渲染哪一种图元。允许的符号常量有GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN和GL_TRIANGLES。
first——指明在允许访问的矩阵中的起始索引。
count——指明要渲染的索引的数量。
抛出:
java.lang.ArrayIndexOutOfBoundsException——如果序列中任一索引first至first + count – 1,导致引用出界。这个序列包括当前顶点、颜色、法线、纹理坐标,点大小,矩阵索引,或加权矩阵。
- publicabstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由 indices Buffer 指定。
功能:由矩阵数据渲染图元。
详细:
glDrawElements用少量调用指明多重几何图元,你可以事先指明独立的顶点、法线、颜色和纹理坐标矩阵并且可以通过调用glDrawElements方法来使用它们创建序列图元。
当glDrawElements被调用,它会使用有序索引来查询可用矩阵中的元素,并以此创建序列几何图元,如果GL_VERTEX_ARRAY被禁用,则不会创建。
顶点属性由glDrawElements修改,glDrawElements在返回后会有一个未指明的值。举一个例子,如果GL_COLOR_ARRAY启用,当执行glDrawElements方法后,当前颜色的值是未定义的,属性不会维持它之前的值。
错误:
如果mode的值不被允许,将产生GL_INVALID_ENUM。
如果type的值不被允许,将产生GL_INVALID_ENUM。
如果count是负数,将产生GL_INVALID_VALUE。
参数:
mode——指明被渲染的是哪种图元,被允许的符号常量有GL_POINTS,GL_LINE_STRIP,GL_LINE_LOOP,GL_LINES,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN和GL_TRIANGLES
count——指明被渲染的元素个数。
type——指明索引指的类型,不是GL_UNSIGNED_BYTE就是GL_UNSIGNED_SHORT。
indices——指明存储索引的位置指针。
抛出:
java.lang.IllegalStateException——如果最近一次调用glBindBuffer方法以GL_ELEMENT_ARRAY_BUFFER为目标时,有一个非0缓冲区参数。
java.lang.IllegalArgumentException——如果索引为空。
java.lang.ArrayIndexOutOfBoundsException——如果索引序列中从0到count-1中任意索引超出现有索引或数据矩阵范围。
其中 mode 为上述解释顶点的模式,如下面定义三个顶点坐标,并把它们存放在 FloatBuffer 中:
float[] vertexArray = new float[]{
-0.8f , -0.4f * 1.732f ,0.0f ,
0.8f , -0.4f * 1.732f ,0.0f ,
0.0f , 0.4f * 1.732f ,0.0f ,
};
ByteBuffer vbb=ByteBuffer.allocateDirect(vertexArray.length*4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertex = vbb.asFloatBuffer();
vertex.put(vertexArray);
vertex.position(0);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15367.html