今天讲一下glDrawArray这个方法
方法的解释我在前面gl10方法集中已经做了说明,可能会有些难懂的,这里来解释一下。
下面是自己写的简单代码。
test2.java
package my.test2;
import android.app.Activity;
import android.os.Bundle;
import android.opengl.*;
public class test2 extends Activity {
/** Calledwhen the activity is first created. */
GLSurfaceView myRenderer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myRenderer=new GLSurfaceView(this);
myRenderer.setRenderer(new Renderer());
setContentView(myRenderer);
}
}
Renderer.java
package my.test2;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView;
public class Renderer implementsGLSurfaceView.Renderer{
////////////定义要使用的颜色/////////////
////////////定义缓冲区////////////////////
private FloatBuffer vertexBuffer;
////////////定义角度/////////////////////
////////////定义矩阵////////////////////
private float[] vertexArray={
-0.5f,0.5f,0,
0.5f,0.5f,0,
0.5f,-0.5f,0,
-0.5f,-0.5f,0
};
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClearColor(0f,0f,0f,1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glColor4f(0.5f,0.5f, 0.5f, 0.5f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
//gl.glDrawElements(GL10.GL_TRIANGLES,3, GL10.GL_UNSIGNED_SHORT, indexBuffer);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
gl.glViewport(0, 0, width, height);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
init();
}
private void init(){
ByteBuffer vbb=ByteBuffer.allocateDirect(4*3*4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer=vbb.asFloatBuffer();
vertexBuffer.put(vertexArray);
vertexBuffer.position(0);
}
}
效果图:
glDrawArray它有多种绘图模式
GL_POINTS
GL_LINES
GL_LINE_LOOP
GL_LINE_STRIP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
下面主要讲解一下后3个模式
这三个模式都是连续绘制三角形的,三角形的个数由模式类型,以及顶点矩阵中的顶点个数决定的。
GL_TRIANGLES
这个参数意味着OpenGL使用三个顶点来组成图形。所以,在开始的三个顶点,将用顶点1,顶点2,顶点3来组成一个三角形。完成后,在用下一组的三个顶点(顶点4,5,6)来组成三角形,直到数组结束。
GL_TRIANGLE_STRIP
OpenGL的使用将最开始的两个顶点出发,然后遍历每个顶点,这些顶点将使用前2个顶点一起组成一个三角形。
GL_TRIANGLE_FAN
在跳过开始的2个顶点,然后遍历每个顶点,让OpenGL将这些顶点于它们前一个,以及数组的第一个顶点一起组成一个三角形。
在前面的代码中,我们用的模式是GL_TRIANGLE_FAN,看下图
效果图:

使用GL_TRIANGLE_FAN,绘出三角形的顺序是三角形ABC,然后是三角形ACD。
若使用GL_TRIANGLE_STRIP,则效果图为:

绘出三角形的顺序是三角形ABC,然后是三角形BCD。