OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。在游戏和特效领域,使用很是普遍。在移动平台上Android支持了OpenGL ES。今天,我开始学习OpenGL ES 并在此记录学习的过程。编程
Android提供了GLSurfaceView,是一个支持OpenGL ES的控件,封装了OpenGL的复杂流程。今天记录一下它的使用方法。数组
public class MainActivity extends AppCompatActivity { private GLSurfaceView glSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); glSurfaceView = new GLSurfaceView(this); glSurfaceView.setRenderer(new GLSurfaceViewRender()); setContentView(glSurfaceView); } @Override protected void onResume() { super.onResume(); glSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); glSurfaceView.onPause(); } }
GLSurfaceViewRender是咱们自定义的类,它实现了GLSurfaceView.Renderer的接口,封装了GLSurfaceView的相关操做和生命周期。缓存
public class GLSurfaceViewRender implements GLSurfaceView.Renderer { private float[] mTriangleArray = { // X, Y, Z 这是一个等边三角形 -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.4f, 0 }; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 设置背景颜色 gl.glClearColor(0.9f, 0.8f, 1f, 0.9f); // 启用顶点数组(不然glDrawArrays不起做用) gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // 设置输出屏幕大小 gl.glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存(若是不调用该代码, 将不显示glClearColor设置的颜色) // 一样若是将该代码放到 onSurfaceCreated 中屏幕会一直闪动 gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 获取颜色 gl.glColor4f(1.0f, 0.4f, 0.4f, 0.8f); // 获取形状数组 FloatBuffer mTriangleBuffer = BufferUtil .floatToBuffer(mTriangleArray); // 每一个点用几个数字描述; // 每一个顶点坐标的变量类型; // 取数据时的间隔,由于有些人习惯把颜色数据也放里边,若是这样,你须要跳过这些点.意思就是每隔stride取一个点; // 每一个顶点的坐标 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer); /** * 参数1:有三种取值 1.GL_TRIANGLES:每三个顶之间绘制三角形,之间不链接 2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式绘制三角形 3.GL_TRIANGLE_STRIP:顺序在每三个顶点之间均绘制三角形。这个方法能够保证从相同的方向上全部三角形均被绘制。以V0V1V2,V1V2V3,V2V3V4……的形式绘制三角形 参数2:从数组缓存中的哪一位开始绘制,通常都定义为0 参数3:顶点的数量 */ gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 加载glLoadIdentity(),等因而将以前矩阵变换致使变化过的栈顶矩阵从新归位,置为单位矩阵!等因而以前的矩阵变换带来的影响到此为止了! gl.glLoadIdentity(); // 平移 (矩阵相乘) gl.glTranslatef(-0.2f, 0.3f, 0f); } static class BufferUtil { public static FloatBuffer mBuffer; public static FloatBuffer floatToBuffer(float[] a) { // 先初始化buffer,数组的长度*4,由于一个float占4个字节 ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4); // 数组排序用nativeOrder mbb.order(ByteOrder.nativeOrder()); mBuffer = mbb.asFloatBuffer(); mBuffer.put(a); mBuffer.position(0); return mBuffer; } } }
以上是用OpenGL 画一个三角形的过程,注释记录详细。编程语言
初步的,就是这样。ide
Done~学习