阅读量:0
XML
文件
<?xml version="1.0" encoding="utf-8"?> <com.yang.openglesproject.MyGLSurfaceView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" />
自定义View
代码
public interface Renderer { void onSurfaceCreated(GL10 gl, EGLConfig config); void onSurfaceChanged(GL10 gl, int width, int height); void onDrawFrame(GL10 gl); } class MyGLSurfaceView(context: Context, attrs: AttributeSet) : GLSurfaceView(context, attrs), GLSurfaceView.Renderer { init { // 设置 OpenGL ES 3.0 版本 setEGLContextClientVersion(3) // 设置当前类为渲染器, 注册回调接口的实现类 setRenderer(this) // 设置渲染模式, 仅在需要重新绘制时才进行渲染,以节省资源 renderMode = RENDERMODE_WHEN_DIRTY } override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) { // 当 Surface 创建时调用, 进行 OpenGL ES 环境的初始化操作, 设置清屏颜色为黑色 (Red=0, Green=0, Blue=0, Alpha=1) GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) // 初始化缓冲区(如果需要) // initializeBuffers() } override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) { // 当 Surface 尺寸发生变化时调用,例如设备的屏幕方向发生改变, 设置视口为新的尺寸,视口是指渲染区域的大小 GLES30.glViewport(0, 0, width, height) } override fun onDrawFrame(gl: GL10?) { // 每一帧绘制时调用, 清除颜色缓冲区和深度缓冲区 GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT or GLES30.GL_DEPTH_BUFFER_BIT) // 绘制图形(如果需要) // drawSomething() } }
总结
OpenGL ES
只负责处理数据,但不知道如何渲染到屏幕,必须把数据交给EGL
去渲染到屏幕- 应用层直接调用
OpenGL ES
绘制的好处:GLSurfaceView
是Android
提供的一个用于处理OpenGL ES
渲染的类。它封装了很多与EGL
和OpenGL ES
相关的复杂性。如果在Native
层方法中去进行EGL
的初始化,不同设备之间存在编译失败初始化不成功的状况