OpenGL ES->创建GLSurfaceView准备渲染环境

XML文件

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代码

kotlin 复制代码
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绘制的好处:GLSurfaceViewAndroid 提供的一个用于处理 OpenGL ES 渲染的类。它封装了很多与 EGLOpenGL ES 相关的复杂性。如果在Native层方法中去进行EGL的初始化,不同设备之间存在编译失败初始化不成功的状况
相关推荐
曲幽1 小时前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev2 小时前
单例模式 → object 声明
android·java·kotlin
程序员陆业聪2 小时前
读者点单·03|Compose 与传统 View 混用的 12 个真实坑
android
程序员陆业聪2 小时前
读者点单·02|Android 启动优化实战:Trace 抓取→Application 编排→冷启动全流程拆解
android
Coffeeee2 小时前
帮你快速理解AI Agent之我想招个Android实习生
android·人工智能·agent
恋猫de小郭4 小时前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter
黄林晴4 小时前
告别无效重建:Gradle 9.6.0 解决 CI 构建缓存失效痛点告别无效重建:Gradle 9.6.0 解决 CI 建筑缓存失效痛点
android·gradle
张风捷特烈4 小时前
Flutter 类库大揭秘#01 | path_provider架构与设计
android·flutter
_阿南_13 小时前
Android文件读写和分享总结
android
通玄1 天前
Jetpack Compose 入门系列(六):Navigation 3 页面导航
android