第一个OpenGL程序

声明:博主已经一年多没有更新新代码了,回归后将创建OpenGL专栏,前端时间基本搭建完了一个分享创作类软件,后续也会把整个项目放出来,希望大家一起学习成长~

一、Activity文件(MainActivity )

package com.example.opengl import android.app.ActivityManager import android.content.Context import android.content.pm.ConfigurationInfo import android.opengl.GLSurfaceView import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.Menu import renderer.FirstOpenGLProjectRenderer import tool.DialogUtils class MainActivity : AppCompatActivity() { // 添加一个GLSurfaceView实例 -- 初始化OpenGL private lateinit var glSurfaceView: GLSurfaceView // 记住GLSurfaceView是否处于有效状态 private var rendererSet:Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化glSurfaceView glSurfaceView = GLSurfaceView(this) /** 检查系统是否实际支持OpenGL ES 2.0 **/ // 一 Android ActivityManager的一个引用 -- 用它获取设备配置信息 val activityManager:ActivityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager // 二 取出reqGlEsVersion变量检查OpenGL ES 版本号 -- 版本号为0x20000或后续版本 就可以使用OpenGL ES 2.0的API val configurationInfo:ConfigurationInfo = activityManager.deviceConfigurationInfo val supportsEs2:Boolean = configurationInfo.reqGlEsVersion >= 0x20000 /** 为OpenGL ES 2.0配置渲染表面 **/ if (supportsEs2) { val dialogUtil = DialogUtils(this, this) dialogUtil.showSelfTipDialog("结果提示弹窗", "This device supports OpenGL ES 2.0.") // 请求一个OpenGL ES 2.O 兼容的上下文 -- 配置surface视图 glSurfaceView.setEGLContextClientVersion(2) // 分配我们的渲染器 -- 传进自定义Renderer类的一个新实例 glSurfaceView.setRenderer(FirstOpenGLProjectRenderer()) // 记住渲染器(renderer)已经设置过了 rendererSet = true }else{ val dialogUtil = DialogUtils(this, this) dialogUtil.showSelfTipDialog("结果提示弹窗", "This device does not support OpenGL ES 2.0.") return } /** 添加另外一个调用把GLSurfaceView加入到这个activity中,并把它显示到屏幕上 替换旧的调用 setContentView(R.layout.activity_main) **/ setContentView(glSurfaceView) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { return super.onCreateOptionsMenu(menu) } /** 处理Android Activity生命周期的事件 -- 否则如果用户切换到另外一个应用,应用就会崩溃 有了他们,这个surface视图才能正确暂停并继续后台渲染线程,同时释放和续用OpenGL上下文 * **/ override fun onPause() { super.onPause() if (rendererSet){ glSurfaceView.onPause() } } override fun onResume() { super.onResume() if (rendererSet){ glSurfaceView.onResume() } } }

二、渲染器类文件(FirstOpenGLProjectRenderer)

package renderer import android.opengl.GLES20.* import android.opengl.GLSurfaceView import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10 class FirstOpenGLProjectRenderer: GLSurfaceView.Renderer { override fun onSurfaceCreated(p0: GL10?, p1: EGLConfig?) { /** 设置清空屏幕用的颜色 * 前三个参数分别对应红色、绿色和蓝色 * 最后一个参数对应一个特殊的分量 -- 阿尔法(alpha)用来表示半透明度或透明度 * 通过把第一个分量设为1,其余设为0,我们把红色设置为最大强度,当屏幕被清空时,它就会显示红色 * **/ glClearColor(1.0f,0.0f,0.0f,0.0f) } override fun onSurfaceChanged(p0: GL10?, width: Int, height: Int) { /** 设置OpenGL视图填充整个屏幕 * 设置视口尺寸,告诉OpenGL可以用来渲染的surface的大小 * **/ glViewport(0,0,width,height) } override fun onDrawFrame(p0: GL10?) { /** 清除渲染屏幕 * 擦除屏幕上的所有颜色,并用之前glClearColor()调用定义的颜色填充整个屏幕 * **/ glClear(GL_COLOR_BUFFER_BIT) } }

三、运行结果

相关新闻

从零搭建通用图表设计编辑器:diagram-design核心设计与实践

从零搭建通用图表设计编辑器:diagram-design核心设计与实践

diagram-design 这个项目,说白了就是一套从零搭建通用图表设计编辑器的前端技术方案。这两年在后台系统里做架构可视化、流程编排、拓扑设计这类需求的人应该不少,大家通常的做法是直接用现成的图形编辑库,或者拿画板库硬写交互,结…

2026/11/12 17:55:00 阅读更多 →
51单片机智能窗帘实战:光感采集、步进电机与状态机设计

51单片机智能窗帘实战:光感采集、步进电机与状态机设计

1. 为什么是智能窗帘:项目需求与方案选型1.1 先把需求拆清楚,再谈怎么用单片机实现如果你问一个做过嵌入式项目的人,嵌入式入门最适合做什么,我大概率会推荐智能窗帘。它不像流水灯那样单调,又不至于像四轴飞行器那样吓…

2026/11/13 3:42:37 阅读更多 →
diagram-design实战:从逻辑建模到可视化表达的图表设计方法论

diagram-design实战:从逻辑建模到可视化表达的图表设计方法论

diagram-design 这个词初看像是个给设计师准备的素材项目,实际上做完整套流程之后,我最深的感受是:它本质上是一次把复杂逻辑翻译成视觉结构的建模工作。架构图、流程图、数据流转图、系统时序图,名称各不相同,但核心动…

2026/11/12 13:01:00 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻