Android(安卓)OpenGL ES学习
16lz
2022-07-04
Android用的是OpenGL图形函数库,它可以跨平台。
OpenGL的定义:OpenGL(Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
Android所用到的是它的一个子集OpenGL ES(OpenGL for Embedded Systems(嵌入式系统))就是OpenGL的嵌入式版本。
1.主activity
package com.jftt.opengl;import android.app.Activity;import android.os.Bundle;public class OpenGL extends Activity {private static final String TAG = OpenGL.class.getSimpleName();private VortexView vortexView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);vortexView = new VortexView(this);setContentView(vortexView);}@Overrideprotected void onPause() {super.onPause();vortexView.onPause();}@Overrideprotected void onResume() {super.onResume();vortexView.onResume();}}
2.继承GLSurfaceView类的自己的View
package com.jftt.opengl;import android.content.Context;import android.opengl.GLSurfaceView;import android.view.MotionEvent;public class VortexView extends GLSurfaceView {private static final String LOG_TAG = VortexView.class.getSimpleName();private VortexRenderer renderer;public VortexView(Context context) {super(context);renderer = new VortexRenderer();setRenderer(renderer);}@Overridepublic boolean onTouchEvent(final MotionEvent event) {queueEvent(new Runnable() {@Overridepublic void run() {renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);renderer.setAngle(event.getX() / 10);}});return super.onTouchEvent(event);}}
3.实现渲染器renderer类
package com.jftt.opengl;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 VortexRenderer implements GLSurfaceView.Renderer {private static final String TAG = VortexRenderer.class.getSimpleName();private float red = 0f;private float green = 0f;private float blue = 0f;private ShortBuffer indexBuffer;private FloatBuffer vertexBuffer;private short[] indicesArray = { 0, 1, 2 };private int numberOfVertices = 3;private float angle;private void initTriangle() {ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);vbb.order(ByteOrder.nativeOrder());vertexBuffer = vbb.asFloatBuffer();ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);ibb.order(ByteOrder.nativeOrder());indexBuffer = ibb.asShortBuffer();float[] coords = { -0.5f, -0.5f, 0f, 0.5f, -0.5f, 0f, 0f, 0.5f, 0f };vertexBuffer.put(coords);indexBuffer.put(indicesArray);vertexBuffer.position(0);indexBuffer.position(0);}public void setColor(float red, float green, float blue) {this.red = red;this.green = green;this.blue = blue;}public void setAngle(float angle){this.angle = angle;}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);initTriangle();}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {gl.glViewport(0, 0, width, height);}@Overridepublic void onDrawFrame(GL10 gl) {gl.glClearColor(red, green, blue, 1.0f);gl.glClear(GL10.GL_COLOR_BUFFER_BIT);gl.glRotatef(angle, 0f, 1f, 0f);gl.glColor4f(0.5f, 0f, 0f, 0.5f);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);gl.glDrawElements(GL10.GL_TRIANGLES, numberOfVertices, GL10.GL_UNSIGNED_SHORT, indexBuffer);}}
4.封装的三角形的类
package com.jftt.opengl;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import java.nio.ShortBuffer;import java.util.Random;public class Triangle {private short[] myIndecesArray = { 0, 1, 2 };private int numberOfVertices = 3;private float red = 0f;private float green = 0f;private float blue = 0f;// a raw buffer to hold indices allowing a reuse of points.private ShortBuffer indexBuffer;// a raw buffer to hold the verticesprivate FloatBuffer vertexBuffer;private Random random = new Random();public Triangle() {red = random.nextFloat();red = red - (float) Math.floor(red);green = random.nextFloat();green = green - (float) Math.floor(green);blue = random.nextFloat();blue = blue - (float) Math.floor(blue);ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);vbb.order(ByteOrder.nativeOrder());vertexBuffer = vbb.asFloatBuffer();ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);ibb.order(ByteOrder.nativeOrder());indexBuffer = ibb.asShortBuffer();float[] coords = { randomValue(red), randomValue(red),randomValue(red), randomValue(green), randomValue(green),randomValue(green), randomValue(blue), randomValue(blue),randomValue(blue) };for (int i = 0; i < numberOfVertices; i++) {for (int j = 0; j < 3; j++) {vertexBuffer.put(coords[i * 3 + j]);}}for (int i = 0; i < 3; i++) {indexBuffer.put(myIndecesArray[i]);}vertexBuffer.position(0);indexBuffer.position(0);}private float randomValue(float value) {int tmp = random.nextInt(2);if (tmp == 0) {tmp = -1;}return value * tmp;}public FloatBuffer getVertexBuffer() {return vertexBuffer;}public ShortBuffer getIndexBuffer() {return indexBuffer;}public int getNumberOfVertices() {return numberOfVertices;}public float getGreen() {return green;}public float getRed() {return red;}public float getBlue() {return blue;}}
更多相关文章
- 2011年Android(安卓)Camera学习笔记之一
- Android(安卓)N 指纹框架
- android OpenGL ES2.0编程初学
- Android中OpenMax的适配层
- Android获取屏幕大小
- Android(安卓)初识Retrofit
- OpenCV4Android开发
- Android实现圆角弹框功能
- Android(安卓)MVP Demo