Android图形---OpenGL

Android openGl开发详解(一)——绘制简单图形 1. What? openGl是什么?openGl ES又是什么? 2. How? Android中的openGL 如何使用? 3. GlSurfaceView是什么? GLSurfaceView的作用是什么? GLSurfaceView如何使用? 4. GlSurfaceView.Renderer是什么?GLSurfaceView.Renderer的作用?GLSurfaceView.Re... 阅读详情

Android系统包含了OpenGL(Open Graphics Library),从而给2D和3D图形提供了高性能的支持,尤其是OpenGL ES API。OpenGL是一个跨平台图形API,它给3D图形处理指定了一个标准的软件接口。OpenGL ES是一种用于嵌入式设备的OpenGL规范。从Android1.0开始,就提供了对OpenGL ES1.0和1.1API规范的支持。从Android2.2(API Level 8)开始,框架开始支持OpenGL ES2.0 API规范。

注意:由Android框架所指定的API有点类似J2ME的JSR239 OpenGL ES API,但是它们还是有区别的,如果你熟悉J2ME的JSR239规范,就要小心其中的变化。

基础

Android通过它框架API和NDK(Native Development Kit)来支持OpenGL。本文主要关注Android框架接口,关于NDK的更多信息,请看Android NDK(http://developer.android.com/sdk/ndk/index.html)

在Android框架中有两个OpenGL ES API类库用来创建和维护图形:GLsurfaceView和GLSurfaceView.Renderer。如果是要在应用程序中使用OpenGL,那么了解在一个Activity如何实现这些类应该是第一目标。

GLSurfaceView

这个类是一个View,在这个类中能够绘制和维护使用OpenGL API调用的对象,并且它跟SurfaceView类的功能类似。通过创建GLSurfaceView类的一个实例,并给它添加一个Renderer对象来使用这个类。但是,如果想要捕获触屏事件,那么就应该继承GLSurfaceView类并实现它的触屏监听器。示例程序TouchRotateActivity(http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html)。

GLSurfaceView.Renderer

这个接口定义了在一个OpenGL的GLSurfaceView类中绘制图形所必须的方法。必须提供一个单独的类来实现这个接口,并且使用GLSurfaceView.setRenderer()方法把它绑定到GLSurefaceView类的实例上。

以下是必须实现的GLSurfaceView.Renderer接口方法:

1. onSurfaceCreated()

在创建GLSurfaceView对象时,系统会调用一次这个方法。使用这个方法来执行那些只需要发生一次的动作,如设置OpenGL环境参数或初始化OpenGL图形对象。

2. onDrawFrame()

每次重绘GLSurefaceView对象时,系统都会调用该方法。使用这个方法作为绘制图形(包括图形重绘)对象的初始执行点。

3. onSurefaceChanged()

当GLSurfaceView对象的几何图形发生改变时(包括尺寸或设备屏幕方向的改变等),系统会调用这个方法。例如,当设备从纵向改到横向时,系统就会调用这个方法。使用这个方法来响应GLSurfaceView容器中的改变。

OpenGL 包

一旦使用GLSurfaceView和GLSurfaceView.Renderer类给OpenGL建立了一个View容器,那么就可以开始使用以下的类来调用OpenGL的API:

1. OpenGL ES 1.0/1.1 API 包

android.opengl------这个包给OpenGL ES 1.0/1.1提供了一个静态的接口,并且比javax.microedition.khronos包接口具有更好的性能。

GLES10(http://developer.android.com/reference/android/opengl/GLES10.html)

GLES10Ext(http://developer.android.com/reference/android/opengl/GLES10Ext.html)

GLES11(http://developer.android.com/reference/android/opengl/GLES11.html)

GLES10Ext(http://developer.android.com/reference/android/opengl/GLES10Ext.html)

javax.microedition.khronos.opengles------这包提供了OpenGL ES 1.0/1.1的标准实现

GL10(http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html)

GL10Ext(http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10Ext.html)

GL11(http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11.html)

GL11Ext(http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11Ext.html)

GL11ExtensionPack(http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html)

2. OpenGL ES 2.0 API 类

android.opengl.ELES20------这个包提供OpenGL ES 2.0的接口,并且从Android2.2(API Level 8)开始有效。

如果想要立即创建与OpenGL有关的应用程序,请看OpenGL ES 1.0或OpenGL ES 2.0开发指南。

OpenGL ES 1.0:http://developer.android.com/resources/tutorials/opengl/opengl-es10.html

OpenGL ES 2.0:http://developer.android.com/resources/tutorials/opengl/opengl-es20.html

声明OpenGL的需求

如果应用程序使用的OpenGL功能不是在所有的设备上都是有效的,那么就必须在该应用的AndroidManifest.xml文件中包含这些功能需求。

通常OpenGL清单的声明如下:

1. OpenGL ES的版本需求---如果应用程序只支持OpenGL ES 2.0,那么就必须通过把下列设置添加到清单中来声明该需求:

<!-- Tell the system this app requires OpenGL ES 2.0. -->
    
<uses-feature android:glEsVersion="0x00020000" android:required="true" />

    添加这个声明后,会导致Google Play限制该应用程序安装在那些不支持OpenGL ES 2.0的设备上。

2. 纹理压缩的需求---如果应用程序使用了纹理压缩格式。就必须在该应用的清单文件中使用<supports-gl-texture>元素来声明其所支持的格式。关于有效的纹理压缩格式的更多信息,请看本文后续的“纹理压缩支持”

在应用程序清单中声明纹理压缩需求会把该应用程序从那些不支持其声明的压缩格式的设备上隐藏掉(只要有一种格式不被支持)。

绘图对象的坐标映射

在Android设备上显示图形中的基本问题之一就是它们的屏幕可能是各种尺寸和形状的。OpenGL会假设一个方形区域,统一的坐标区域,并且在默认情况下,在一些方形的屏幕能够像在方形区域一样,完美的绘制这些坐标。

图1. 默认的OpenGL坐标系统(左)被映射到一个典型的Android设备屏幕(右)。

上面的插图演示了如何把左边的OpenGL的统一坐标系统映射到右边横屏设备的实际坐标上。使用GpenGL的投影模式,可以解决这个问题,并且照相视图(Camera View)会变换坐标,以便图形对象能够按照正确的比例来显示图形。

为了应用投影和照相视图,就要创建一个投影矩阵和一个照相视图矩阵,并且把它们应用到OpenGL的呈现管道。投影矩阵会重新计算图形的坐标,以便让图形能够正确的映射到Android设备的屏幕上。照相视图矩阵会从一个特殊的视角来创建一个要呈现的对象的变换。

在OpenGL ES 1.0中的投影和照相视图

在ES 1.0 API中,要分别创建投影和照相视图,并把它们添加到OpenGL的环境中。

1. 投影矩阵---为了重新计算图形对象的坐标以便让它们能够按照正确的比例来绘制,就要使用设备屏幕的几何形状来创建一个投影矩阵。下面的示例代码演示了如何编辑GLSurfaceView.Renderer的onSurfaceChanged()方法,来实现基于屏幕的外观比率的投影矩阵的创建,并且把这个投影矩阵应用给OpenGL的呈现环境:

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

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

 

     // make adjustments for screen ratio

     float ratio = (float) width / height;

     gl.glMatrixMode(GL10.GL_PROJECTION);        // set matrix to projection mode

     gl.glLoadIdentity();                        // reset the matrix to its default state

     gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);  // apply the projection matrix

 }

2. 照相变换矩阵---一旦使用一个投影矩阵调整了坐标系统,就必须要使用一个照相视图。下面的代码显示如何使用GLSurfaceView.Renderer的onDrawFrame()方法来实现一个模型视图,并且使用GLU.gluLookAt()工具来创建一个模拟照相机视角的视图变换:

publicvoid onDrawFrame(GL10 gl){
    ...
        // Set GL_MODELVIEW transformation mode
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();                      // reset the matrix to its default state
 
        // When using GL_MODELVIEW, you must set the camera view
        GLU.gluLookAt(gl,0,0,-5,0f,0f,0f,0f,1.0f,0.0f);
        ...
    }

关于如何使用OpenGL ES 1.0投影和照相视图的完整的例子,请看OpenGL ES 1.0指南(http://developer.android.com/training/graphics/opengl/index.html)

在OpenGL ES 2.0中的投影和照相视图

在ES 2.0的API中,首先要通过把一个矩阵成员添加给图形对象顶部的着色器(Vertex Shaders)来使用投影和照相视图。然后,这个被添加的矩阵成员能够生成并把投影和照相视图应用给图形对象。

1. 给顶层着色器(Vertex Shaders)添加矩阵---给视图投影矩阵创建一个有效的,并且要把它作为着色位置的倍增器。在下面的代码中,包含的uMVPMatrix成员允许把投影和照相视图的矩阵应用到使用该着色器的图形对象的坐标上:

privatefinalString vertexShaderCode =
 
        // This matrix member variable provides a hook to manipulate
        // the coordinates of objects that use this vertex shader
        "uniform mat4 uMVPMatrix;   \n"+
 
        "attribute vec4 vPosition;  \n"+
        "void main(){               \n"+
 
        // the matrix must be included as part of gl_Position
        " gl_Position = uMVPMatrix * vPosition; \n"+
 

        "}  \n";

注意:在上例的顶层着色器(Vertex Shader)中定义了一个单一变换矩阵,你可以把投影矩阵和照相视图矩阵一起组合到这个变换矩阵中。根据应用程序的需要,也可以在顶层着色器(Vertex Shader)中分别定义投影矩阵和照相视图矩阵,这样就可以分别对它们进行改变。

2. 访问着色器矩阵---在顶层着色器(Veterx Shader)中创建了一个应用于投影和照相视图的回调之后,就能够访问这个应用于投影矩阵和照相视图矩阵的变量。下面的代码显示了如何编辑GLSurfaceView.Renderer类onSurfaceCreated()方法,来实现对定义在Vertex Shader中的矩阵变量的访问。

publicvoid onSurfaceCreated(GL10 unused,EGLConfig config){
        ...
        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram,"uMVPMatrix");
        ...
    }

3. 创建投影和照相视图矩阵---生成应用与图形对象的投影和视图矩阵。下列代码显示了如何编辑GLSurfaceView.Renderer类的onSurfaceCreated()和onSurfaceChanged()方法,来实现基于设备的屏幕外观比率的照相视图矩阵和投影矩阵的创建:

publicvoid onSurfaceCreated(GL10 unused,EGLConfig config){
        ...
        // Create a camera view matrix
        Matrix.setLookAtM(mVMatrix,0,0,0,-3,0f,0f,0f,0f,1.0f,0.0f);
    }
 
    publicvoid onSurfaceChanged(GL10 unused,int width,int height){
        GLES20.glViewport(0,0, width, height);
 
        float ratio =(float) width / height;
 
        // create a projection matrix from device screen geometry
        Matrix.frustumM(mProjMatrix,0,-ratio, ratio,-1,1,3,7);
    }

4. 应用投影和照相视图矩阵---要适用投影和照相视图的变换,就要把它们一起设置给Verter Shader。下面的代码显示了如果编辑GLSurfaceView.Render类的onDrawFrame()方法,来实现上面代码中创建的投影矩阵和照相视图的合成,然后,把它应用到由OpenGL来呈现的图形对象上。

publicvoid onDrawFrame(GL10 unused){
        ...
        // Combine the projection and camera view matrices
        Matrix.multiplyMM(mMVPMatrix,0, mProjMatrix,0, mVMatrix,0);
 
        // Apply the combined projection and camera view transformations
        GLES20.glUniformMatrix4fv(muMVPMatrixHandle,1,false, mMVPMatrix,0);
 
        // Draw objects
        ...
    }

关于如何使用OpenGL ES 2.0的完整的示例,请看OpenGL ES 2.0指南(http://developer.android.com/training/graphics/opengl/index.html)


Android OpenGL10 基本图形绘制 <3> 下面程序的opengl的图形是根据Opengl1.0版本API进行的. : 首先绘制点: : 新建一个android studio工程,这个工程参考前一篇坐标系的.工程名:PumpKinBasicGL10,主类如下: package org.durian.pumpkinbasicgl10; import android.app.Activity; import android.open 阅读详情

相关推荐

Android OpenGL ES学习笔记之图形变换

一、概念 在OpenGl ES中,将一个3D模型显示到2D屏幕中有以下四个过程。 1. 视角(Viewing)变换 2. 模型(Modeling)变换 3. 投影(Projection)变换 4. 视窗(Viewport)变换 视角(Viewing)变换 相当于你拿着一台照相机移动,从不同的位置来观察一个人,比如下图 模型(Modeling)变换 此时相机不动,

Dennis-Android的博客 3698

attrs中obtainStyledAttributes的使用

在前面的几篇listView中都是用了attrs.xml文件,这里在把obtainStyledAttributes总结 一下。 通过反射可以得到Class clazz=Class.forName("android.R$styleable"); int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);  样式表中是否存在这个...

点点滴滴 330

安卓学习笔记37:利用OpenGL ES绘制平面图形

文章目录零、学习目标一、OpenGL概述二、了解三维直角坐标系三、案例演示 - 绘制三角形(一)运行效果(二)实现步骤1、创建安卓应用【DrawTriangle】2、建模:创建三角形类 - Triangle3、渲染:创建三角形表面视图 - TriangleSurfaceView4、展示:主界面类 - MainActivity5、运行程序,查看效果(三)小结1、建模2、渲染3、展示 零、学习目标 会利用OpenGL ES绘制三角形 会利用OpenGL ES绘制正方形 会利用OpenGL ES绘制六边形 一

howard2005的专栏 1513

Android开发之十九: NDK图形API篇

Android NDK图形API篇 前言 我们知道,在游戏和多媒体领域,图形和图像的处理速度和性能至关重要,在Java层处理图形、图像速度又比较慢,不能满足实际的需要,这时候我们就可以借助原生图形API来让自己的游戏和多媒体应用表现更出色。 本篇重点介绍原生图形API的相关知识,并通过一些示例,让大家更好的掌握原生图形API的相关知识。 原生图形API 原生图形API的种类 lJNI图形A...

随意的风的专栏 1363

Android 中使用 OpenGL 进行图形渲染

通过创建自定义的 GLSurfaceView 和渲染器类,设置 OpenGL 的相关参数和渲染逻辑,我们可以在Android 应用程序中实现高性能的图形渲染。需要注意的是,以上示例只是一个简单的入门示例,实际的 OpenGL 开发涉及到更多的细节和复杂性。在上述代码中,我们在 onSurfaceCreated 方法中设置了清空颜色,并在 onSurfaceChanged 方法中设置了视口的大小。在 Android 中使用 OpenGL 进行图形渲染,首先需要在项目中引入 OpenGL 相关的库文件。

ByteLegend的博客 296

android图形接口的使用

android图形接口的使用

1.6 PC、手机图形API介绍

在更大的Mimap级别可用时,可以提高基本级别,LOD值可以平滑的增加,一提供平滑的流化纹理。深度纹理的最常见用途是渲染阴影,这时深度缓冲区从光源的角度渲染,然后用于在渲染场景时比较,以确定片段是否在阴影中。:Texel,即textureelement或texture pixel的合成字)是纹理元素的简称,它是计算机图形纹理空间中的基本单元。顶点数组:顶点指的是组成图元的各个顶点的坐标数据(在3D笛卡尔坐标中即x,y,z坐标),这些坐标数据可以一起存到一个内存数组中,这个数组就叫做顶点数组。

s178435865的专栏 467

Android三维程序设计——基于OpenGL ES的图形应用程序设计——(源码)

Android三维程序设计——基于OpenGL ES的图形应用程序设计——(源码) 英文版《Learn-OpenGL-ES-Master》

一键下载developer.android.com下的simples

本想直接在线学习,不过网速实在不给力,写了个多线程下载类,把官网下的实例全部下载下,包括图片,java文件,xml文件。并按照相应目录进行存储。总计时间大概6分钟左右下完。 先贴代码: [code="java"] package com.multilThreadDownload; import java.io.ByteArrayOutputStream; import java.io...

我的博客 155

西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践

本文详细解析了西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践。通过实际案例和代码示例,介绍了状态机的基础认知、硬件配置、逻辑开发、调试技巧以及与MES系统集成的高级应用,帮助工程师高效实现设备自动化控制。

weixin_29255731的博客 531

数据中心机房建设标准及依据

深刻理解、尊重并恪守这些依据,是我们以科学、经济、可靠的方式,为蓬勃发展的数字经济筑牢基石的唯一路径。让我们共同努力,以标准为依据,以匠心为精神,建造更多世界一流的高效能、高可用、高智能的绿色数据中心,共同赋能数字中国的宏伟事业,支撑中华民族在数字时代的伟大复兴征程中稳步前行!今天我将力图以宏大的视角和深入的剖析,系统性地阐述数据中心机房建设所应遵循的多层次、多维度的标准依据,揭示这些依据背后的深层逻辑与时代使命,并探讨其如何共同作用于一座世界级数据中心的诞生。,以支持万兆乃至更高速率的传输。

qq_39980997的博客 1139

Android 图形系统---- libdrm 基本API

使用 atomic 方法显示画面的调用方法如下: * 初始化设备,获取所有Object 的 id 和 prop id 信息 open(/dev/dri/card0) //open drm device \--> drmSetClientCap(DRM\_CLIENT\_CAP\_UNIVERSAL\_PLANES)

yihanss的博客 2462

matianl:SAP 最详细的权限管理解析

上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。

matinal 當冬夜漸暖 。公众号:matinal 2155

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

从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发。OpenGL的全称是“Open Graphics Library”,意思是开放图形库,它定义了一个跨语言、跨平台的图形图像程序接口。对于Android开发者来说,OpenGL就是用来绘制三维图形的技术手段,当然OpenGL并不仅限于展示静止的三维图形,也能用来播放运动着的三维动画。不管是三...

weixin_35698738的博客 3107

Keil5与ARM编译器V5安装指南:从下载到配置全流程解析

本文提供Keil5与ARM Compiler V5的完整安装与配置指南。针对新版Keil5默认不包含V5编译器导致老工程编译失败的问题,详细解析了从软件下载、授权管理到获取并正确安装ARM Compiler V5(AC5)的全流程,确保开发者能顺利搭建兼容老项目的稳定开发环境。

weixin_29158047的博客 874

SAP 权限配置(复合角色)

复合角色创建步骤:业务场景:通常单一角色权限颗粒度划分比较细,当需要分配单一角色权限A、B(多个单一角色)给某账号用户Y时,可以先建立一个复合角色C,将A、B绑定到复合角色C中,再将角色C分配给账号Y即完成权限配置。 业务模拟: 1、PFCG创建复合角色: 2、在角色页面添加子角色 在角色分页内添加子角色,点击“菜单”分页中的“读菜单”即可导入子角色中的菜单: 3、将用户分配给...

willieyuan的博客 7087

Android OpenGL是开放图形库

重点: OpenGL是开放图形库 OpenGL是个专业的3D程序接口,是一个功能强大调用方便的底层 3D 图形库。 1.定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可) 2.是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库 3.帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发 ---

u010341339的专栏 702

LPDDR6与LPDDR5 channel/rank/die/bank技术探讨

LPDDR6与LPDDR5 channel/rank/die/bank技术探讨

zilan23的博客 3642

Android OpenGL开发学习(一)绘制简单图形

目录前言:OpenGL是什么:如何使用:1.设置OpenGL版本2.创建GLSurfaceView实例3.实现Renderer接口4.绘制三角形定义图形绘制图形5.投影和相机视图6.增加动画7.项目地址:总结: 前言: 前段时间,闲来无事,打算研究一下自定义camera开发,发现用到了OpenGL,所以打算自学一下,顺便写几篇文章记录一下。 OpenGL是什么: 学习OpenGl先了解一下,它是一个什么东西? OpenGL 是一种跨平台的图形 API,用于为 3D 图形处理硬件指定标准的软件接口。 这

DDUP的博客 5903

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成。

kevin1499的博客 2565

Airtest进阶使用篇-提高脚本稳定性+批量运行脚本

Airtest进阶篇,主要分享如何提高脚本稳定性+如何批量运行脚本生成测试报告!

程序员小杨哥的博客 2569

Android OpenGL画第一个图形(二)

通过OpenGL ES实现一个简单的几何图形显示,在本次学习过程中我们将会了解到OpenGL的坐标系、顶点、着色器、OpenGL程序以及OpenGL开发过程中的调试相关知识。

ZLGSPACE的博客 1216

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ANDROID 高性能图形处理 之 二. OPENGL ES

ANDROID 高性能图形处理 之 二. OPENGL ES OCTOBER 8, 2013TANGZHIMINGLEAVE A COMMENT 在之前的介绍中我们说到在Android 4.2上使用RenderScript有诸多限制,我们于是尝试改用OpenGL ES 2.0来实现滤镜。本文不详细介绍OpenGL ES的规范以及组成部分,感兴趣的同学可以阅读 《OpenGL -ES Pro...

u010029439的博客 718

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android平台使用OpenGL实现图形渲染

OpenGL定义了一个跨编程语言、跨平台的专业图形程序接口。可用于二维或三维图像的处理与渲染,它是一个功能强大、调用方便的底层图形库。对于嵌入式设备,其提供了OpenGL ES(OpenGL for Embedded Systems)版本。 由于OpenGL是跨编程语言、跨平台的设计,所以在每个平台上都要有它的具体实现,负责提供OpenGL的上下文环境以及窗口的管理。在Android平台使用EGL提供本地平台对OpenGL ES的实现。

Lorien Zhang的博客 6851

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 调用系统返回键的功能
下一篇: android开发小经验
myshapozi
博客等级 码龄16年 4粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值