前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OpenGL ES 3.0 简介

OpenGL ES 3.0 简介

作者头像
103style
发布于 2022-12-19 05:17:19
发布于 2022-12-19 05:17:19
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

转载请以链接形式标明出处: 本文出自:103style的博客

OpenGL ES 3.0学习汇总

简介

  • OpenGL ES (OpenGL for Emberdded Systems)是以 手持嵌入式设备 为目标的高级3D图形应用编程接口(API)。
  • Android 4.3 +iPhone 5s + 已经支持OpenGL ES 3.0。
  • OpenGL ES 3.0 向后兼容 OpenGL ES 2.0
  • OpenGL ES 3.0 是从 OpenGL 3.3规范 衍生而来。

OpenGL ES 3.0 图形管线

OpenGL ES 3.0实现了具有 可编程着色功能 的图形管线,由 OpenGL ES 3.0 APIOpenGL ES 着色语言3.0规范 组成。 下图中深色背景的 顶点着色器片段着色器 为可编程阶段。

顶点着色器

顶点着色器 实现了顶点操作的通用可编程方法

顶点着色器的输入包括:

  • 着色器程序一一描述顶点上执行操作的顶点着色器程序源代码或者可执行文件。
  • 顶点着色器输人(或者属性)一一用顶点数组提供的每个顶点的数据。
  • 统一变量(uniform)一一顶点(或者片段)着色器使用的不变数据。
  • 采样器一一代表顶点着色器使用纹理的特殊统一变量类型。

下图是顶点着色器的输入输出模型。

顶点着色器取得一个位置及相关的颜色数据作为输入属性,用一个 4x4矩阵变换位置,并输出变换后的位置和颜色。

以下为顶点着色器示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#version 300 es   //提供着色语言的版本 必须出现在第一行
uniform mat4 u_mvpMatrix; # 统一变量 储存组合的模型视图和投影矩阵

in vec4 a_postion; # 顶点着色器输入的位置属性
in vec4 a_color;  # 顶点着色器输入的颜色属性

out vec4 v_color; # 顶点着色器输出的颜色属性
void main(){
  v_color = a_color; # 读取输入属性并写入输出属性上
  # 内建变量gl_Position 是自动声明的
  gl_Position = u_mvpMatrix * a_postion; # 变换后的位置写入gl_Positon输出
}

mat4 : 基本类型, 4 * 4浮点矩阵 vec4 : 基本类型,4分量浮点向量 uniform : 储存限定符,在图元处理中值不改变,统一变量组成了着色器、OpenGL ES 和 应用程序的链接。 in : 参数限定符,用于传入函数的函数参数 out : 参数限定符,用于传出函数,但是传入时没有初始化的参数

图元装配

OpenGL ES 3.0 图形管线,在 顶点着色器 之后就是 图元装配 了。 图元是 三角形、直线 或者 点精灵 等几何对象。 图元的每个顶点被发送到顶点着色器的不同拷贝,在图元装配期间,这些顶点被组合成图元。

对于每个图元,会抛弃图元不在 视锥体(屏幕可见的区域)内的部分,在视锥体内的区域的部分经过裁剪之后,将顶点位置转换为屏幕坐标。然后传递到管线的下一阶段 —— 光栅化阶段

光栅化

光栅化阶段 会绘制对应的 图元。 光栅化 是将 图元 转化为 二维片段 的过程,然后这些片段再由 片段着色器 处理。这些二维片段代表可在屏幕上绘制的像素。

下图为光栅化流程:

片段着色器

片段上的操作 实现了通用的可编程方法。

采用 如下输入 对每个光栅化阶段的片段执行这个着色器。

  • 着色器程序——描述片段上所执行操作的片段着色器程序源代码或者可执行文件。
  • 输入变量——光栅化单元用插值为每个片段生成的顶点着色器输出。
  • 统一变量——片段(或者顶点)着色器使用的不变数据。
  • 采样器——代表片段着色器所用纹理的特殊统一变量类型。

片段着色器可以抛弃片段,也可以生成一个或多个颜色值作为输出。 片段着色器一般只输出一个颜色值,在 渲染多重目标 的时候会为每一个渲染目标输出一个颜色值。 光栅化阶段 生成的 颜色深度模板屏幕坐标位置(Xw,Yw) 变成 OpenGL ES 3.0管线 逐片段操作 阶段的输入。

片段着色器示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#version 300 es  //提供着色语言的版本 
precision mediump float;  # 默认的精度限定符

in vec4 v_color; # 片段着色器的输入,即顶点着色器的输出
 
out vec4 fragColor; # 片段着色器的输出变量, 即传递到逐片段操作的颜色
void main()
{
   fragColor = v_color; # 输出颜色设置为输入颜色  片段着色器的输入在图元之间进行线性插值 然后传递给片段着色器
}

precision precision-qualifier type; precision : 可以用来确定默认精度修饰符, type可以是intfloat采样器类型precision-qualifier可以是lowp, mediump, 或者highp。任何其他类型和修饰符都会引起错误。包括全局变量声明,函数返回值声明,函数参数声明,和本地变量声明等。没有声明精度修饰符的变量将使用和它最近的precision语句中的精度。 highp: 精度和精度限定符,满足顶点语言的最低需求。 lowp: 精度和精度限定符,范围和精度低于mediump,但是任然能够表现所有颜色通道的所有颜色值。 mediump : 精度和精度限定符,范围和精度介于 highplowp之间。 FP = 浮点

FP范围

FP幅值范围

FP精度

整数范围 有符号

整数范围 无符号

highp

(2-126,2127)

0.0, (2-126,2127)

2-24

(2-31,231-1)

(0,232-1)

mediump

(2-14,214)

(2-14,214)

2-10

(2-15,215-1)

(0,216-1)

lowp

(-2,2)

(2-8,2)

2-8

(2-7,27-1)

(0,28-1)

逐片段操作

光栅化阶段生成的屏幕坐标为(Xw,Yw)的片段只能修改 帧缓冲区 中位置为(Xw,Yw)的像素。 下图描述了OpenGL ES 3.0 逐片段操作阶段。

  • 像素归属测试——确定帧缓区中的位置(Xw,Yw)的像素是不是归OpenGL ES 所有。被遮挡的像素则不属于OpenGL ES 的上下文,从而不显示这些像素。此过程在OpenGL ES 内部处理,不由开发人员控制
  • 剪裁测试—— 确定(Xw,Yw)是否位于OpenGL ES 状态的一部分的裁剪矩形范围内,抛弃范围之外的片段。
  • 模板测试、深度测试—— 这些测试在输入片段的 模板深度值 上进行 ,以确定片段是都该被拒绝。
  • 混合——将新生成的颜色和保存在帧缓冲区(Xw,Yw)位置的颜色值组合起来。
  • 抖动——用于最小化 因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像。

在逐片段操作阶段的最后,片段 被拒绝 或者 在帧缓冲区(Xw,Yw)位置写入片段的颜色、深度或者模板值。 写入片段的颜色、深度或者模板值 取决于 启用的相应写入掩码。写入掩码可以更精细的控制写入的值。例如,可以设置颜色缓冲区的写入掩码 使得 任何红色值都不被写入到颜色缓冲区

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel VBA解读(138): 自定义函数时使用字节数组实现更快的字符串处理
如果有很多行,要查找每行字符串第一个大写字母的位置,则使用数组公式会花费不少时间。
fanjy
2019/07/19
2.1K0
Python 数据分析(PYDA)第三版(一)
第 3 版的《Python 数据分析》现在作为“开放获取”HTML 版本在此网站wesmckinney.com/book上提供,除了通常的印刷和电子书格式。该版本最初于 2022 年 8 月出版,将在未来几个月和年份内定期修正勘误。如果您发现任何勘误,请在此处报告。
ApacheCN_飞龙
2024/05/24
1580
Python 数据分析(PYDA)第三版(一)
精心整理170道Python面试题,建议先收藏
精心整理的 Python 相关的基础知识,用于面试,或者平时复习,都是很好的!废话不多说,直接开搞
周萝卜
2022/05/22
6290
精心整理170道Python面试题,建议先收藏
Excel编程周末速成班第26课:处理运行时错误
运行时错误是在程序运行时发生的错误,除非处理该错误,否则它可以使程序在运行时停止。本课讲解什么是运行时错误以及如何在程序中处理它们。
fanjy
2021/03/26
6.9K0
Excel编程周末速成班第26课:处理运行时错误
Python3内置模块使用
(1)内置模块一览表 描述:模块是一个包含所有您定义的函数和变量的文件其后缀名为.py,模块可以被失败引入的以使用该模块中的函数等功能。
全栈工程师修炼指南
2020/10/23
1.8K0
Python3内置模块使用
nProtect APPGuard安卓反外挂分析
1.最近在学习手游保护方面的技术,本文是学习过程中分析某反外挂的一点记录,高手莫要见笑,有不对的地方还请指教,首先简单通过资源目录中文件名做基本了解,
我是小三
2018/08/08
4.5K0
nProtect APPGuard安卓反外挂分析
Android之rild进程启动源码分析「建议收藏」
在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP。AP与BP之间有两种通信方式:
全栈程序员站长
2022/10/04
1.9K0
Android之rild进程启动源码分析「建议收藏」
在HbuilderX中实现微信小程序下蓝牙连接打印机完整实战案例
商家打印小票,小票包含顾客消费的商品明细信息以及末尾附上二维码,二维码供顾客扫码开票。 
跟着飞哥学编程
2022/11/30
2.5K0
在HbuilderX中实现微信小程序下蓝牙连接打印机完整实战案例
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11
认证是任何应用中最突出的功能之一,无论它是本机移动软件还是网站,并且自从保护数据的需求以及与机密有关的隐私需求开始以来,认证一直是一个活跃的领域。 在互联网上共享的数据。 在本章中,我们将从基于 Firebase 的简单登录到应用开始,然后逐步改进以包括基于人工智能(AI)的认证置信度指标和 Google 的 ReCaptcha。 所有这些认证方法均以深度学习为核心,并提供了一种在移动应用中实现安全性的最新方法。
ApacheCN_飞龙
2023/04/27
23.4K0
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11
Tina_Linux_安全_开发指南
介绍TinaLinux 下安全方案的功能。安全完整的方案基于normal 方案扩展,覆盖硬件安全、安全启动(Secure Boot)、安全系统(Secure OS)、安全存储(Secure Storage)、安全应用(Trust Application)、完整性保护(Dm-Verity)、强制访问控制(MAC)等方面。
韦东山
2023/02/25
5.8K0
Tina_Linux_安全_开发指南
Oracle 错误总结及问题解决 ORA「建议收藏」
英文解析:resource busy and acquire with NOWAIT specified
全栈程序员站长
2022/09/03
23.1K0
Oracle 错误总结及问题解决 ORA「建议收藏」
软件设计师复习资料「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说软件设计师复习资料「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/06/27
6.5K0
实施运维企业面试题-5「建议收藏」
NETW 参考答案 A 类 255.0.0.0 B 类 255.255.0.0 C 类 255.255.255.0 4 请描述预留给企业
全栈程序员站长
2022/08/22
3.3K0
基于Metasploit的软件渗透测试
Windows 2000 Professional 链接:https://pan.baidu.com/s/13OSz_7H1mIpMKJMq92nEqg?pwd=upsm 提取码:upsm Win
顾翔
2022/09/23
3.8K0
基于Metasploit的软件渗透测试
[PHP] 2018年终总结
========================================================================== 2018年12月29日 记录:
唯一Chat
2019/09/10
2.7K0
最全面、最详细web前端面试题及答案总结
本章是HTML考点的⾮重难点,因此我们采⽤简略回答的⽅式进⾏撰写,所以不会有太多详细的解释。我们约定,每个问题后我们标记『✨ 』的为⾼频⾯试题 doctype的作⽤是什么?✨ DOCTYPE是html5标准⽹⻚声明,且必须声明在HTML⽂档的第⼀⾏。来告知浏览器的解析器⽤什么⽂档标准解析这个 ⽂档,不同的渲染模式会影响到浏览器对于 CSS 代码甚⾄ JavaScript 脚本的解析 ⽂档解析类型有: BackCompat:怪异模式,浏览器使⽤⾃⼰的怪异模式解析渲染⻚⾯。(如果没有声明DOCTYPE,默认就是这个模式) CSS1Compat:标准模式,浏览器使⽤W3C的标准解析渲染⻚⾯。 IE8还有⼀种介乎于上述两者之间的近乎标准的模式,但是基本淘汰了。
全栈程序员站长
2022/08/01
8.2K0
c#实战教程_ps初学者入门视频
大家好,又见面了,我是你们的朋友全栈君。 C#基础教程-c#实例教程,适合初学者。 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言,还需要认真阅读有关C#语言的专著。 1.1 C#语言特点 Microsoft.NET(以下简称.NET)框架是微软提出的新一代Web软件开发模型,C#语言是.NET框架中新一代的开发工具。C#语言是一种现代、面向对象的语言,它简化了C++语言在类、命名空间、方法重载和异常处理等方面的操作,它摒弃了C++的复杂性,更易使用,更少出错。它使用组件编程,和VB一样容易使用。C#语法和C++和JAVA语法非常相似,如果读者用过C++和JAVA,学习C#语言应是比较轻松的。 用C#语言编写的源程序,必须用C#语言编译器将C#源程序编译为中间语言(MicroSoft Intermediate Language,MSIL)代码,形成扩展名为exe或dll文件。中间语言代码不是CPU可执行的机器码,在程序运行时,必须由通用语言运行环境(Common Language Runtime,CLR)中的既时编译器(JUST IN Time,JIT)将中间语言代码翻译为CPU可执行的机器码,由CPU执行。CLR为C#语言中间语言代码运行提供了一种运行时环境,C#语言的CLR和JAVA语言的虚拟机类似。这种执行方法使运行速度变慢,但带来其它一些好处,主要有:  通用语言规范(Common Language Specification,CLS):.NET系统包括如下语言:C#、C++、VB、J#,他们都遵守通用语言规范。任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言代码,由CLR负责执行。只要为其它操作系统编制相应的CLR,中间语言代码也可在其它系统中运行。  自动内存管理:CLR内建垃圾收集器,当变量实例的生命周期结束时,垃圾收集器负责收回不被使用的实例占用的内存空间。不必象C和C++语言,用语句在堆中建立的实例,必须用语句释放实例占用的内存空间。也就是说,CLR具有自动内存管理功能。  交叉语言处理:由于任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言代码,不同语言设计的组件,可以互相通用,可以从其它语言定义的类派生出本语言的新类。由于中间语言代码由CLR负责执行,因此异常处理方法是一致的,这在调试一种语言调用另一种语言的子程序时,显得特别方便。  增加安全:C#语言不支持指针,一切对内存的访问都必须通过对象的引用变量来实现,只允许访问内存中允许访问的部分,这就防止病毒程序使用非法指针访问私有成员。也避免指针的误操作产生的错误。CLR执行中间语言代码前,要对中间语言代码的安全性,完整性进行验证,防止病毒对中间语言代码的修改。  版本支持:系统中的组件或动态联接库可能要升级,由于这些组件或动态联接库都要在注册表中注册,由此可能带来一系列问题,例如,安装新程序时自动安装新组件替换旧组件,有可能使某些必须使用旧组件才可以运行的程序,使用新组件运行不了。在.NET中这些组件或动态联接库不必在注册表中注册,每个程序都可以使用自带的组件或动态联接库,只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹bin中,运行程序就自动使用在bin文件夹中的组件或动态联接库。由于不需要在注册表中注册,软件的安装也变得容易了,一般将运行程序及库文件拷贝到指定文件夹中就可以了。  完全面向对象:不象C++语言,即支持面向过程程序设计,又支持面向对象程序设计,C#语言是完全面向对象的,在C#中不再存在全局函数、全局变量,所有的函数、变量和常量都必须定义在类中,避免了命名冲突。C#语言不支持多重继承。 1.2 编写控制台应用程序 使用SDK命令行工具编写控制台程序 第一个程序总是非常简单的,程序首先让用户通过键盘输入自己的名字,然后程序在屏幕上打印一条欢迎信息。程序的代码是这样的: using System;//导入命名空间。//为C#语言新增解释方法,解释到本行结束 class Welcome//类定义,类的概念见下一节 { /*解释开始,和C语言解释用法相同 解释结束*/ static void Main()//主程序,程序入口函数,必须在一个类中定义 { Console.WriteLine(“请键入你的姓名:”);//控制台输出字符串 Console.ReadLine();//从键盘读入数据,输入回车结束 Console.WriteLine(“欢迎!”); } } 可以用任意一种文本编辑软件完成上述代码的编写,然后把文件存盘,假设文件名叫做welcome.c
全栈程序员站长
2022/09/30
15.8K0
相关推荐
Excel VBA解读(138): 自定义函数时使用字节数组实现更快的字符串处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验