返回

OpenGL ES升级打怪之 GLSurfaceView源码分析之渲染器

Android

序幕

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应用程序。