构建 OpenGL ES 环境

要在您的 Android 应用中使用 OpenGL ES 绘制图形,您必须创建一个 查看容器有一种比较直接的方法就是同时实现 GLSurfaceViewGLSurfaceView.Renderer。答 GLSurfaceView 是使用 OpenGL 绘制的图形的视图容器, GLSurfaceView.Renderer 用于控制该视图中绘制的内容。更多信息 请参阅 OpenGL ES 开发者指南。

GLSurfaceView 只是将 OpenGL ES 图形整合到您的 应用。对于全屏或接近全屏的图形视图,这是一个合理的选择。 希望将 OpenGL ES 图形整合到其布局的一小部分中的开发者应该 请参阅 TextureView。对于 DIY 开发者来说, 可以使用 SurfaceView 构建 OpenGL ES 视图,但这需要 需要编写大量额外代码

本课将介绍如何通过简单的GLSurfaceViewGLSurfaceView.Renderer 应用活动

在清单中声明 OpenGL ES 的使用

为了让您的应用使用 OpenGL ES 2.0 API,您必须添加以下 声明:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果您的应用使用纹理压缩,您还必须声明哪些压缩格式 以便仅安装在兼容的设备上。

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

如需详细了解纹理压缩格式,请参阅 OpenGL 开发者指南。

为 OpenGL ES 图形创建 Activity

使用 OpenGL ES 的 Android 应用的 Activity 与任何其他具有 界面与其他应用的主要区别在于您在应用的布局中添加的内容 活动。在许多应用中,您可能会使用 TextViewButtonListView;但在使用 OpenGL ES 的应用中,您可以 还要添加 GLSurfaceView

以下代码示例展示了使用 GLSurfaceView 作为其主视图:

Kotlin

class OpenGLES20Activity : Activity() {

    private lateinit var gLView: GLSurfaceView

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        gLView = MyGLSurfaceView(this)
        setContentView(gLView)
    }
}

Java

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView gLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        gLView = new MyGLSurfaceView(this);
        setContentView(gLView);
    }
}

注意:OpenGL ES 2.0 需要 Android 2.2(API 级别 8)或更高版本, 因此请确保您的 Android 项目以该 API 或更高版本为目标。

构建 GLSurfaceView 对象

GLSurfaceView 是一种专用视图,您可以在其中绘制 OpenGL ES 图形。 它本身并没有很大的作用。对象的实际绘制是在 GLSurfaceView.Renderer。事实上,这个过程的代码 对象太薄,您可能会想要跳过扩展,直接创建一个未经修改的对象 GLSurfaceView 实例,但不要这样做。您需要在 来捕获触摸事件,这在响应触摸 活动一课。

GLSurfaceView 的基本代码很少,下面我们来快速了解一下 通常的做法是 只需在使用该类的 activity 中创建一个内部类即可:

Kotlin

import android.content.Context
import android.opengl.GLSurfaceView

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    private val renderer: MyGLRenderer

    init {

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2)

        renderer = MyGLRenderer()

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer)
    }
}

Java

import android.content.Context;
import android.opengl.GLSurfaceView;

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer renderer;

    public MyGLSurfaceView(Context context){
        super(context);

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);

        renderer = new MyGLRenderer();

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer);
    }
}

GLSurfaceView 实现的另一个可选补充是设置 使用 GLSurfaceView.RENDERMODE_WHEN_DIRTY 设置:

Kotlin

// Render the view only when there is a change in the drawing data
renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

Java

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

此设置可防止系统重新绘制 GLSurfaceView 帧,直到您 调用 requestRender(), 这个示例应用非常高效。

构建渲染程序类

GLSurfaceView.Renderer 类(即渲染程序)的实现 使用 OpenGL ES 的应用开始变得有趣起来。此课程 控件 它会在与之相关联的 GLSurfaceView 上绘制什么内容。还有 Android 系统会调用其渲染程序中的三个方法, 如何在 GLSurfaceView 上绘制:

  • onSurfaceCreated() - 调用一次以设置视图的 OpenGL ES 环境。
  • onDrawFrame() - 针对每个函数调用 重新绘制视图。
  • onSurfaceChanged() - 在以下情况下调用: 视图的几何图形发生变化,例如当设备的屏幕方向发生变化时。

下面展示了 OpenGL ES 渲染程序一个非常基本的实现,即绘制一个 GLSurfaceView 中的黑色背景:

Kotlin

import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

import android.opengl.GLES20
import android.opengl.GLSurfaceView

class MyGLRenderer : GLSurfaceView.Renderer {

    override fun onSurfaceCreated(unused: GL10, config: EGLConfig) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
    }

    override fun onDrawFrame(unused: GL10) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    }

    override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }
}

Java

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

就是这么简单!上面的代码示例创建了一个简单的 Android 应用, 使用 OpenGL 显示黑屏。虽然这段代码没有执行任何非常有趣的操作, 创建这些类,您就为开始绘制图形元素奠定了基础, OpenGL。

注意:当您使用 OpengGL ES 2.0 API 时,您可能想知道为什么这些方法具有 GL10 参数。 2.0 API 直接重复使用了这些方法签名,以保留 Android 框架代码 更简单

如果您熟悉 OpenGL ES API,您现在应该能够设置 OpenGL ES 然后开始绘制图形。但是,如果您需要更多帮助 请继续学习后续课程,获取更多提示。