要在您的 Android 应用中使用 OpenGL ES 绘制图形,您必须创建一个
查看容器有一种比较直接的方法就是同时实现
GLSurfaceView
和 GLSurfaceView.Renderer
。答
GLSurfaceView
是使用 OpenGL 绘制的图形的视图容器,
GLSurfaceView.Renderer
用于控制该视图中绘制的内容。更多信息
请参阅 OpenGL ES
开发者指南。
GLSurfaceView
只是将 OpenGL ES 图形整合到您的
应用。对于全屏或接近全屏的图形视图,这是一个合理的选择。
希望将 OpenGL ES 图形整合到其布局的一小部分中的开发者应该
请参阅 TextureView
。对于 DIY 开发者来说,
可以使用 SurfaceView
构建 OpenGL ES 视图,但这需要
需要编写大量额外代码
本课将介绍如何通过简单的GLSurfaceView
GLSurfaceView.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 与任何其他具有
界面与其他应用的主要区别在于您在应用的布局中添加的内容
活动。在许多应用中,您可能会使用 TextView
、Button
和 ListView
;但在使用 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 然后开始绘制图形。但是,如果您需要更多帮助 请继续学习后续课程,获取更多提示。