zoukankan      html  css  js  c++  java
  • Android OpenGL 开发

    2013-06-30

    Android OpenGL 开发

    Android提供OpenGL包,专门用于3D的加速和渲染等。

    OpenGL, Open Graphics Library, 是一个专业的图形程序接口,是一个功能强大、调用方便的底层图形库。

    OpenGL ES ,基于OpenGL API设计,是OpenGL三维图形API的子集,是专为内嵌和移动设备设计的一个2D/3D轻量图形库。

    OpenGL ES 1.0  基于OpenGL 1.3,OpenGL ES 1.1 基于 OpenGL 1.5,OpenGL ES 2.0 基于 OpenGL 2.0。

     

    1. Android构建一个3D开发的基本框架

    // 导入库

    import javax.microedition.khronos.opengles.GL10;

    // 实例化OpenGLContext

    GL10 gl = (GL10) mOpenGLContext.getGL();

    // 在onDraw方法开始

    mOpenGLContext.waitNative();

    // 在onDraw方法结束

    mOpenGLContext.waitGL();

    GLSurfaceView包含一个专门用于渲染3D的接口Renderer

    // 引入Renderer

    import android.opengl.GLSurfaceView.Renderer;

    // 创建Renderer接口的一个实现类

    public class GLRender implements Renderer

    // 在GLRender类中,实现三个抽象方法

    public void onDrawFrame(GL10 gl);

    // 窗口发生改变

    public void onSurfaceChanged(GL10 gl, int width, int height);

    // 窗口创建

    public void onSurfaceCreated(GL10 gl, EGLConfig config);

    // 在onSurfaceCreated方法中初始化

    // 修正透视

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

    // R, G, B, A

    gl.glClearColor(0, 0, 0, 0);

    // 阴影平滑

    gl.glShadeModel(GL10.GL_SMOOTH);

    // 设置深度缓存

    gl.glClearDepthf(1.0f);

    // 启用深度测试

    gl.glEnable(GL10.GL_DEPTH_TEST);

    // 深度测试类型

    gl.glDepthFunc(GL10.GL_LEQUAL);

    // 在onSurfaceChanged方法中

    // 设置OpenGL场景的大小

    gl.glViewport(0, 0, width, height);

    // 为屏幕设置透视图,意味着越远的东西看起来越小

    // 投影矩阵负责为场景增加透视

    gl.glMatrixModel(GL10.GL_PROJECTION);

    // 将所选的矩阵状态恢复成原始状态

    gl.glLoadIdentity();

    // 设置视口的大小

    // 前面4个参数确定窗口大小,后面两个参数确定深度的起点和终点

    gl.glFrustumf(-ratio, ratio, –1, 1, 1, 10);

    // 指明任何新的变化将影响ModelView Matrix

    gl.glMatrixModel(GL10.GL_MODELVIEW);

    // 恢复成原始状态

    gl.glLoadIdentity();

    // 在onDrawFrame方法中

    // 清除屏幕和深度缓存

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glLoadIdentity();

    // 设置Renderer

    Renderer render = new GLRender();

    GLSurfaceView glView = new GLSurfaceView(this);

    glView.setRenderer(render);

    setContentView(glView);

     

    2. 多边形

    在OpenGL中绘制的任何模型都会被分解成三角形、四边形。

    OpenGL坐标系:调用glLoadIdentity()之后,当前点移到屏幕中心,x坐标轴从左至右,y坐标轴从下至上,z坐标轴从里往外。

    在3D空间中,三角形每个顶点由(x, y, z)组成。

    // 平移操作

    gl.glTranslatef(-1.5f, 0.0f, –6.0f);

    // 开启顶点设置功能

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    // 设置顶点数据

    gl.glVertexPointer(int size, int type, int stride, Buffer pointer)

    gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);

    参数1:size, 用于描述顶点的尺寸,(x,y,z)坐标系,所以是3

    参数2:type, 描述顶点的类型

    参数3:stride, 描述了步长

    参数4:pointer, 顶点缓存,即我们创建的顶点数组

    // 三角形的三个顶点

    private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{0, one, 0, –one, –one, 0, one, –one, 0});

    // 将顶点绘制出来

    gl.glDrawArray(int mode, int first, int count)

    gl.glDrawArray(GL10.GL_TRIANGLES, 0, 3);

    参数1:mode, 描述了绘制的模式

    参数2:first, 开始位置

    参数3:count, 要绘制的顶点计数

    // 重置当前的模拟观察矩阵

    gl.glLoadIdentity();

    // 左移1.5单位,并移入屏幕6.0

    gl.glTranslatef(1.5f, 0.0f, –6.0f);

    // 设置和绘制正方形

    gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);

    gl.glDrawArray(GL10.GL_TRIANGLE_STRIP, 0, 4);

    // 取消顶点设置

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    通过glEnableClientState方法开启了顶点设置功能,在使用完成之后,需要通过glDisableClientState(GL10.GL_VERTEX_ARRAY);方法关闭/取消顶点设置功能。

     

    3. 颜色

    学习如何对图形进行着色,两种不同的着色方式,分别是:平滑/光滑着色(Smooth Coloring)和平面/单调着色(Flat Coloring)。

  • 相关阅读:
    Linux查看系统信息
    pgrep 和 pkill 使用小记
    linux下json库的编译及例程
    Epoll 实例
    gcc中的内嵌汇编语言
    BZOJ 1053: [HAOI2007]反素数ant
    2018.7.15模拟赛
    BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
    BZOJ 4241: 历史研究
    LUOGU P2365 任务安排
  • 原文地址:https://www.cnblogs.com/fengzhblog/p/3163886.html
Copyright © 2011-2022 走看看