一.主要使用的方法
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);
三.结果