Android(安卓)OpenGL学习笔记(二)之----三角形的绘制.
16lz
2021-01-25
前面讲了一些Android OpenGl 的概念问题,这一节讲给大家讲一下如何画一个三角现出来.
一、新建一个Android工程命名为:OpenGL_Lesson2.
二、修改OpenGL_Lesson2.java代码如下:
- packagecom.android.tutor;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- publicclassOpenGL_Lesson2extendsActivity{
- privateOpenGlViewmOpenGlView;
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- mOpenGlView=newOpenGlView(this);
- setContentView(mOpenGlView);
- }
- }
三、新建一个类OpenGlView.java继承与GLSurfaceView,代码如下:
- packagecom.android.tutor;
- importandroid.content.Context;
- importandroid.opengl.GLSurfaceView;
- publicclassOpenGlViewextendsGLSurfaceView{
- privateOpenGlRendermOpenGlRender;
- publicOpenGlView(Contextcontext){
- super(context);
- mOpenGlRender=newOpenGlRender();
- setRenderer(mOpenGlRender);
- }
- }
四、新建一个OpenGlRender.java类继承与Renderer,代码如下:
- packagecom.android.tutor;
- importjava.nio.ByteBuffer;
- importjava.nio.ByteOrder;
- importjava.nio.FloatBuffer;
- importjava.nio.ShortBuffer;
- importjavax.microedition.khronos.egl.EGLConfig;
- importjavax.microedition.khronos.opengles.GL10;
- importandroid.opengl.GLSurfaceView.Renderer;
- publicclassOpenGlRenderimplementsRenderer{
- privatefloat_red=0f;
- privatefloat_green=25f;
- privatefloat_blue=200f;
- privateShortBuffer_indexBuffer;
- privateFloatBuffer_vertexBuffer;
- privateshort[]_indicesArray={0,1,2};
- privateint_nrOfVertices=3;
- @Override
- publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
- gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
- initTriangle();
- }
- @Override
- publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
- gl.glViewport(0,0,width,height);
- }
- @Override
- publicvoidonDrawFrame(GL10gl){
- gl.glClearColor(_red,_green,_blue,1.0f);
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- gl.glColor4f(0.5f,0f,0f,0.5f);
- gl.glVertexPointer(_nrOfVertices,GL10.GL_FLOAT,0,_vertexBuffer);
- gl.glDrawElements(GL10.GL_TRIANGLES,_nrOfVertices,GL10.GL_UNSIGNED_SHORT,_indexBuffer);
- }
- privatevoidinitTriangle(){
- //floathas4bytes
- ByteBuffervbb=ByteBuffer.allocateDirect(_nrOfVertices*3*4);
- vbb.order(ByteOrder.nativeOrder());
- _vertexBuffer=vbb.asFloatBuffer();
- //shorthas4bytes
- ByteBufferibb=ByteBuffer.allocateDirect(_nrOfVertices*2);
- ibb.order(ByteOrder.nativeOrder());
- _indexBuffer=ibb.asShortBuffer();
- float[]coords={
- -0.5f,-0.5f,0f,//(x1,y1,z1)
- 0.5f,-0.5f,0f,//(x2,y2,z2)
- 0f,0.5f,0f//(x3,y3,z3)
- };
- _vertexBuffer.put(coords);
- _indexBuffer.put(_indicesArray);
- _vertexBuffer.position(0);
- _indexBuffer.position(0);
- }
- }
五、运行之,效果如下:
vertexBuffer 定义每个顶点的位置; indexBuffer 定义三角形中顶点在 vertextBuffer 中的索引。使用 indexBuffer 和 vertextBuffer 可以节省空间(因为可重复利用 vertex )。
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- android binder 机制三(匿名Service)
- Android(安卓)打开相册选择单张图片实现代码
- Android(安卓)使用junit测试
- Android(安卓)studio 多渠道打包
- android基本程序单元Activity
- Android中TextView滚动显示信息的效果
- Android无需申请权限拨打电话的两种方式
- android的TabActivity