Android OPenGL 初体验
来源:互联网 发布:mac pro 2016电池容量 编辑:程序博客网 时间:2024/06/15 14:57
刚开始学习OpenGL 先简单的绘制个图形,加上翻转效果,后续学习如何使用着色器。最终实现播放YUV格式的图片。
先上图:
public class MainActivity extends Activity implements IOpenGLDemo { private GLSurfaceView mGLSurfaceView; float[] vertices = new float[] { -0.25f, 0.25f, 0, -0.25f, -0.25f, 0, 0.25f, -0.25f, 0, 0.25f, 0.25f, 0 }; byte[] indices = new byte[] { 0, 1, 2, 1, 2, 3 }; float range = 0.0f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGLSurfaceView = new GLSurfaceView(this); mGLSurfaceView.setRenderer(new OpenGLRenderer(this)); setContentView(mGLSurfaceView); } @Override public void DrawScene(GL10 gl) { //顶点坐标buffer ByteBuffer buffer = ByteBuffer.allocateDirect(vertices.length * 4); buffer.order(ByteOrder.nativeOrder()); FloatBuffer vertex = buffer.asFloatBuffer(); vertex.put(vertices); vertex.position(0); //顶点坐标连接顺序 (0,1,2)围成一个三角形 (1,2,3)围成一个三角形 ByteBuffer indicBuff = ByteBuffer.allocateDirect(indices.length * 2); indicBuff.order(ByteOrder.nativeOrder()); indicBuff.put(indices); indicBuff.position(0); gl.glLoadIdentity(); //拉远摄像机的距离 gl.glTranslatef(0, 0, -4); //旋转 gl.glRotatef(range, 0, -1, 0); range++; if (range == 360) { range = 0; } gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //打开顶点输入管线 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //输入顶点坐标 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex); gl.glColor4f(1, 0, 0, 1); //连接坐标点 gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_SHORT, indicBuff); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override protected void onResume() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); mGLSurfaceView.onPause(); }}
public class OpenGLRenderer implements Renderer { private final IOpenGLDemo opengldemo; public OpenGLRenderer(IOpenGLDemo demo) { opengldemo = demo; } @Override public void onDrawFrame(GL10 arg0) { if (opengldemo != null) { opengldemo.DrawScene(arg0); } } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { //sets the current view port to the new size gl.glViewport(0, 0, width, height); //select the projection matrix gl.glMatrixMode(GL10.GL_PROJECTION); //reset the projection matrix gl.glLoadIdentity(); //calculate the aspect ratio of the windows GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.1f, 100.0f); //Select the modelview matrix gl.glMatrixMode(GL10.GL_MODELVIEW); //reset the modelview matrix gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // Set the background color to black ( rgba ). gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Enable Smooth Shading, default not really needed. gl.glShadeModel(GL10.GL_SMOOTH); // Depth buffer setup. gl.glClearDepthf(1.0f); // Enables depth testing. gl.glEnable(GL10.GL_DEPTH_TEST); // The type of depth testing to do. gl.glDepthFunc(GL10.GL_LEQUAL); // Really nice perspective calcu } public static interface IOpenGLDemo { void DrawScene(GL10 gl); }}
点,线段,三角形都是通过顶点来定义的,也就是顶点数组来定义。对应平面上的一系列顶点,可以看出一个个孤立的点 (Point),也可以两个两个连接成线段 (Line Segment) ,也可以三个三个连成三角形 (Triangle)。这些对一组顶点的不同解释就定义了 Android OpenGL ES 可以绘制的基本几何图形,下面定义了 OpenGL ES 定义的几种模式:
GL_POINTS
绘制独立的点。
GL_LINE_STRIP
绘制一系列线段。
GL_LINE_LOOP
类同上,但是首尾相连,构成一个封闭曲线。
GL_LINES
顶点两两连接,为多条线段构成。
GL_TRIANGLES
每隔三个顶点构成一个三角形,为多个三角形组成。
GL_TRIANGLE_STRIP
每相邻三个顶点组成一个三角形,为一系列相接三角形构成。
GL_TRIANGLE_FAN
以一个点为三角形公共顶点,组成一系列相邻的三角形。
以上模式对应到 Android 渲染方法:
OpenGL ES 提供了两类方法来绘制一个空间几何图形:
public abstract void glDrawArrays(int mode, int first, int count) 使用 VetexBuffer 来绘制,顶点的顺序由 vertexBuffer 中的顺序指定。
public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由 indices Buffer 指定。
其中 mode 为上述解释顶点的模式。
阅读全文
0 0
- Android OPenGL 初体验
- Android OpenGL初体验
- [OpenGL ES 01]OpenGL ES之初体验
- OpenGL ES 01]OpenGL ES之初体验
- [OpenGL ES 01]iOS上OpenGL ES之初体验
- [OpenGL ES 01]OpenGL ES之初体验
- [OpenGL ES 01]OpenGL ES之初体验
- [OpenGL ES 01]OpenGL ES之初体验
- [OpenGL ES 01]OpenGL ES之初体验
- 体验OpenGL新版本
- Android初体验
- android初体验
- Android初体验
- Android 之初体验
- android-Handler 初体验
- Android开发初体验
- [gkk]android初体验
- Android Stuido 初体验
- 什么是时钟周期?什么是机器周期?什么是指令周期?
- Hibernate5.2.5的配置
- hibernate中session中的update方法,改动了一下,让数据库中原有的属性不变,只更新传入对象中改动的属性
- synchronized 修饰的方法无法实现互斥的问题解决
- UE4引擎学习笔记:Blueprints Visual Scripting->Basic Scripting
- Android OPenGL 初体验
- 手把手带你撸一套Android简易ORM框架
- web服务器接口返回参数有null值
- ES6中的export、import、export default详解
- 从二分类到多分类的迁移策略
- js中使用background-size等带“-”的css样式
- JavaScript基础部分(三)
- 正则表达式笔记
- linux 基本命令-补充