OpenGL ES升级打怪之 GLSurfaceView源码分析之渲染器
2023-10-26 05:54:23
序幕
Android对OpenGL这块封装是非常好的,也是非常隐蔽的,一般使用者直接使用GLSurfaceView即可达到需求。最近项目中将很多功能下层到c++层,这样必须对OpenGL 底层逻辑有所了解。Android虽然提供OpenGL各个版本的So库,但是并没有对底层api做封装。
我们的游戏引擎是基于OGLES2.0+编写,一般情况下会使用GLSurfaceView来进行渲染,但想做一些扩展,就需要对GLSurfaceView进行改造。本篇文章主要内容是:分析源码GLSurfaceView来理解其设计,以及修改它来支持渲染多层纹理。
GLSurfaceView 总揽
GLSurfaceView是一个可以渲染OpenGL ES图形的视图。它继承于SurfaceView,并添加了几个用于管理OpenGL ES上下文的额外方法。
GLSurfaceView的主要组件如下:
- SurfaceHolder :这是一个接口,允许GLSurfaceView控制底层SurfaceView的Surface。
- EGLContext :这是一个OpenGL ES上下文,用于在Surface上渲染图形。
- EGLSurface :这是一个OpenGL ES表面,用于在Surface上显示图形。
- GLSurfaceView.Renderer :这是一个接口,定义了OpenGL ES图形的渲染方法。
渲染器
GLSurfaceView.Renderer接口定义了OpenGL ES图形的渲染方法。Renderer接口只有一个方法:onDrawFrame()。onDrawFrame()方法在每次帧渲染时被调用。
在onDrawFrame()方法中,Renderer可以执行以下操作:
- 清除屏幕
- 设置视口
- 加载着色器
- 绑定纹理
- 绘制几何体
- 交换缓冲区
修改GLSurfaceView来支持渲染多层纹理
为了支持渲染多层纹理,我们需要修改GLSurfaceView的onDrawFrame()方法。在onDrawFrame()方法中,我们需要做以下操作:
- 清除屏幕
- 设置视口
- 加载着色器
- 绑定纹理
- 绘制几何体
- 交换缓冲区
以下是修改后的onDrawFrame()方法:
@Override
public void onDrawFrame(GL10 gl) {
// 清除屏幕
glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 设置视口
glViewport(0, 0, width, height);
// 加载着色器
glUseProgram(program);
// 绑定纹理
glBindTexture(GL10.GL_TEXTURE_2D, textureId);
// 绘制几何体
glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
// 交换缓冲区
eglSwapBuffers(eglDisplay, eglSurface);
}
通过修改GLSurfaceView的onDrawFrame()方法,我们就可以支持渲染多层纹理。
总结
在本文中,我们分析了GLSurfaceView的源码,并修改它来支持渲染多层纹理。通过理解GLSurfaceView的设计,我们可以更好地使用它来开发OpenGL ES应用程序。