首先,要了解opengl 在android中只有三种绘制方式-点,线,和三角形。

点的描绘方式:GL_POINTS

线的描绘方式:
GL_LINES(每两个顶点作为独立的线)
GL_LINE_STRIF(从第0个顶点到最后一个顶点依次相连)

GL_LINE_LOOP(从第0个顶点到最后一个顶点依次相连,最后一个顶点连接初始顶点)

三角形的绘制方式:
GL_TRIANGLES(以 每三个顶点来 形成三角形)
GL_TRIANGLES_STRIP(n,n+1,n+2 依次连接的顶点形成的 所有三角形)
GL_TRIANGLES_FAN (以第0个顶点确定,其余两个顶点依次为n,n+1来绘制三角形 )

在绘制图像时,首先建一个类定义创建的图形形状。

第一步骤: float verticesArray 确定顶点, short indicesArray (索引)确定顺序。

第二步骤: 创建类如:Square(){}来缓冲数据;
ByteBuffer vbb = ByteBuffer.allocateDirect(verticesArray.length * 4)开辟新的累存块
vbb.order(ByteOrder.nativeOrder())
FloatBuffer vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);放入索引坐标数据
vertexBuffer.position(0);起始位置设定

第三步骤: 创建方法来构造形状
draw( GL10 gl )-->
gl.glColor4f(1.0f,0.0f,0.0f,1.0f);设置颜色
   gl.glTranslatef(0.1f,0,-2.0f);创建的形状初始坐标
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);采用顶点坐标数组
gl.glVertexPointer(3//坐标数,GL10.GL_FIXED,0,vertexBuffer//顶点坐标缓冲 )指定顶点坐标数据
gl.glDrawElement(绘制方式,indicesArray.length//索引数,GL10.GL_UNSIGNED_SHORT//,索引缓冲)绘制图像

public class Square {private float vertices[] = {-0.1f, 0.1f, 0.0f,
            -0.1f, -0.1f, 0.0f,
            0.1f, -0.1f, 0.0f,
            0.1f, 0.1f, 0.0f,
    };

    private short[] indices = {0, 1, 2, 0, 2, 3};

    private FloatBuffer vertexBuffer;
    private ShortBuffer indexBuffer;

    public Square() {ByteBuffer v_byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
        v_byteBuffer.order(ByteOrder.nativeOrder());
        vertexBuffer = v_byteBuffer.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);

        ByteBuffer i_byteBuffer = ByteBuffer.allocateDirect(indices.length * 2);
        i_byteBuffer.order(ByteOrder.nativeOrder());
        indexBuffer = i_byteBuffer.asShortBuffer();
        indexBuffer.put(indices);
        indexBuffer.position(0);
    }public void draw(GL10 gl) {gl.glColor4f(0.8f,0.0f,0.0f,1.0f);
//        gl.glLoadIdentity();
        gl.glTranslatef(0.1f,0,-2.0f);
//        gl.glFrontFace(GL10.GL_CCW);
//        gl.glEnable(GL10.GL_CULL_FACE);
//        gl.glCullFace(GL10.GL_BACK);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
                vertexBuffer);
        gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
                GL10.GL_UNSIGNED_SHORT, indexBuffer);
//        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
//        gl.glDisable(GL10.GL_CULL_FACE);

其次,再创建接口类(GLSurfaceView.Renderer)作为你要放入图像的画布。

重写方法:onSurefaceCreated,onDrawFrame和onSurfaceChanged

第一步骤:onSurefaceCreated(GL10 gl,EGLConfig config){
gl.glShadeModel(GL10.GL_SMOOTH);抗锯齿
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);Hind模式
gl.glClearColor(0.0f,0.8f,0.0f,0.5f);桌布颜色
gl.glClearDepthf(1.0f);深度清理缓存
}

第二步骤:onDrawFrame(GL10 gl){
将之前描绘的图形初始化
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT| GL10.GL_DEPTH_BUFFER_BIT);清理缓存
  gl.glLoadIdentity()设置当前矩阵为单位矩阵
  gl.glPushMatrix();
            drawLine.draw(gl);绘制图像
           gl.glPopMatrix();

}

第三步骤:onSurfaceChanged(GL10 gl,int width,int height){
gl.glViewport(0,0,width,height)设置视图
gl.glMatrixMode(GL10.GL_PROJECTION);设置为投影矩阵
gl.glLoadIdentity()设置当前矩阵为单位矩阵
GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);
               gl.glMatrixMode(GL10.GL_MODELVIEW);
                gl.glLoadIdentity();
}

public class MyRenderer implements GLSurfaceView.Renderer {Drawcub drawcub;
    public void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glShadeModel(GL10.GL_SMOOTH);//抗锯齿
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);//Hind模式
        gl.glClearColor(0.0f,0.0f,0.2f,0.5f);//桌布颜色
        gl.glClearDepthf(1.0f);//深度清理缓存
    }public void onDrawFrame(GL10 gl){Square square = new Square();
        DrawPoint drawPoint = new DrawPoint();
        DrawLine drawLine = new DrawLine();
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT
                        | GL10.GL_DEPTH_BUFFER_BIT);
        // Replace the current matrix with the identity matrix
        gl.glLoadIdentity();
        gl.glPushMatrix();
//        square.draw(gl);
        drawcub.drawSelf(gl);
        gl.glPopMatrix();
    }public void onSurfaceChanged(GL10 gl,int width,int height){gl.glViewport(0,0,width,height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);
        drawcub = new Drawcub(0,0,0,3,(float)width/(float)height);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();

    }

最后setContentView将初始化的GLSrefaceView(),放入activity中。

public class SceneRenderer implements GLSurfaceView.Renderer {Drawcub drawcub;
    public void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glShadeModel(GL10.GL_SMOOTH);//抗锯齿
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);//Hind模式
        gl.glClearColor(0.0f,0.0f,0.2f,0.5f);//桌布颜色
        gl.glClearDepthf(1.0f);//深度清理缓存
    }public void onDrawFrame(GL10 gl){Square square = new Square();
        DrawPoint drawPoint = new DrawPoint();
        DrawLine drawLine = new DrawLine();
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT
                        | GL10.GL_DEPTH_BUFFER_BIT);
        // Replace the current matrix with the identity matrix
        gl.glLoadIdentity();
        gl.glPushMatrix();
//        square.draw(gl);
        drawcub.drawSelf(gl);
        gl.glPopMatrix();
    }public void onSurfaceChanged(GL10 gl,int width,int height){gl.glViewport(0,0,width,height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);
        drawcub = new Drawcub(0,0,0,3,(float)width/(float)height);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();

    }

续写,写了一个好玩的东西。

MainActivity:

public class MainActivity extends Activity {@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        GLSurfaceView view = new GLSurfaceView(this);
        view.setRenderer(new MyRenderer());
        setContentView(view);
    }
}

MyRenderer:

public class MyRenderer implements GLSurfaceView.Renderer {float positionX =0;
    float positionY =0;
    float positionZ =0;
    float length = 0.5f;
    float distance = 5;
    private float angle;

    Cube cube = new Cube(positionX,positionY,positionZ,length);
    SquareTest squareTest = new SquareTest();
    boolean flag =true;

    public void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
        gl.glShadeModel(GL10.GL_SMOOTH);
    //add
        gl.glClearDepthf(1.0f);// OpenGL docs.
        // Enables depth testing.
        gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs.
        // The type of depth testing to do.
        gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs.
        // Really nice perspective calculations.
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs.
                GL10.GL_NICEST);
    }public void onDrawFrame(GL10 gl){gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glTranslatef(positionX ,positionY, positionZ-distance);
        gl.glPushMatrix();
        gl.glRotatef(angle, 5, 5, 5);
//        square.onDraw(gl);
        cube.onDraw(gl);
        gl.glPopMatrix();
        gl.glPushMatrix();

        DynamicPicture();

    }private void DynamicPicture(){angle++;
        if (flag == true){distance = distance+ 0.02f;
            if (distance>=12){flag = false;
            }}else if (flag ==false){distance = distance-0.02f;
            if(distance<=6){flag =true;
            }}}public void onSurfaceChanged(GL10 gl,int width, int height){gl.glViewport(0,0,width,height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }}

Cube:

public class Cube {FloatBuffer verticesBuffer;
    ShortBuffer indexBuffer;
    int verticesCount ;
    int indexCount;
    public Cube(float positionX,float positionY,float positionZ, float length){float vertices[] = {positionX-length,positionY-length,positionZ-length,
                -(positionX-length),positionY-length,positionZ-length,
                -(positionX-length),-(positionY-length),positionZ-length,
                positionX-length,-(positionY-length),positionZ-length,

                positionX-length,positionY-length,-(positionZ-length),
                -(positionX-length),positionY-length,-(positionZ-length),
                -(positionX-length),-(positionY-length),-(positionZ-length),
                positionX-length,-(positionY-length),-(positionZ-length),
        };

        short index[]={0,1,1,2,2,3,3,0,
                4,5,5,6,6,7,7,4,
                0,4,1,5,2,6,3,7
        };

        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
        vbb.order(ByteOrder.nativeOrder());
        verticesBuffer = vbb.asFloatBuffer();
        verticesBuffer.put(vertices);
        verticesBuffer.position(0);
//
        ByteBuffer ibb = ByteBuffer.allocateDirect(index.length*2);
        ibb.order(ByteOrder.nativeOrder());
        indexBuffer = ibb.asShortBuffer();
        indexBuffer.put(index);
        indexBuffer.position(0);

        verticesCount = vertices.length;
        indexCount = index.length;
    }public void onDraw(GL10 gl){gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        gl.glFrontFace(GL10.GL_CCW);
        gl.glEnable(GL10.GL_CULL_FACE);
        gl.glCullFace(GL10.GL_BACK);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

        gl.glVertexPointer(3, GL10.GL_FLOAT, 0,verticesBuffer);//GL_FLOAT
        gl.glDrawElements(GL10.GL_LINES, indexCount, GL10.GL_UNSIGNED_SHORT, indexBuffer);

        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisable(GL10.GL_CULL_FACE);
    }
}

Android学习日记(yzy):opengl 绘制2d图形 基本框架相关推荐

  1. OpenGL与3D开发-绘制2D图形

    绘制2D图形 文章目录 绘制2D图形 1.OpenGL ES在Android中涉及的关键类 1.1.GLSurfaceView 1.2.GLSurfaceView.Renderer 接口 1.3. G ...

  2. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...

  3. (转)一个用D3D绘制2D图形的例子

    一个用D3D绘制2D图形的例子 思路如下: (1)函数Do_Init初始化D3D,D3D设备,顶点缓冲,纹理:主要调用这几个函数:         Direct3DCreate9,GetAdapter ...

  4. 计算机图形学:实验二——OpenGL绘制基本图形

    1. 实验目的 练习OpenGL基础编程,实现OpenGL的颜色混合和渐变效果. 2. 实验内容和要求 按要求完成以下两个绘图,提交纸质实验报告,同时提交实验报告和代码的电子版. I). 利用Open ...

  5. android学习日记 RecyclerView的简单使用

    android学习日记 RecyclerView的简单使用 文章目录 android学习日记 RecyclerView的简单使用 一.如何使用RecyclerView? 二.使用步骤 1.首先在bui ...

  6. Android学习日记 Notification 通知

    Android学习日记 Notification 通知 文章目录 Android学习日记 Notification 通知 前言 使用步骤 总结 前言 下拉状态栏显示的通知功能 使用步骤 代码如下: p ...

  7. Android开发笔记(一百五十三)OpenGL绘制三维图形的流程

    从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发. OpenGL的全称是"Open Graphics Library", ...

  8. android绘制过程3d图形,Android开发之OpenGL绘制三维图形的流程

    从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发. OpenGL的全称是"Open Graphics Library", ...

  9. 安卓学习日记——画布与绘制

    先提一下Draw 9-patch 老版本的Android Studio是在SDK目录下的Tools里有个draw9patch 新版Android Studio是可以在AS里直接创建的(一开始没在目录下 ...

  10. 使用Two.js绘制2D图形的初学者指南

    Two.js一个API,可轻松使用代码创建2D形状. 继续学习,您将学习如何从JavaScript创建形状和设置动画效果. Two.js与渲染器无关,因此您可以依靠相同的API使用Canvas,SVG ...

最新文章

  1. 小猿圈linux之运维工程师面试题(答案版)
  2. SOCKET是调用操作系统通信服务的一种机制
  3. gelera mysql_基于Galera的MySQL高可用集群
  4. 开源:推荐一个不错的离线IP地址定位库
  5. ios 自定义加载动画效果
  6. MySQL 高级- 输出参数
  7. 暗通道先验去雾实现过程分析
  8. Linux系统下区别对比(~、/home与/root)
  9. VS 2019 要来了,是时候了解一下 C# 8.0 新功能
  10. python call agilent com_PyVISA通过RS232(USB)与安捷伦34970A通信时出现超时错误
  11. MongoDB学习day05--MongDB开启权限验证,创建用户
  12. 每日一码——链表基本操作
  13. Codeforces Round #253 DIV1 C 馋
  14. c语言显示cpuid_ccpuid:CPUID信息模块。范例:显示所有的CPUID信息
  15. 黑苹果开启核显加速_【黑苹果】关于双显卡正确开启核显加速
  16. SPSS如何验证是否符合正态分布
  17. php判断4的倍数,4的倍数特征(4的倍数特征规律怎样找)
  18. codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
  19. [Erlang危机](3.2)限制输入
  20. objective-c常见类型%z

热门文章

  1. 出场顺序很重要下一句_年少有为一夜刷爆朋友圈:人生的出场顺序真的很重要...
  2. spring mvc 配置使用定时任务
  3. a36.ansible 生产实战案例 -- 基于kubeadm安装kubernetes v1.23 -- 集群部署(一)
  4. php微信 api,PHP微信API接口类
  5. 一图看懂西方哲学全脉络
  6. UE4 坐标系坐标轴旋转轴
  7. python中quadratic_python 练习题:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程ax^2+bx+c=0的两个解...
  8. vue pc端调用摄像头进行拍照并实现裁剪上传
  9. PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  10. python删除重复单词_Python - 过滤重复的单词