一.主要方法
GLSurfaceView
1.setEGLContextClientVersion(int version)
设置GLES版本
2.setRenderer(Renderer renderer)
3. setRenderMode(int renderMode)
GLSurfaceView.Renderer
onSurfaceCreated()
在View的OpenGL创建环境时调用环境。
onDrawFrame()
每一次View调用重绘
GLES20
onSurfaceChanged()
若视图的几何形状发生变化(例如,当设备的屏幕方向发生变化时),则调用此方法。
int shader = GLES20.glCreateShader(type);
创建shader
GLES20.glShaderSource(shader, shaderCode);
///在着色器中添加资源并编译
GLES20.glCompileShader(shader);
编译着色器对象
GLES20.glCreateProgram();
创造一个空的OpenGLES程序
glAttachShader( int program,int shader)
将shader(定点着色器/片元着色器)program
GLES20.glLinkProgram(int program)
连接着色器程序
GLES20.glUseProgram(int program)
使用程序
GLES20.glUniform4fv( int location,int count,float[] v, int offset)
设置绘图的颜色
GLES20.glDrawArrays(int mode,int first, int count)
绘制图形
GLES20.glDisableVertexAttribArray(int index)
禁止顶点数组的句柄
二.实现过程
1.GLSurfaceView相关
glSurfaceView = (GLSurfaceView) findViewById(R.id.glSurfaceView); //GLContext设置OpenGLES2.0 glSurfaceView.setEGLContextClientVersion(2); glSurfaceView.setRenderer(new TriangleRender()); /*渲染方式,RENDERMODE_WHEN_DIRTY表示被动渲染,只调用requestRender或者onResume渲染等方法。RENDERMODE_CONTINUOUSLY表示持续渲染*/ glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
2.定义定点着色器和片元着色器
private final String vertexShaderCode = "attribute vec4 vPosition; " "void main() {" "gl_Position = vPosition;" "}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";
3.定义图行
//定义三角形
static float triangleCoords[] = {
0.5f, 0.5f, 0.0f, // top
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f // bottom right
};
4.将坐标写入ByteBuffer,并传递到OpenGL ES图形管道进行处理
GLES20.glClearColor(1.0f,1f,0.5f,1.0f);
//申请底层空间 顶点坐标个数 * 坐标数据类型 float 一个是 4 bytes
ByteBuffer bb = ByteBuffer.allocateDirect(triangleCoords.length * 4);
bb.order(ByteOrder.nativeOrder());
//将坐标数据转换为FloatBuffer,传入OpenGL ES程序
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(triangleCoords);//把顶点坐标信息数组triangleCoords[]存储到 FloatBuffer
vertexBuffer.position(0);//设置从缓冲区的第一个位置开始读取顶点坐标信息
5.资源加入着色器并编译
public int loadShader(int type, String shaderCode){
int shader = GLES20.glCreateShader(type);
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
6.创建程序并连接
//创建一个空的OpenGLES程序
mProgram = GLES20.glCreateProgram();
//将顶点着色器加入到程序
GLES20.glAttachShader(mProgram,vertexShader);
//将片元着色器加入到程序中
GLES20.glAttachShader(mProgram,fragmentShader);
//连接
GLES20.glLinkProgram(mProgram);
7,使用程序绘制图行
//将程序加入到OpenGLES2.0环境
GLES20.glUseProgram(mProgram);
//获取顶点着色器的vPosition成员句柄
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
//启用三角形顶点的句柄
GLES20.glEnableVertexAttribArray(mPositionHandle);
//准备三角形的坐标数据
GLES20.glVertexAttribPointer(mPositionHandle, 3,
GLES20.GL_FLOAT, false,
12, vertexBuffer);
//获取片元着色器的vColor成员的句柄
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
//设置绘制三角形的颜色
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
//绘制三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
//禁止顶点数组的句柄
GLES20.glDisableVertexAttribArray(mPositionHandle);
三.结果