GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
GLSurfaceView提供了下列特性:
1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。
使用GLSurfaceView
通常会继承GLSurfaceView,并重载一些和用户输入事件有关的方法。如果你不需要重载事件方法,GLSurfaceView也可以直接使用,你可以使用set方法来为该类提供自定义的行为。例如,GLSurfaceView的渲染被委托给渲染器在独立的渲染线程里进行,这一点和普通视图不一样,setRenderer(Renderer)设置渲染器。
初始化GLSurfaceView
初始化过程其实仅需要你使用setRenderer(Renderer)设置一个渲染器(render)。当然,你也可以修改GLSurfaceView一些默认配置。
* setDebugFlags(int)
* setEGLConfigChooser(boolean)
* setEGLConfigChooser(EGLConfigChooser)
* setEGLConfigChooser(int, int, int, int, int, int)
* setGLWrapper(GLWrapper)
定制android.view.Surface
GLSurfaceView默认会创建像素格式为PixelFormat.RGB_565的surface。如果需要透明效果,调用getHolder().setFormat(PixelFormat.TRANSLUCENT)。透明(TRANSLUCENT)的surface的像素格式都是32位,每个色彩单元都是8位深度,像素格式是设备相关的,这意味着它可能是ARGB、RGBA或其它。
选择EGL配置
Android设备往往支持多种EGL配置,可以使用不同数目的通道(channel),也可以指定每个通道具有不同数目的位(bits)深度。因此,在渲染器工作之前就应该指定EGL的配置。GLSurfaceView默认EGL配置的像素格式为RGB_656,16位的深度缓存(depth buffer),默认不开启遮罩缓存(stencil buffer)。
如果你要选择不同的EGL配置,请使用setEGLConfigChooser方法中的一种。
调试行为
你可以调用调试方法setDebugFlags(int)或setGLWrapper(GLSurfaceView.GLWrapper)来自定义GLSurfaceView一些行为。在setRenderer方法之前或之后都可以调用调试方法,不过最好是在之前调用,这样它们能立即生效。
设置渲染器
总之,你必须调用setRenderer(GLSurfaceView.Renderer)来注册一个GLSurfaceView.Renderer渲染器。渲染器负责真正的GL渲染工作。
渲染模式
渲染器设定之后,你可以使用setRenderMode(int)指定渲染模式是按需(on demand)还是连续(continuous)。默认是连续渲染。
Activity生命周期
Activity窗口暂停(pause)或恢复(resume)时,GLSurfaceView都会收到通知,此时它的onPause方法和onResume方法应该被调用。这样做是为了让GLSurfaceView暂停或恢复它的渲染线程,以便它及时释放或重建OpenGL的资源。
事件处理
为了处理事件,一般都是继承GLSurfaceView类并重载它的事件方法。但是由于GLSurfaceView是多线程操作,所以需要一些特殊的处理。由于渲染器在独立的渲染线程里,你应该使用Java的跨线程机制跟渲染器通讯。queueEvent(Runnable)方法就是一种相对简单的操作,例如下面的例子。
class MyGLSurfaceView extends GLSurfaceView {
private MyRenderer mMyRenderer;
public void start() {
mMyRenderer = ...;
setRenderer(mMyRenderer);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
queueEvent(new Runnable() {
// 这个方法会在渲染线程里被调用
public void run() {
mMyRenderer.handleDpadCenter();
}});
return true;
}
return super.onKeyDown(keyCode, event);
}
}
(注:如果在UI线程里调用渲染器的方法,很容易收到“call to OpenGL ES API with no current context”的警告,典型的误区就是在键盘或鼠标事件方法里直接调用opengl es的API,因为UI事件和渲染绘制在不同的线程里。更甚者,这种情况下调用glDeleteBuffers这种释放资源的方法,可能引起程序的崩溃,因为UI线程想释放它,渲染线程却要使用它。)
分享到:
相关推荐
`GLSurfaceView`充当OpenGL ES与Android View层次结构之间的桥梁,它不仅适应于Android Activity的生命周期,还简化了Framebuffer像素格式的选择,以及创建和管理绘图线程,确保动画效果平滑流畅。此外,它还提供了...
### Android NDK与OpenGL ES开发详解 #### 一、引言 随着移动设备性能的不断提升,用户对于高质量图形渲染的需求也日益增长。Android平台作为全球最大的移动操作系统之一,提供了多种方式来实现高效的图形处理能力...
1. **OpenGL ES基础**:介绍OpenGL ES的架构、与OpenGL的关系及其在Android中的应用框架,如GLSurfaceView和Renderer。 2. **基本图形绘制**:学习绘制2D和3D图形,以及透视原理。 3. **纹理和纹理映射**:如何使用...
一、项目概述 “水果忍者”是一款广受欢迎的休闲游戏,其核心玩法就是通过手指滑动屏幕切割飞过的水果。在这个毕业设计项目中,我们将聚焦于游戏中的点击屏幕效果,即玩家点击屏幕时,如何模拟水果被切割的过程,...
3. **关键概念**:课程涵盖了GLSurfaceView和Renderer,这两个是OpenGL ES在Android上的核心组件,用于创建和管理3D渲染。 4. **3D图形绘制**:课程内容包括基本图形绘制、3D图形的透视绘制、多重视口、变形、纹理...
在Android平台上,GLSurfaceView是OpenGLES与Android View层次结构之间的关键桥梁。它不仅使OpenGLES库适应于Android系统的Activity生命周期,还简化了Framebuffer像素格式的选择,并通过创建和管理独立的绘图线程,...
#### 一、OpenGL ES概述 OpenGL ES (OpenGL for Embedded Systems) 是一种专为嵌入式设备设计的2D/3D图形库,它基于OpenGL API进行设计,旨在满足移动设备和嵌入式系统的特定需求。OpenGL ES 1.0 基于OpenGL 1.3,...
- `GLSurfaceView`进一步扩展了`SurfaceView`的功能,特别适合于OpenGL ES图形渲染。 2. **Adapter的作用**: - Adapter是连接数据源和用户界面的桥梁,用于将数据模型转换成UI组件可以使用的格式。 - Android...
OpenGL ES概述 OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个子集,专为嵌入式设备设计,如智能手机和平板电脑等。它是图形渲染的重要工具之一,在Android平台上广泛用于创建高性能的3D图形界面。 ###...
20.3 在Android中使用OpenGL ES 20.3.1 使用GLSurfaceView和相关类 20.3.2 实现Renderer 20.3.3 通过Activity使用GLSurfaceView 20.3.4 更改照相机设置 20.3.5 使用索引添加另一个三角形 20.3.6 ...
3. **OpenGL ES开发基础**:熟悉GLSurfaceView和Renderer的使用,学习如何在Android应用中创建图形界面。 4. **基本图形绘制**:掌握绘制2D和3D图形的基本方法,如基本形状、多视口、纹理映射等。 5. **高级图形技术...
还可以考虑使用`GLSurfaceView`来利用OpenGL进行更高效的图像处理。 7. **处理多点触控**: 如果需要,可以添加多点触控支持,允许用户通过两个手指缩放放大镜的大小。 在实现过程中,需要注意以下几点: - **...
4. **3D渲染**:通过`GLSurfaceView`和自定义的`GLRenderer`,利用OpenGL ES进行3D渲染。`GLRenderer`中包含了顶点数组、纹理坐标和着色器的设置,以及动画帧的更新逻辑。 5. **手势识别**:Gallery3D实现了滑动、...
20.3 在Android中使用OpenGL ES 20.3.1 使用GLSurfaceView和相关类 20.3.2 实现Renderer 20.3.3 通过Activity使用GLSurfaceView 20.3.4 更改照相机设置 20.3.5 使用索引添加另一个三角形 20.3.6 ...