当前位置: 首页 > news >正文

《OpenGL ES应用开发实践指南:Android卷》—— 1.4 创建Renderer类

本节书摘来自华章出版社《OpenGL ES应用开发实践指南:Android卷》一 书中的第1章,第1.4节,作者:(美)Kevin Brothaler ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 创建Renderer类

现在要定义一个渲染器,以便我们开始清空屏幕。
让我们快速浏览一下渲染器接口定义的方法:

onSurfaceCreated(GL10 glUnused, EGLConfig config)

当Surface被创建的时候,GLSurfaceView会调用这个方法;这发生在应用程序第一次运行的时候,并且,当设备被唤醒或者用户从其他activity切换回来时,这个方法也可能会被调用。在实践中,这意味着,当应用程序运行时,本方法可能会被调用多次。

onSurfaceChanged(GL10 glUnused, int width, int height)

在Surface被创建以后,每次Surface尺寸变化时,这个方法都会被GLSurfaceView调用到。在横屏、竖屏来回切换的时候,Surface尺寸会发生变化。

onDrawFrame(GL10 glUnused)

当绘制一帧时,这个方法会被GLSurfaceView调用。在这个方法中,我们一定要绘制一些东西,即使只是清空屏幕;因为,在这个方法返回后,渲染缓冲区会被交换并显示在屏幕上,如果什么都没画,可能会看到糟糕的闪烁效果。
怎么会有一个未被使用的参数类型GL10呢?它是OpenGL ES 1.0的API(应用程序编程接口)遗留下来的;如果要编写使用OpenGL ES 1.0的渲染器,就要使用这个参数;但是,对于OpenGL ES 2.0,GLES20类提供了静态方法来存取。
在后台线程中渲染
GLSurfaceView会在一个单独的线程中调用渲染器的方法。默认情况下,GLSurfaceView会以显示设备的刷新频率不断地渲染,当然,它也可以配置为按请求渲染,只需要用
GlSurfaceView.RENDERMODE_WHEN_DIRTY作为参数调用GLSurfaceView.setRenderMode()即可。
既然Android的GLSurfaceView在后台线程中执行渲染,就必须要小心,只能在这个渲染线程中调用OpenGL,在Android主线程中使用UI(用户界面)相关的调用;两个线程之间的通信可以用如下方法:在主线程中的GLSurfaceView实例可以调用queueEvent()方法传递一个Runnable给后台渲染线程,渲染线程可以调用Activity的runOnUIThread()来传递事件(event)给主线程。
新建渲染器
在同一个包里创建一个各为FirstOpenGLProjectRender的新类,用来实现Renderer接口;为了创建这个新类,在包浏览器(package Explorer)里,鼠标右键单击“com.firstopenglproject.android”,接着选择“New→Class”;在弹出的“New Java Class”窗口中输入“FirstOpenGLProjectRenderer”作为名字,并单击“Finish”按钮。
我们会以下面的代码作为开始,并加入我们的第一个方法OnSurfaceCreated():
screenshot

首先,在onSurfaceCreated()中调用glClearColor(1.0f, 0.0f, 0.0f, 0.0f)设置清空屏幕用的颜色;前三个参数分别对应红色、绿色和蓝色,最后的参数对应一个特殊的分量,称为阿尔法(alpha),它经常用来表示半透明度或透明度。通过把第一个分量设为1,其余设为0,我们把红色设置为最大强度,当屏幕被清空时,它就会显示红色。2.6节会更详细地讨论这个颜色模型。
下一步就是设置视口(viewport)尺寸了,让我们加入如下代码:
screenshot

在onSurfaceChanged()方法中,调用glViewPort(0, 0, width, height)设置了视口尺寸,这就告诉了OpenGL可以用来渲染的surface的大小。
要用如下代码完成这个渲染器类:
screenshot

在onDrawFame()中调用glClear(GL_COLOR_BUFFER_BIT)清空屏幕;这会擦除屏幕上的所有颜色,并用之前glClearColor()调用定义的颜色填充整个屏幕。
现在测试一下代码,看看会发生什么。按“Ctrl+F11”键运行这个程序。你会看到一个空白的红色屏幕,如图1-4所示。

057c2eb88045d3458caa0d324b83339111612f77

尝试改变清空的颜色,然后再运行程序看看会发生什么!你应该看到屏幕上的颜色与代码的改动完全匹配。
如果你使用的是模拟器,且程序不工作,而你也检查过模拟器的配置选项“Use Host GPU”已经被勾选了,那就试试在glSurfaceView.setRenderer()调用之前加入glSurfaceView.setEGLConfigChooser(8,8,8,8,16,0)的调用。

相关文章:

  • ubuntu14.10建立热点wifi分享给手机
  • 《人机交互与戏剧表演:用戏剧理论构建良好用户体验》一第2章 戏剧基础(一):定性结构的元素...
  • objective-c系列-NSDictionaryNSMutableDictionary
  • 盘点最实用56个大数据可视化分析工具
  • 需求工程-软件需求模式读书笔记1
  • checkbox的readonly不起作用的解决方案
  • 打造基金业大数据监管体系 私募基金服务业务增至七类
  • 如何在微信订阅号里实现oauth授权登录
  • LinkedIn 推出在线学习门户网站 LinkedIn Learning
  • C语言经典编程题一
  • STT GDC公司完成塔塔公司在新加坡三个数据中心的资产收购
  • Java RandomAccessFile用法
  • 做好数据挖掘模型的9条经验总结
  • 数值特征
  • 智慧城市是方法而非目标
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • C语言笔记(第一章:C语言编程)
  • JavaScript服务器推送技术之 WebSocket
  • markdown编辑器简评
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • PHP CLI应用的调试原理
  • Redis中的lru算法实现
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 编写符合Python风格的对象
  • 基于组件的设计工作流与界面抽象
  • 思否第一天
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Spring Batch JSON 支持
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​批处理文件中的errorlevel用法
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #13 yum、编译安装与sed命令的使用
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #Spring-boot高级
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)appium-desktop定位元素原理
  • (转)jQuery 基础
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 分布式技术比较
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NetCore 如何动态路由