android openGL ES详解

1、渲染线程与主线程的通信

两个线程之间的通信可以用如下方法: 在主线程中的 GLSurfaceView 实例可以调用

queueEvent( )方法传递一个 Runnable 给后台渲染线程,渲染线程可以调用 Activity 的 runOnUIThread()来传递事件 (event) 给主线程。

2、顶点数组中元素排列顺序

当定义三角形的时候,总是以逆时针的顺序排列项点; 这
称为卷曲顺序 ( winding order)。因为在任何地方都使用这种一致的卷曲顺序,可以优化
性能: 使用卷曲顺序可以指出一个三角形属于任何给定物体的前面或者后面,OpenGL 可
以忽略那些无论如何都无法被看到的后面的三角形。

3、opengl中物体构成

无论何时,如果想表示一个 OpenGL 中的物体,都要考虑如何用点、直线及三角形把它组合出来。

4、使Java层数据可以被OpenGL存取
在java层完成顶点的定义后,但是,在OpenGL可以存取它们之前,我们仍然需要完成另外一步。主要的问题是这些代码运行的环境与OpenGL运行的环境使用了不同的语言,我们需要理解如下两个主要的概念。
(1)当我们在模拟器或者设备上编译和运行Java代码的时候,它并不是直接运行在硬件上的;相反,它运行在一个特殊的环境上,即Dalvik虚拟机(Dalvik virtualmachine);运行在虚拟机上的代码不能直接访问本地环境(nativeenvironment),除非通过特定的API。
(2)Davik虚拟机还使用了垃圾回收(garbage collection)机制。这意味着,当虚拟机检测到一个变量、对象或者其他内存片段不再被使用时,就会把这些内存释放掉以备重用;它也能腾挪内存以提高空间使用效率。本地环境并不是这样工作的,它不期望内存块会被移来移去或者被自动释放。Android之所以这样设计,是因为开发者在开发程序的时候不必关心特定的CPU或者机器架构,也不必关心底层的内存管理。这通常都能工作得很好,除非要与本地系统交互比如OpenGL。OpenGL作为本地系统库直接运行在硬件上;没有虚拟机,也没有垃圾回收或内存压缩。

 从 Java 调用本地代码
Dalvik方案是Android的主要特点之一,但是,如果代码运行在虚拟机内部,那它怎么与OpenGL通信呢?有两种技术,第一种技术是使用Java本地接口(JNI),这个技术已经由 Android 软件开发包提供了;当调用android.opengl.GLES20包里的方法时,软件开发包实际上就是在后台使用JNI调用本地系统库的。

把内存从 Java 堆复制到本地堆

第二种技术是改变内存分配的方式,Java 有一个特殊的类集合,它们可以分配本地内存块,并且把 Java 的数据复制到本地内存。本地内存可以被本地环境存取,而不受垃圾回收器的管控。

FloatBuffer用来在本地内存中存储数据。

FloatBuffer vertexData =ByteBuffer
.allocateDirect(tableVerticesWithTriangles.length * BYTES PER FLOAT).order(Byte0rder.native0rder()).asFloatBuffer();

让我们看一下代码的每一个部分。首先,我们使用ByteBuffer.allocateDirect()分配了一块本地内存,这块内存不会被垃圾回收器管理。这个方法需要知道要分配多少字节的内存块;因为顶点都存储在一个浮点数组里,并且每个浮点数有4个字节,所以这块内存的大小应该是tableVerticesWithTriangles.length* BYTES PER FLOAT。

5.顶点数据显示到屏幕上的过程

6.为什么使用着色器
     在着色器出现之前,OpenGL只能使用一个固定的方法集合控制很少而有限的事情比如场景里有多少光线或者加多少雾;这些固定的 API很容易使用,但是它们很难扩展。你只能实现API提供的效果,而且仅此而已;几乎不能添加如卡通着色一样的自定义效果。
      随着时间的推移,底层的硬件有了很大提高;设计OpenGL的人意识到这些API需要演进,并跟上这些变化。在OpenGLES2.0里,他们使用着色器加入了可编程API;为了保持简洁,他们把那些固定的API完全删除了,因此,用户必须使用着色器。现在用着色器控制每个顶点应该如何画到屏幕上,也控制所有点、直线和三角形上的每个片段应该如何绘制;这打开了一个新的、充满了无限可能的新世界。现在可以按每个像素实现光照和其他优美的效果,如卡通着色。只要可以用着色器语言表达出来,就可以加入任何理想的自定义效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/569027.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLite FTS3 和 FTS4 扩展(三十二)

返回:SQLite—系列文章目录 上一篇:SQLite 的命令行 Shell(三十一) 下一篇:SQLite—系列文章目录 概述 FTS3 和 FTS4 是 SQLite 虚拟表模块,允许用户执行 对一组文档进行全文搜索。最常见(和最有效…

Linux之yum和vim的使用

一、yum的使用 yum 后面跟install要安装的文件名: 若你要安装的文件已经存在,则会出现: 要删除文件: yum remore文件名即可删除 在我们安装完lrzsz之后,可以用rz指令和sz指令: rz指令可以从window窗口中…

开源模型应用落地-chatglm3-6b-集成langchain(十)

一、前言 langchain框架调用本地模型,使得用户可以直接提出问题或发送指令,而无需担心具体的步骤或流程。通过LangChain和chatglm3-6b模型的整合,可以更好地处理对话,提供更智能、更准确的响应,从而提高对话系统的性能…

LoggerFactory is not a Logback

错误信息 LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.SimpleLoggerFactory loaded from file:/D:/maven/repository/org/slf4j/slf4j-simple/1.7.26/slf…

easyx库的学习(鼠标信息)

前言 本次博客是作为介绍easyx库的使用,最好是直接代码打到底,然后看效果即可 代码 int main() {initgraph(640, 480, EX_SHOWCONSOLE|EX_DBLCLKS);setbkcolor(RGB(231, 114, 227));cleardevice();//定义消息结构体ExMessage msg { 0 };//获取消息wh…

SpringBoot+Vue开发记录(三)

说明:本篇文章的主要内容为需求分析。需求分析这一部分很重要,也稍微有点子难搞,所以本篇文章里的有些内容会有失偏颇。 一、准备步骤 我打算做一个刷题项目,但是具体这个项目该怎么做,我是一头雾水。 所以就要先进行…

OPTEE的FTRACE跟踪技术实战

【按语】:对于排除性能问题或优化代码来说,有没有更好的工具可以使用?FTRACE记录了对函数的所有调用,并包含计时信息。因此,对于排除性能问题或优化代码来说,它是一个很有价值的工具。本博客描述如何使用FTRACE为TA生成函数调用图。相关知识点介绍,请参考OPTEE Ftrace函…

k8s calico vxlan式详解

之前的文章讲了k8s ipip模式的使用以及流量路径,本篇文章主要是来讲解一下vxlan 模式下pod 流量是如何通信的。 一、ipip模式转vxlan 修改calico backend参数 将calico_backend参数由bird设置为vxlan,因为vxlan部署不使用bgp 修改calico controllers的configmap…

第100+6步 ChatGPT文献复现:ARIMAX预测新冠

基于WIN10的64位系统演示 一、写在前面 我们继续来解读ARIMAX模型文章,这一轮带来的是: 《PLoS One》杂志的2022年一篇题目为《A data-driven eXtreme gradient boosting machine learning model to predict COVID-19 transmission with meteorologic…

树莓派驱动开发----iic驱动oled屏幕篇

水一期吧,上效果 有点模糊,我直接说吧,修改设备树,iic1,地址0x3c,然后编写驱动文件,app文件,挂载驱动模块后在终端输入 /*******************************************************…

Appium一本通

Appium介绍 概念:Appium是一个移动App(手机应用)自动化工具。 用途:重复性任务、爬虫、自动化测试。 特点:开源免费、多平台支持(ios\android)、多类型支持(native\webview)、类selenium支持多语言(java\python\js\ruby) Appium原理 三个主…

基于小程序实现的查寝打卡系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:ssm 【…

k-均值聚类

K均值聚类(K-means clustering)是一种常用的无监督学习方法,用于将一组数据点划分为K个簇(cluster)。 它的目标是将相似的数据点归到同一个簇中,同时使得不同簇之间的数据点尽可能不相似。K均值聚类算法的…

学习笔记记录ensp中防火墙配置(trust,unstrus,dmz 资源下载可用)

实验目的,通过配置防火墙控制相互之间的访问,拓扑图如下 资源已上传,注意lsw1和ar2的路由表到各个网段的路由表配置,通过防火墙来控制各个区域能否访问成功。 防火墙通过cloud2链接,方便登录网页配置防火墙策略。防火…

分享基于鸿蒙OpenHarmony的Unity团结引擎应用开发赛

该赛题旨在鼓励更多开发者基于OpenHarmony4.x版本,使用团结引擎创造出精彩的游戏与应用。本次大赛分为“创新游戏”与“创新3D 化应用”两大赛道,每赛道又分“大众组”与“高校组”,让不同背景的开发者同台竞技。无论你是游戏开发者&#xff…

操作系统—系统调用(实验)

文章目录 系统调用1.实验目标2.实验过程记录(1).理解系统调用接口(2).阅读argraw、argint、argaddr和argstr(3).理解系统调用的解耦合实现方式(4).wait系统调用的非阻塞选项实现(5).yield系统调用的实现 3.存在的问题及解决方案实验小结 系统调用 1.实验目标 阅读并了解xv6内核…

基于Python+Selenium+Pytest的Dockerfile如何写

使用 Dockerfile 部署 Python 应用程序与 Selenium 测试 在本文中,我们将介绍如何使用 Dockerfile 部署一个 Python 应用程序,同时利用 Selenium 进行自动化测试。我们将使用官方的 Python 运行时作为父镜像,并在其中安装所需的依赖项和工具…

Error creating bean with name ‘ribbonLoadBalancingHttpClient‘~

场景 利用Ribbon来实现负载均衡 报错提示 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ribbonLoadBalancer defined in org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration: Unsatisfi…

Linux中的vi与vim:编辑器的王者之争与深度探索

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

opencv android 使用笔记

目录 获取app路径: 下载:OpenCV-android-sdk cmakelist配置: 头文件路径: 编译报错:clang: error: linker command failed with exit code 1 (use -v to see invocation) 读取图片例子 保存mp4 获取app路径&am…
最新文章