原文

概要

Android包含对开放图形库(OpenGL®),特别是OpenGL ES API的高性能2D和3D图形的支持。OpenGL是一个跨平台的图形API,它为3D图形处理硬件指定了一个标准的软件接口。OpenGL ES是适用于嵌入式设备的OpenGL规范。Android支持几种版本的OpenGL ES API:

  • OpenGL ES 1.0和1.1 - 此API规范受Android 1.0及更高版本的支持。
  • OpenGL ES 2.0 - Android 2.2(API级别8)及更高版本支持此API规范。
  • OpenGL ES 3.0 - Android 4.3(API级别18)及更高版本支持此API规范。
  • OpenGL ES 3.1 - Android 5.0(API级别21)及更高版本支持此API规范。

    警告: 在设备上支持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规范,请注意变体。

另见

  • 用OpenGL ES显示图形
  • OpenGL ES
  • OpenGL ES 1.x规范
  • OpenGL ES 2.x规范
  • OpenGL ES 3.x规范

基础


Android通过其框架API和Native Development Kit(NDK)支持OpenGL。本主题重点介绍Android框架界面。有关NDK的更多信息,请参阅Android NDK。

在Android框架中有两个基础类,可让您使用OpenGL ES API创建和操作图形:GLSurfaceView和 GLSurfaceView.Renderer。如果您的目标是在Android应用程序中使用OpenGL,那么了解如何在活动中实现这些类应该是您的第一个目标。

GLSurfaceView
这个类是一个View可以使用OpenGL API调用来绘制和操作对象的地方,并且在功能上类似于a SurfaceView。
你可以通过创建一个实例GLSurfaceView并添加 Renderer它来使用这个类。但是,如果要捕获触摸屏事件,则应扩展GLSurfaceView该类以实现触摸侦听器,如OpenGL培训课程中的“ 响应触摸事件”所示【原】。

GLSurfaceView.Renderer
该接口定义了在a中绘制图形所需的方法GLSurfaceView。您必须将此接口的实现作为单独的类提供,并GLSurfaceView使用它将其附加到您的实例 GLSurfaceView.setRenderer()。
该GLSurfaceView.Renderer界面要求您实施以下方法:

  • onSurfaceCreated():系统在创建时调用此方法一次GLSurfaceView。使用此方法执行仅需要发生一次的操作,例如设置OpenGL环境参数或初始化OpenGL图形对象。
  • onDrawFrame():系统在每次重绘时调用此方法GLSurfaceView。使用此方法作为绘制(和重新绘制)图形对象的主要执行点。
  • onSurfaceChanged():系统在GLSurfaceView几何更改时调用此方法,包括GLSurfaceView设备屏幕的大小或方向的更改。例如,当设备从纵向变为横向时,系统调用此方法。使用此方法来响应GLSurfaceView容器中的更改。

OpenGL ES软件包

一旦使用GLSurfaceView和建立了OpenGL ES的容器视图GLSurfaceView.Renderer,就可以使用以下类来调用OpenGL API:

  • OpenGL ES 1.0 / 1.1 API包

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

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

          GL10GL10ExtGL11GL11ExtGL11ExtensionPack
  • 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类的接口。从Android 4.3(API级别18)开始,可以使用3.0版本。从Android 5.0(API级别21)开始,可以使用版本3.1。

      GLES30
      GLES31
      GLES31Ext(Android扩展包)

如果您想立即开始使用OpenGL ES构建应用程序,请遵循 使用OpenGL ES 类显示图形。

声明OpenGL要求


如果您的应用程序使用的OpenGL功能在所有设备上都不可用,则必须在AndroidManifest.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" />

    添加此声明会导致Google Play限制您的应用程序安装在不支持OpenGL ES 2.0的设备上。如果您的应用程序专门用于支持OpenGL ES 3.0的设备,那么您也可以在清单中指定:

对于OpenGL ES 3.0:

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

对于OpenGL ES 3.1:

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

注意: OpenGL ES 3.x API与2.0 API向后兼容,这意味着您可以更灵活地在您的应用程序中实现OpenGL ES。通过在清单中声明OpenGL ES 2.0 API作为需求,您可以将该API版本用作默认值,在运行时检查3.x API的可用性,然后在设备支持时使用OpenGL ES 3.x功能它。有关检查设备支持的OpenGL ES版本的更多信息,请参阅检查OpenGL ES版本。

  • 纹理压缩要求 - 如果您的应用程序使用纹理压缩格式,则必须在清单文件中声明您的应用程序支持的格式<supports-gl-texture>。有关可用纹理压缩格式的更多信息,请参阅纹理压缩支持【原】。

在您的清单中声明纹理压缩要求时,会将您的应用程序从不支持至少一种声明压缩类型的设备的用户隐藏起来。有关Google Play过滤如何处理纹理压缩的更多信息,请参阅文档中的 Google Play和纹理压缩过滤【原】部分<supports-gl-texture>。

绘制绘制对象的坐标


在Android设备上显示图形的基本问题之一是其屏幕可能会在大小和形状上有所不同。OpenGL假定一个正方形的统一坐标系统,并且默认情况下,将这些坐标愉快地绘制到典型的非方形屏幕上,就好像它是完全正方形的。

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

上图显示了左侧的OpenGL框架假定的统一坐标系统,以及这些坐标实际如何在右侧横向映射到典型的设备屏幕。要解决这个问题,您可以应用OpenGL投影模式和相机视图来转换坐标,以便您的图形对象在任何显示器上都具有正确的比例。

为了应用投影和相机视图,您可以创建投影矩阵和相机视图矩阵,并将它们应用于OpenGL渲染管线。投影矩阵重新计算图形的坐标,以便它们正确映射到Android设备屏幕。相机视图矩阵创建一个转换,用于从特定的眼睛位置呈现对象。

OpenGL ES 1.0中的投影和相机视图

在ES 1.0 API中,通过创建每个矩阵然后将它们添加到OpenGL环境来应用投影和相机视图。

  1. 投影矩阵 - 使用设备屏幕的几何图形创建投影矩阵,以重新计算对象坐标,以便以正确的比例绘制它们。以下示例代码演示了如何修改实现的onSurfaceChanged()方法,以GLSurfaceView.Renderer 根据屏幕的宽高比创建投影矩阵,并将其应用于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. 相机变换矩阵 - 使用投影矩阵调整坐标系后,还必须应用相机视图。以下示例代码显示如何修改实现的onDrawFrame()方法GLSurfaceView.Renderer 以应用模型视图并使用该 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及更高版本中的投影和相机视图

在ES 2.0和3.0 API中,通过首先将矩阵成员添加到图形对象的顶点着色器中来应用投影和相机视图。通过添加此矩阵成员,您可以生成投影和相机查看矩阵并将其应用于对象。

  1. 向顶点着色器添加矩阵 - 为视图投影矩阵创建一个变量,并将其包含为着色器位置的乘数。在以下示例顶点着色器代码中,包含的uMVPMatrix成员允许您将投影和相机查看矩阵应用于使用此着色器的对象的坐标。

    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";

    注意:上面的示例在顶点着色器中定义了一个单独的变换矩阵成员,您可以在其中应用组合投影矩阵和相机视图矩阵。根据您的应用需求,您可能需要在顶点着色器中定义单独的投影矩阵和相机查看矩阵成员,以便您可以单独更改它们。

  2. 访问着色器矩阵 - 在顶点着色器中创建钩子以应用投影和相机视图后,可以访问该变量以应用投影和相机查看矩阵。以下代码显示如何修改实现的onSurfaceCreated()方法GLSurfaceView.Renderer以访问上面顶​​点着色器中定义的矩阵变量。
    public void onSurfaceCreated(GL10 unused, EGLConfig config) {muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    }
  3. 创建投影和相机查看矩阵 - 生成投影和查看矩阵以应用图形对象。以下示例代码显示了如何修改实现的方法onSurfaceCreated()和 onSurfaceChanged()方法,以 GLSurfaceView.Renderer根据设备的屏幕高宽比创建相机视图矩阵和投影矩阵。

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {// Create a camera view matrixMatrix.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 geometryMatrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
    }
  4. 应用投影和相机观看矩阵 - 要应用投影和相机视图变换,请将矩阵相乘,然后将它们设置为顶点着色器。以下示例代码显示了如何修改实现的onDrawFrame()方法,GLSurfaceView.Renderer以便将以上代码中创建的投影矩阵和相机视图组合起来,然后将其应用于要由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 类显示图形

形状面对和缠绕


在OpenGL中,形状的表面是由三维空间中的三个或更多点定义的表面。一组三个或三个以上的三维点(称为OpenGL中的顶点)具有正面和背面。你怎么知道哪个面朝前,哪个面朝后?好问题。答案与卷绕有关,或者说,你定义一个形状的点的方向。


图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形状的坐标。

注意:可以设置一个OpenGL环境来将顺时针的面视为正面,但这样做需要更多的代码,并且在您向他们寻求帮助时可能会使有经验的OpenGL开发人员感到困惑。所以不要这样做。

OpenGL版本和设备兼容性


自Android 1.0以来,OpenGL ES 1.0和1.1 API规范已得到支持。从Android 2.2(API级别8)开始,该框架支持OpenGL ES 2.0 API规范。OpenGL ES 2.0被大多数Android设备支持,并且推荐用于使用OpenGL开发的新应用程序。在提供OpenGL ES 3.0 API实现的设备上,Android 4.3(API级别18)及更高级别支持OpenGL ES 3.0。有关支持给定版本的OpenGL ES的支持Android的设备的相关数量的信息,请参阅 OpenGL ES版本仪表板。

使用OpenGL ES 1.0 / 1.1 API的图形编程与使用2.0和更高版本的显着不同。1.x版本的API具有更多的便捷方法和固定的图形管道,而OpenGL ES 2.0和3.0 API通过使用OpenGL着色器提供更直接的管道控制。您应该仔细考虑图形要求,并选择最适合您的应用程序的API版本。有关更多信息,请参阅 选择OpenGL API版本。

OpenGL ES 3.0 API提供了比2.0 API更多的功能和更好的性能,并且也向后兼容。这意味着您可以编写针对OpenGL ES 2.0的应用程序,并有条件地包含OpenGL ES 3.0图形功能(如果可用)。有关检查3.0 API可用性的更多信息,请参阅 检查OpenGL ES版本

纹理压缩支持

纹理压缩可以通过减少内存需求并更有效地利用内存带宽来显着提高OpenGL应用程序的性能。Android框架支持ETC1压缩格式作为标准功能,包括 ETC1Util工具类和etc1tool压缩工具(位于Android SDK中<sdk>/tools/)。有关使用纹理压缩的Android应用程序的示例,请参阅CompressedTextureActivityAndroid SDK(<sdk>/samples/<version>/ApiDemos/src/com/example/android/apis/graphics/)中的代码示例。

小心:大多数Android设备都支持ETC1格式,但不保证可用。要检查设备是否支持ETC1格式,请调用该ETC1Util.isETC1Supported()方法。

注意: ETC1纹理压缩格式不支持具有透明度的纹理(Alpha通道)。如果您的应用程序需要具有透明度的纹理,则应调查目标设备上可用的其他纹理压缩格式。

使用OpenGL ES 3.0 API时,ETC2 / EAC纹理压缩格式保证可用。这种纹理格式提供出色的压缩比和高视觉质量,格式也支持透明度(alpha通道)。

除了ETC格式之外,Android设备基于其GPU芯片组和OpenGL实现对纹理压缩提供了各种支持。您应该调查您所针对的设备上的纹理压缩支持,以确定应用程序应支持的压缩类型。为了确定给定设备支持哪些纹理格式,您必须 查询设备并查看OpenGL扩展名,这些名称可识别设备支持哪些纹理压缩格式(以及其他OpenGL功能)。一些常用的纹理压缩格式如下:

  • ATITC(ATC) - ATI纹理压缩(ATITC或ATC)适用于各种设备,并支持RGB纹理的固定速率压缩,支持和不支持Alpha通道。这种格式可以用几个OpenGL扩展名表示,例如:

    • GL_AMD_compressed_ATC_texture
    • GL_ATI_texture_compression_atitc
  • PVRTC - PowerVR纹理压缩(PVRTC)适用于各种设备,并支持每像素2位和4位纹理(带或不带Alpha通道)。这种格式由以下OpenGL扩展名表示:
    • GL_IMG_texture_compression_pvrtc
  • S3TC(DXT n / DXTC) - S3纹理压缩(S3TC)具有多种格式变体(DXT1至DXT5),并且可用性较差。该格式支持4位alpha或8位alpha通道的RGB纹理。这些格式由以下OpenGL扩展名表示:
    • GL_EXT_texture_compression_s3tc

某些设备仅支持DXT1格式变体; 这个有限的支持由以下OpenGL扩展名表示:

  • GL_EXT_texture_compression_dxt1

    • 3DC - 3DC纹理压缩(3DC)是一种不太广泛的格式,支持带alpha通道的RGB纹理。这种格式由以下OpenGL扩展名表示:
  • GL_AMD_compressed_3DC_texture
    警告:所有设备都不支持这些纹理压缩格式。这些格式的支持可能因制造商和设备而异。有关如何确定特定设备上的纹理压缩格式的信息,请参阅下一节。

注意:一旦决定了应用程序支持哪种纹理压缩格式,请确保使用<supports-gl-texture> 在清单中声明它们 。使用此声明可以通过Google Play等外部服务进行过滤,以便您的应用仅安装在支持您的应用所需格式的设备上。有关详细信息,请参阅 OpenGL清单声明。

确定OpenGL扩展

根据OpenGL ES API支持的扩展,OpenGL的实现因Android设备而异。这些扩展包括纹理压缩,但通常还包含OpenGL功能集的其他扩展。

确定特定设备上支持哪些纹理压缩格式和其他OpenGL扩展:

  1. 在目标设备上运行以下代码以确定支持哪些纹理压缩格式:

    String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
  2. 查看此方法的输出以确定设备支持哪些OpenGL扩展。

Android扩展包(AEP)

AEP确保您的应用程序支持OpenGL 3.1规范中描述的核心集之上和之外的标准化OpenGL扩展集。将这些扩展组件打包在一起可以鼓励跨设备实现一致的功能集,同时允许开发人员充分利用最新的移动GPU设备。

AEP还改进了对片段着色器中的图像,着色器存储缓冲区和原子计数器的支持。

为了让您的应用程序能够使用AEP,应用程序的清单必须声明AEP是必需的。另外,平台版本必须支持它。

在清单中声明AEP要求如下:

<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。

有关AEP的更多信息,请访问 Khronos OpenGL ES Registry的页面。

检查OpenGL ES版本

Android设备上有几种可用的OpenGL ES版本。您可以在清单中指定应用程序需要的API的最低版本,但您可能还想同时利用新API中的功能。例如,OpenGL ES 3.0 API与2.0版本的API向后兼容,因此您可能需要编写应用程序以便使用OpenGL ES 3.0功能,但如果3.0 API不适用,则可以回退到2.0 API可用。

在使用高于应用程序清单所需最低版本的OpenGL ES功能之前,应用程序应检查设备上可用API的版本。您可以通过以下两种方式之一来完成此操作:

  1. 尝试创建更高级别的OpenGL ES上下文(EGLContext)并检查结果。
  2. 创建一个支持最小的OpenGL ES上下文并检查版本值。
    以下示例代码演示了如何通过创建EGLContext并检查结果来检查可用的OpenGL ES版本。这个例子展示了如何检查OpenGL ES 3.0版本:

    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 contextEGLContext 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。

以下代码示例演示如何通过首先创建最小支持上下文来检查OpenGL ES版本,然后检查版本字符串:

// 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版本创建新的上下文。

选择一个OpenGL API版本


OpenGL ES 1.0 API版本(和1.1扩展),版本2.0和版本3.0均为创建3D游戏,可视化和用户界面提供了高性能图形界面。OpenGL ES 2.0和3.0的图形编程很大程度上是相似的,3.0版本代表2.0 API的超集和附加功能。OpenGL ES 1.0 / 1.1 API与OpenGL ES 2.0和3.0的编程有很大不同,因此开发人员在开始使用这些API进行开发之前应仔细考虑以下因素:

  1. 性能 - 一般来说,OpenGL ES 2.0和3.0比ES 1.0 / 1.1 API提供更快的图形性能。但是,由于硬件制造商实施OpenGL ES图形管线的差异,性能差异可能因您的OpenGL应用程序运行的Android设备而异。
  2. 设备兼容性 - 开发人员应考虑设备类型,Android版本和OpenGL ES版本可供其客户使用。有关跨设备的OpenGL兼容性的更多信息,请参阅OpenGL版本和设备兼容性部分。
  3. 编码便利性 - OpenGL ES 1.0 / 1.1 API提供了OpenGL ES 2.0或3.0 API中未提供的固定功能管道和便利功能。刚开始使用OpenGL ES的开发人员可能会发现1.0 / 1.1版更快,更方便。
  4. 图形控制 - OpenGL ES 2.0和3.0 API通过使用着色器提供完全可编程的流水线,从而提供更高程度的控制。通过更直接地控制图形处理管道,开发人员可以创建使用1.0 / 1.1 API很难生成的效果。
  5. 纹理支持 - OpenGL ES 3.0 API对纹理压缩具有最好的支持,因为它保证了支持透明度的ETC2压缩格式的可用性。1.x和2.0 API实现通常包含对ETC1的支持,但此纹理格式不支持透明度,因此您通常必须提供您所针对的设备支持的其他压缩格式的资源。有关更多信息,请参阅纹理压缩支持。

虽然性能,兼容性,便利性,控制和其他因素可能会影响您的决定,但您应该根据您认为为用户提供最佳体验的方式选择OpenGL API版本。

update:2018.4.24

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

转载于:https://blog.51cto.com/4789781/2120455

图片和图形之OpenGL ES(8)相关推荐

  1. OpenGL ES之纹理翻转的解决策略

    原因分析 在前面的文章:OpenGL ES之Swift使用GLSL语言渲染图片的显示和OpenGL ES之GLSL渲染图片显示的整体流程中,我们都对图片纹理做了翻转的处理,不做处理,最后看到的图片显示 ...

  2. openGL ES进阶教程(五)制作一个简单的VR播放器,播放全景视频

    之前写过全景(VR)图片,和用openGL ES+MediaPlayer 渲染播放视频+滤镜效果 这一篇就在之前的基础上实现一个最简单的VR播放器,播放全景视频. 概述: 全景视频是一种用3D摄像机进 ...

  3. 音视频开发系列(32)OpenGL ES 基本概念

    目录 OpenGL ES的简介 OpenGL ES的基本流程和概念 篇外话:本来这篇要写SurfaceView和TextureView相关的,但是没有理解清楚,主要是对于纹理和SurfaceFling ...

  4. OpenGL ES总结(一)OpenGL 初识

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/61615215 OpenGL是在图 ...

  5. Android项目开发教程之OpenGL ES

    视频课:[免费]跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院 学习内容 OpenGL ES的基本概念 Android下3D开发的基本知识 ...

  6. 【OpenGL ES】OpenGL ES简介

    [参考-khronos]https://www.khronos.org/opengles/ 1.简介 OpenGL ES(OpenGL for Embeded System)是OpenGL(Open ...

  7. OpenGL ES 3.0 简介

    转载请以链接形式标明出处: 本文出自:103style的博客 OpenGL ES 3.0学习汇总 OpenGL ES 3.0 学习记录汇总 简介 OpenGL ES (OpenGL for Ember ...

  8. Mali GPU OpenGL ES 应用性能优化--基本概念

    1. 基本概念 1.1 Mali GPU家族 Mali GPU家族都包含以下通用的硬件: • 基于分块的延迟渲染:          Mali GPU把framebuffer分成许多块(16 x 16 ...

  9. OpenGL ES之Swift使用GLSL语言渲染图片的显示

    整体思路 一.GLSL和iOS 本片主要使用编译链接自定义的shader(顶点着色器/片元着色器).用简单的GLSL语言来实现顶点.片元着色器,并对图形进行简单的变换. OpenGL ES只是用来做渲 ...

最新文章

  1. matlab实现周期阶跃函数,连续时间信号傅利叶变换与MATLAB实现.doc
  2. MySQL密码设置和重置,以及远程登入数据库
  3. dubbo Trace 日志追踪
  4. centos7 mysql二进制_centos7+mysql5.7二进制安装
  5. 摩托罗拉能否追回逝去的那些年?
  6. cannot resolve symbol ‘springframework‘
  7. Entity Data Model (EDM) 深入分析, Part 3
  8. pcl里面使用KdTree来搜索
  9. 如何不用鼠标操作电脑
  10. 利用Linux命令行进行文本按行去重并按重复次数排序
  11. maven+springboot整合mybatis(十二)
  12. 大白话说说 朴素贝叶斯
  13. 缓存装饰器的应用习题练习
  14. Android Studio NDK报错:mips64el-linux-android-strip 找不到
  15. 锋利的jQuery-4--图片切换的一个例子(自己理解后写的,以备忘记时看看)
  16. 管网平差c语言编程,给水管网平差计算步骤
  17. This property is obsolete now. Use the TextPattern property instead.的警告解决办法
  18. 如何自制拼音卡片(用WORD或者EXCEL制作)
  19. ECCV 2022全奖项公布,两位华人学者摘得最佳论文奖,本科来自清华、浙大
  20. 最优化方法1——各类拓扑空间与强弱紧集、下半收敛问题

热门文章

  1. Vue3中slot插槽使用方式
  2. Windows命令--schtasks
  3. STM32cubeMX的初始化以及初步调试
  4. 公众号服务器配置 token验证失败
  5. 社会消防安全培训之火场疏散逃生互动演练系统
  6. 【2020年高被引学者】 杨强 香港科技大学
  7. ZBar 支持i386 armv6 armv7 armv7s x86_64 arm64
  8. 双目相机标定以及立体测距原理及OpenCV实现(下)
  9. 北京计算机 英语职称考试报名时间2015,2015北京职称计算机考试报名入口
  10. 关于Matepadpro使用 termux的坑