TA百人计划 图形 1.4 PC 手机图形 API 介绍

前言

电脑的工作原理:电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动

定义:是一个图形库,用于渲染 2D,3D 矢量图形的跨语言,跨平台的应用程序编程接口(API)。针对 GPU。

基础概念

应用端

即我们自己的程序端,相对用 OpenGL ES,我们属于应用端

什么是应用端?应用端就是我们程序自己,相对于 OpenGL、OpenGL ES、DirectX来说,我们都是应用端

图元

要渲染的几何物体,或者形状。比如要渲染一个正方形的图片,就是一个图元,要渲染两条直线,这两条直线也是图元

纹理

通俗点,可以理解为一张图片,在 OpenGL ES 中纹理就是图片的另外一种叫法

纹素

纹素(Texel,即 textureelement 或 texture pixel 的合成字)是纹理元素的简称

纹素是纹理的基础单位,但并不是像素,图像时由像素排列而成,纹理时由纹素排列表示的,两个具有本质上的区别

简单说:纹素是纹理的基础单元

区分:Pixel:像素 Texel:纹素

像素和纹素不是一个空间的概念,像素是屏幕上,纹素是纹理贴图(texture)中

A pixel on a texture = a texel (纹理元素、纹素)

顶点数组

顶点指的是组成图元的各个顶点的坐标数据(在 3D 笛卡尔坐标中即 x,y,z 坐标),这些坐标数据可以一起存到一个内存数组中,这个数据叫做顶点数组

顶点缓冲区

在显存中专门分配一块显存来存储这个顶点数组,这个显存就称为顶点缓冲区

顶点着色器、片元着色器

参考 TA百人计划 图形 1.1 渲染流水线

DirectX、OpenGL、OpenGL ES

一些概念

  • Khronos 定义了 OpenGL ,Microsoft 定义了 DirectX
  • 支持情况
    • 移动端:IOS 和 Android 都支持 OpenGL ES
    • Windows 支持 DirectX 和 OpenGL ,Mac/Linux/Unix支持 OpenGL

OpenGL 的发展历史

OpenGL的发展过程中,从1.0开始有一个分支,一个是OpenGL ES1.1 ,一个是 OpenGL 2.0,最后都是 OpenGL ES 2.0

在 2.0 中都是增加了一些片元着色器,替代了一些原先的方法

20 世纪 90 年代

OpenGL 开放

2000 年

OpenGL ES 开放

直到现在的年代,OpenGL ES 已经到了 3.2 版本

2005 年

OpenGL SC 开放

2008 年

开放基层更高效计算的 OpenCL

2014 年

开放 SPIR

2015 年

Vulkan 开放,更加高效的 GPU 使用效率

OpenGL ES

相同点

相比于 OpenGL ES 1.x 系列的古董功能管线,OpenGL ES 2.0 和 OpenGL ES 3.0 都是可编程图形管线。开发者可以自己编写图形管线中的 顶点着色器 和 片元着色器 两个阶段的代码

OpenGL ES渲染流程

2.0 版本

首先是模型准备,然后由顶点着色器去编辑,然后把这些点面进行图元重组,然后进行光栅化,然后经过片元着色器的编写,最后通过三种测试,最后输出到 Frame Buffer 中

3.1版本

新拿到这些 Buffer 缓存,然后传到顶点池,然后传给顶点着色器,然后顶点着色器进行分布 Transform 的 Feedback,进行一个返回,让我们去了解一些数据给下一阶段是使用,下一阶段拿到这些数据使用,之后要去进行光栅化,光栅化之后就是片元着色器的计算,之后进行逐片元渲染,然后输入到 Frame Buffer 中

不同点

兼容性

OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0的。也就是说使用 2.0 编写的应用程序可以在 3.0 中继续使用的

新特性

采用阴影贴图,体渲染(volume rendering),基于 GPU 的例子动画,几何形状实例化

纹理压缩和伽马校正等技术的重要功能在 2.0 都不具备。3.0 将这些功能引入,同时继续适应嵌入系统的局限性。

渲染管线

3.0 中移除了 Alpha 测试 和 逻辑操作(LogincOp)两部分,这两部分存在于 OpenGL ES 2.0 和 OpenGL ES 1.x 中

移除 Alpha 测试是因为片元着色器可能抛弃片段,因此 Alpha 测试可以在片段着色器 中进行,移除 逻辑操作(LogicOp)是因为它很少被使用

着色器脚本编写

着色器脚本的辨析发生了比较大的变化,其中几点为:

版本声明

必须在着色器脚本中使用 #version 300 es 声明为指定使用 OpenGL ES 3.0 版本

#version 300 es
layout(location = 0) in vec4 vPosition;

void main() { 
    gl_Position = vPosition;
}

而不添加版本声明或者使用 #version 100 es 声明版本则指定使用 OpenGL ES 2.0。

备注: 以往 2.0 刚刚出来可编程的图形管线,所以版本声明为 #version 100 es ,后来为了使版本号相匹配,OpenGL ES 3.0 的 shader 版本直接从 1.0 跳到了 3.0 。

输入输出

3.0 中新增了 inoutinout 关键字,用来取代 attributevarying 关键字。同时 gl_FragColorgl_FragData 也删除了,片段着色器可以使用 out 声明字段输出。

变量赋值

3.0 中可以直接使用 layout 对指定位置的变量赋值。例如:

#shader 脚本
layout(location = 1 ) uniform float a;

代码中,直接写上对应的 layout 的值就可以赋值

GLES30.glUniformlf(1,1f);

而 2.0 中必须使用如下形式赋值

GLES20.glUniformlf(GLES20.glGetAttribLocation(program,"a"),1f)

OpenGL ES 3.0 新功能

OpenGL ES 3.0 加入了许多新的功能和特性,使得我们的开发更加灵活和便捷。

纹理

sRGB 纹理和帧缓冲区

允许应用程序执行伽马校正渲染。纹理可以保存在经过伽马校正的 sRGB 空间,在着色器中读取时反校正到线性空间,然后在输出到帧缓冲区时转换回 sRGB 伽马校正空间。通过在线性空间中正确地进行照明和其它计算,可能得到更高的视 觉保真度。

2D 纹理数组

保存一组 2D 纹理的纹理目标。例如这些数组可以用于执行纹理动画。在 2D 纹理数组出现之前,这种动画一般通过在单个 2D 纹理中平铺动画帧并修改纹理坐标改变动画帧来实现。有了 2D 纹理数组,动画的每个帧可以在数组的一个 2D 切片中指定

3D纹理

一些 OpenGL ES 2.0 实现通过扩展支持 3D 纹理,而 OpenGL ES3.0 将此作为强制的功能。

深度纹理和阴影比较

启用存储在纹理中的深度缓冲区。深度纹理的最常见用途是渲染阴影,这时深度缓冲区从光源的角度渲 染,然后用于在渲染场景时比较,以确定片段是否在阴影中。除了深度纹理外,OpenGL ES 3.0可以在读取时比较深度纹理,从而在深 度纹理上完成双线性过滤。

无缝立方图

以往立方图渲染可能在立方图各面之间的边界产生伪像。在 OpenGL ES 3.0 中,立方图可以进行采样如过滤来使用 相邻面的数据并删除接缝处的伪像。

浮点纹理

OpenGL ES 3.0 扩展了支持的纹理格式。支持并可以过滤半浮点纹理(16位),也支持全浮点纹理(32位),但不能过滤。

ETC2/EAC纹理压缩

OpenGL ES 3.0 中强制支持 ETC2/EAC。ETC2/EAC 的格式为 RGB888,RGBA8888 和单通道及双通道有符号/无符号纹理数据。纹理压缩的好处包括更好的性能以及减少GPU内存占用。

整数纹理

OpenGL ES 3.0 引入了渲染和读取保存为未规范化有符号或无符号 8 位、16 位和 32 位整数纹理的能力。

其它纹理格式

OpenGL ES 3.0 还包含了对 11-11-10 RGB 浮点纹理、共享指数 RGB 9-9-9-5 纹理、10-10-10-2 整数纹理以及8 位分量有符号规范化纹理的支持。

非2幂次纹理(NPOT)

纹理现在可以指定为不为2的幂次尺寸。

纹理细节级别(LOD)

现在可以强制使用用于确定读取哪个 Mipmap 的 LOD 参数。此外,可以强制基本和最大 Mipmap 级别。这两 个功能组合起来,可以流化Mipmap。在更大的Mipmap级别可用时,可以提高基本级别,LOD值可以平滑地增加,以提供平滑的流化纹理。 这一功能非常有用,例如用于通过网络连接下载纹理Mipmap。

纹理调配

引入新的纹理对象状态,允许独立控制纹理数据每个通道(R、G、B、A)在着色器中的映射。

不可变纹理

为应用程序提供在加载数据之前指定纹理格式和大小的机制。在这样做的时候,纹理格式不可变,OpenGL ES 驱动 程序可以预先执行所有一致性和内存检查。通过允许驱动程序在绘制的时候跳过一致性检查,可以改善性能。

最小尺寸增大

OpenGL ES 3.0 支持远大于 OpenGL ES 2.0 的纹理资源。

着色器

二进制程序文件

在 OpenGL ES 2.0 中可以二进制格式存储着色器,但是仍需要在运行时链接到程序。在 OpenGL ES 3.0 中,完全链接过的二进制程序文件可以保存为离线二进制格式,运行时不需要链接步骤。这有助于减少应用程序的加载时间。

强制的在线编译器

在 OpenGL ES 2.0 可以选择驱动程序是否支持着色器的在线编译,意图是降低驱动程序的内存需求,但是这 一功能代价很大,开发人员不得不依靠供应商专用工具来生成着色器。在 OpenGL ES 3.0 中,所有实现都有在线着色器编译器。

非方矩阵

支持方阵之外的新矩阵类型,并在 API 中增加了相关的统一调用,以支持这些矩阵的加载。非方矩阵可以减少执行变 换所需的指令。例如执行仿射变换时,可以使用43矩阵代替最后一行为(0, 0, 0, 1)的44矩阵,从而减少执行变换所需的指令。

全整数支持

支持整数(以及无符号整数)标量和向量类型以及全整数操作。有各种内建函数可以实现从整数到浮点数、从浮点 数到整数的转换以及从纹理中读取整数值和向整数颜色缓冲区中输出整数值的功能。

质心采样

为了避免在多重采样时产生伪像,可以用质心采样声明顶点着色器和片段着色器的输出变量

平面/平滑插值程序

在 OpenGL ES 2.0 中所有插值程序均隐含地在图元之间采用线性插值。在 OpenGL ES 3.0 中插值程序可以显 式声明为平面或者平滑着色。

统一变量块

统一变量值可以组合为统一变量块。统一变量块可以更高效地加载,也可在多个着色器程序间共享。

布局限定符

顶点着色器输入可以用布局限定符声明,以显式绑定着色器源代码中的位置,而不需要调用 API。布局限定符也可以用于片段着色器的输出,在渲染到多个渲染目标时将输出绑定到各个目标。而且,布局限定符可以用于控制统一变量块的内存布局。

实例和顶点 ID

顶点索引现在可以在顶点着色器中访问,如果使用实例渲染,还可以访问实例 ID。

片段深度

片段着色器可以显式控制当前片段的深度值,而不是依赖深度值的插值。

新的内建函数

引入了许多新的内建函数,以支持新的纹理功能、片段导数、半浮点数据转换和矩阵及数学运算。

宽松的限制

大大放松了对着色器的限制。着色器不再限于指令长度,完全支持变量为基础的循环和分支,并支持数组索引。

几何形状

变换反馈

可以在缓冲区对象中捕捉顶点着色器的输出。这对许多在 GPU 上执行动画而不需要 CPU 干预的技术很实用,例如,粒子动画或者使用“渲染到顶点缓冲区”的物理学模拟。

布尔遮挡查询

应用程序可以查询一个(或者一组)绘制调用的任何像素是否通过深度测试。这个功能可以在各种技术中使用, 例如镜头眩光效果的可见性确定,以及避免在边界被遮挡的对象上进行几何形状处理的优化。

实例渲染

有效地渲染包含类似几何形状但是属性(例如变化矩阵、颜色或者大小)不同的对象。这一功能在渲染大量类似对象 时很有用,例如人群的渲染。

图元重启

在 OpenGL ES 2.0 中为新图元使用三角形条带时,应用程序必须在索引缓冲区中插入索引,以表示退化的三角形。在 OpenGL ES 3.0 中,可以还是要特殊的索引值表示新图元的开始。这就消除了使用三角形条带时生成退化三角形的需求。

新顶点格式

支持包括 10-10-10-2 有符号和无符号规范化顶点属性;8 位、16 位和 32 位整数属性;以及 16 位半浮点。

缓冲区对象

引入了许多新的缓冲区对象,以提高为图形管线各部分指定数据的效率和灵活性。

统一变量缓冲区对象

为存储/绑定大的统一变量块提供高效的方法。统一变量缓冲区对象可以减少将统一变量值绑定带着色器 的性能代价,这是 OpenGL ES 2.0 应用程序中的常见瓶颈。

顶点数组对象

提供绑定和在顶点数组状态之间切换的高效方法。顶点数组对象实际上是顶点数组状态的容器对象。使用它们, 应用程序可以在一次 API 调用中切换顶点数组状态,而不是发出多个调用。

采样器对象

将采样器状态(纹理循环模式和过滤)与纹理对象分离。这为在纹理中共享采样器状态提供了更高效的方法。

同步对象

为应用程序提供检查一组操作是否在 GPU 上完成执行的机制。相关的新功能是栅栏(Fence),它为应用程序提供了通 知GPU应该等待一组操作结束才能接受更多操作进入执行队列的方法。

像素缓冲对象

使应用程序能够执行对像素操作和纹理传输操作的异步数据传输。这种优化主要是为了在CPU和GPU之间提供更快 的数据传输,在传输操作期间,应用程序可以继续工作。

缓冲区子界映射

使应用程序能够映射缓冲区的一个子区域,供CPU访问。这可以提供比传统缓冲区映射更好的性能,在传统缓 冲区映射中,必须使整个缓冲区可用于客户。

缓冲区对象间拷贝

提供了高效地从一个缓冲区对象向另一个缓冲区对象传输数据的机制,不需要 CPU 干预。

帧缓冲区

增添了许多与屏幕外渲染带帧缓冲区对象相关的新功能

多重渲染目标(MRT)

允许应用程序同时渲染到多个颜色缓冲区。利用MRT技术,片段着色器输出多个颜色,每个用于一个相连 的颜色缓冲区。MRT用于许多高级的渲染算法,例如延迟着色。

多重采样渲染缓冲区

使应用程序能够渲染到具备多重采样抗锯齿功能的屏幕外帧缓冲区。多重采样帧缓冲区不能直接绑定到纹 理,但是可以用新引入的帧缓冲区块移动解析为单采样纹理。

帧缓冲区失效提示

OpenGL ES 3.0 的许多实现使用基于块状渲染(TBR)的 GPU。TBR 常常在必须为了进一步渲染到帧缓冲区而毫无必要地恢复图块内容时导致很高的性能代价。帧缓冲区失效为应用程序提供了通知驱动程序不再需要帧缓冲区内容的机制。这使驱 动程序能够采取优化步骤,跳过不必要的图块恢复操作。这一功能对于在许多应用程序中实现峰值性能很重要,特别是那些进行大量屏外渲染的程序。

新的混合方程式

OpenGL ES 3.0 支持最大值/最小值函数作为混合方程式。

骁龙Adreno 对应的 OpenGL ES 版本

Adreno 是骁龙手机端的 GPU 框架。

从 Adreno 302 开始,支持 OpenGL ES 3.0。

从 Adreno 405 开始,支持 OpenGL ES 3.1。

从 Adreno 420 开始,支持 OpenGL ES 3.2。

Adreno 305、306、320、330、405、420 支持 OpenGL ES 3.0 版本

Adreno 320 开始支持 OpenGL ES 3.0 是指的稳定支持

关于 Vulkan

Vulkan 被视作是 OpenGL 的后续产品。 它是一种多平台 API,可支持开发人员准备游戏、CAD 工具、性能基准测试等高性能图形应用。 它可在不同的操作系统(比如 Windows、Linux 或 Android)上使用

是新一代的 API ,但是相对 OpenGL 来说,在复杂度和维护难度上,Vulkan 的门槛很高,虽然有更高效的计算性能,作为新兴的具有生命力的 Vulkan ,相信在以后的运用中更加广泛。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇