标签:
OpenGL ES
Android包括高性能2D和3D图形开放图形库(OpenGL?的),具体而言,OpenGL ES的API支持。 OpenGL是一个跨平台的图形API,用于指定的3D图形处理硬件标准的软件接口。 ES是用于嵌入式设备的OpenGL规范的味道??。 Android支持OpenGL ES的API的几个版本:
的OpenGL ES 1.0和1.1 - 本API规范是由Android 1.0及更高版本支持。
OpenGL ES 2.0的 - 这个API规范由Android 2.2的(API 8级)或更高版本支持。
的OpenGL ES 3.0 - 本API规范是由Android 4.3(API级别18)和更高的支持。
的OpenGL ES 3.1 - 这个API规范由是Android 5.0(API级别21)和更高的支持。
注意:在设备上的OpenGL ES 3.0 API的支持,需要由设备制造商提供了这个图形管线的实现。运行Android 4.3或更高版本的设备可能不支持的OpenGL ES 3.0 API。有关检查在运行时支持哪些版本的OpenGL ES的信息,请参阅检查OpenGL ES版本。
注意:由Android框架所提供的特定的API是类似于J2ME JSR239 OpenGL ES的API,但是是不相同的。如果您熟悉J2ME JSR239规范,对变化的警报。
基础
Android的支持OpenGL既通过其框架API和原生开发套件(NDK)。本主题重点介绍了Android框架接口。有关NDK的更多信息,请参阅的Andr??oid NDK。
有两个基础班在Android框架,让您创建和操纵符合OpenGL ES API的图形:GLSurfaceView和GLSurfaceView.Renderer。如果你的目标是使用OpenGL在你的Andr??oid应用程序,了解如何实现一个活动,这些类应该是你的第一个目标。
GLSurfaceView
这个类是一个视图,你可以绘制和操作使用OpenGL API调用的对象,并在功能上SurfaceView类似。您可以通过创建GLSurfaceView的实例,并增加你的渲染它使用这个类。但是,如果你想捕捉触摸屏事件,您应该扩展GLSurfaceView类来实现触摸监听器,如图OpenGL的训练课中,响应触摸事件。
GLSurfaceView.Renderer
此接口定义在GLSurfaceView绘制图形所需要的方法。你必须提供这个接口作为一个单独的类的实现,并使用GLSurfaceView.setRenderer其附加到您GLSurfaceView实例()。
该GLSurfaceView.Renderer接口,您需要实现以下方法:
onSurfaceCreated():创建GLSurfaceView时,系统调用这个方法一次。使用此方法来执行只需要发生一次的操作,如设置OpenGL的环境参数或初始化的OpenGL图形对象。
onDrawFrame()系统调用的GLSurfaceView每个重绘此方法。使用此方法作为主要执行点绘制(并重新绘制)图形对象。
onSurfaceChanged()系统调用此方法时,GLSurfaceView几何变化,包括在GLSurfaceView的大小或设备屏幕的方向变化。例如,当设备从纵向变为横向系统调用此方法。使用此方法可以在GLSurfaceView容器的变化做出反应。
OpenGL ES的包
一旦你建立了使用GLSurfaceView和GLSurfaceView.Renderer为OpenGL ES的容器视图,您可以开始使用下面的类中调用OpenGL的API:
的OpenGL ES 1.0 / 1.1 API包
android.opengl - 这个包提供了一个静态的界面比javax.microedition.khronos封装接口的OpenGL ES 1.0 / 1.1类和更好的性能。
GLES10
GLES10Ext
GLES11
GLES11Ext
javax.microedition.khronos.opengles - 此软件包提供了标准实施的OpenGL ES 1.0 / 1.1。
GL10
GL10Ext
GL11
GL11Ext
GL11ExtensionPack
的OpenGL ES 2.0 API类
android.opengl.GLES20 - 此软件包提供接口的OpenGL ES 2.0,并开始提供Android 2.2的(API级别8)。
的OpenGL ES 3.0 / 3.1 API包
android.opengl - 此软件包提供了接口的OpenGL ES 3.0 / 3.1类。 3.0版开始提供的Andr??oid 4.3(API等级18)。 3.1版开始提供的是Android 5.0(API等级21)。
GLES30
GLES31
GLES31Ext(Android的扩展包)
如果你想开始建设有OpenGL ES的应用程序向右走,遵循的OpenGL ES类显示图形。
声明要求的OpenGL
如果应用程序使用的OpenGL功能,这些功能并非适用于所有的设备,你必须在你的Andr??oidManifest.xml文件这些要求。以下是最常见的OpenGL清单的声明:
OpenGL ES版本的要求 - 如果你的应用需要OpenGL ES的特定版本,您必须通过如下图所示添加以下设置你的清单声明要求。
对于OpenGL ES 2.0的:
<!-- Tell the system this app requires OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true" />添加此声明将使谷歌播放从被安装在不支持OpenGL ES2.0标准的设备将应用程序限制。如果应用程序是专为支持的OpenGL ES3.0的设备,你也可以在你的清单中指定的:
<!-- Tell the system this app requires OpenGL ES 3.0. --> <uses-feature android:glEsVersion="0x00030000" android:required="true" />For OpenGL ES 3.1:
<!-- Tell the system this app requires OpenGL ES 3.1. --> <uses-feature android:glEsVersion="0x00030001" android:required="true" />注:的OpenGL ES API 3.X与2.0 API,这意味着你可以与你的应用程序中实现的OpenGL ES的更灵活的向后兼容。通过声明的OpenGL ES 2.0 API作为您清单的要求,您可以使用该API版本作为默认,检查在运行时API 3.X的可用性,然后如果设备支持使用OpenGL ES 3.x的功能它。有关检查设备所支持的OpenGL ES版本的更多信息,请参阅检查OpenGL ES版本。
图1.默认OpenGL的坐标系(左)映射到一个典型Android装置画面(右)。
上面的图显示了统一协调假设左侧一个OpenGL框架体系,以及如何将这些坐标实际上映射到一个典型的设备屏幕在右侧横向。为了解决这个问题,你可以申请OpenGL的投影模式和相机意见,使您的图形对象具有在任何显示器上以正确的比例转换坐标。
为了运用投影和相机视图,您创建一个投影矩阵,摄像机视图矩阵,并将其应用到OpenGL渲染管线。使他们正确地映射到Android设备屏幕的投影矩阵重新计算图形的坐标。摄像机视图矩阵创建从一个特定的眼睛位置渲染对象的变换。
在OpenGL ES 1.0投影和相机视图
在ES 1.0 API,通过创建每个矩阵,然后将其添加到OpenGL的环境中应用投影和相机视图。
投影矩阵 - 为了重新计算对象创建使用该设备屏幕的几何形状的投影矩阵坐标,以便他们绘制的正确比例。下面的示例代码演示了如何修改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 }相机变换矩阵 - 一旦你使用调整投影矩阵坐标系统,您还必须应用摄影机视图。下面的示例代码显示了如何修改GLSurfaceView.Renderer实施onDrawFrame()方法来应用模型视图,并使用GLU.gluLookAt()实用程序来创建一个模拟摄像机的位置观看的转变。
public void 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 2.0的和更高的投影和相机视图
private final String 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 // Note that the uMVPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. " gl_Position = uMVPMatrix * vPosition; \n" + "} \n";注:上面的例子定义了一个变换矩阵成员在其中应用组合投影矩阵和摄像机视图矩阵顶点着色器。根据您的应用需求,您可能要定义你的顶点着色器单独的投影矩阵和摄像机观察矩阵的成员,以便可以独立改变它们。
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); ... }创建投影和相机的观看矩阵 - 生成的投影和观察矩阵要应用的图形对象。下面的示例代码显示了如何修改GLSurfaceView.Renderer实施onSurfaceCreated()和onSurfaceChanged()方法来创建摄像机视图矩阵,并根据设备的屏幕高宽比的投影矩阵。
public void 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); } public void 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); }应用投影和镜头视角矩阵 - 要应用投影和相机视图变换,乘矩阵一起,然后将其设置到顶点着色器。下面的示例代码显示了如何修改GLSurfaceView.Renderer实施onDrawFrame()方法,在上面的代码创建的投影矩阵和摄像机视图结合起来,然后将其应用于通过的OpenGL渲染图形对象。
public void 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的类显示图形。
图1.插图换算成逆时针顺序绘制坐标列表。
在本例中,三角形的点中,使得它们在反时针方向绘制的顺序进行定义。在这些坐标被绘制的顺序定义了形状的卷绕方向。默认情况下,在OpenGL,这是逆时针方向绘制面对的是前脸。在图1所示的三角形被定义,以便你正在寻找的形状的前表面(由OpenGL作为解释),而另一侧是背面。
为什么很重要知道哪一个形状的脸是前面?答案与OpenGL的一个常用的功能,叫做脸扑杀做。面剔除是用于OpenGL的环境,它允许渲染流水线忽略(未计算或绘制)的形状的背面,节省了时间,存储器和处理周期一个选项:
// enable face culling feature gl.glEnable(GL10.GL_CULL_FACE); // specify which faces to not draw gl.glCullFace(GL10.GL_BACK);如果您尝试使用面部特征扑杀不知道,你的形状,两侧都是正面和背面,你的OpenGL图形要看看有点薄,或可能显示不出来的。所以,总是定义一个逆时针绘制顺序你的OpenGL图形的坐标。
String extensions = javax.microedition.khronos.opengles.GL10.glGetString( GL10.GL_EXTENSIONS);
<uses feature android:name="android.hardware.opengles.aep" android:required="true" />要验证平台版本支持AEP,使用hasSystemFeature(String)方法,在FEATURE_OPENGLES_EXTENSION_PACK传递作为参数。下面的代码片段显示了如何做到这一点的例子:
boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);如果该方法返回true,AEP支持。
private static double glVersion = 3.0; private static class ContextFactory implements GLSurfaceView.EGLContextFactory { private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; public EGLContext createContext( EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { Log.w(TAG, "creating OpenGL ES " + glVersion + " context"); int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) glVersion, EGL10.EGL_NONE }; // attempt to create a OpenGL ES 3.0 context EGLContext context = egl.eglCreateContext( display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); return context; // returns null if 3.0 is not supported; } }如果上述的createContext()方法,显示返回null,你的代码应该创建一个OpenGL ES 2.0的范围内,而不是和回落到只使用该API。
// Create a minimum supported OpenGL ES context, then check: String version = javax.microedition.khronos.opengles.GL10.glGetString( GL10.GL_VERSION); Log.w(TAG, "Version: " + version ); // The version format is displayed as: "OpenGL ES <major>.<minor>" // followed by optional content provided by the implementation.
通过这种方法,如果您发现该设备支持更高级别的API版本,您必须销毁最小的OpenGL ES的背景下,并创建一个新的上下文具有较高可用的API版本。
Android API Guides---OpenGL ES
标签:
原文地址:http://blog.csdn.net/qq_21413973/article/details/51180710