有生之年转ta系列4pc手机图形api介绍

本文内容来自
【技术美术百人计划】图形 1.4 PC手机图形API介绍
观后记录
美术岗位代码或者算法一类的问题可能不太懂
本文仅用来记录学习,如果有不对的请指出谢谢

图形部分 第一章 4纹理基础

前言
电脑的工作原理:电脑是有各种不同的硬件组成,由 驱动软件驱使硬件进行工作。所有的软件工程师都会直接或间接的使用到驱动。
图像API定义:是一个图形库,用于渲染2D,3D矢量图形的跨语言,跨平台的应用程序编程接口(API)。针对GPU

图形API基础概念

  1. 应用端:即我们自己程序端,相对于OpenGL ES,属于应用端
  2. 图元:要渲染的几何物体,或者形状。比如要渲染一个正方形图片,就是一个图元,要渲染两条直线,这两条直线也是图元。
  3. 纹理:一张图片,在OpenGL ES中纹理就是图片的另一种叫法。(贴图)
  4. 纹素:是纹理元素的简称,他是计算机图形纹理空间中的基本单元。如同图像是由像素排列而成的,纹理是由纹素排列表示的。(像素纹素不是一个空间的概念,像素是屏幕上,纹素是纹理贴图中,纹素是纹理的基础单元)像素是现实设备上最小成像单位,最终的像素可以等于n个纹素,n可以为1
  5. 顶点数组:顶点只得是组成图元的各个顶点的坐标数据(在3D笛卡尔坐标中即xyz坐标),这些坐标数据可以一起存到一个内存数组中,这个数组就叫顶点数组。
  6. 顶点缓冲区:在显存中专门分配一块显存来存储这个顶点数组,这个现存就称为顶点缓冲区。
  7. 顶点着色器:顶点坐标变换 顶点着色等功能
  8. 片元着色器:给一个或者多个片元上色

主流图形API

Khronos定义了OpenGL 微软定义了DirectX
目前手机不管是ios还是安卓都是支持OpenGL ES。
电脑:win系统支持DirectX/OpenGL,linux/mac系统支持OpenGL。在这里插入图片描述
Khronos图形计算开放标准

DirectX

OpenGL

OpenGL1.0到OpenGL2.0没有什么大的改变
OpenGL1.0到OpenGLES1.1更改了一些方法例如GLBegin
OpenGESL1.1到OpenGLES2.0增加了新的着色片元
在这里插入图片描述

OpenGL ES

相比于OpenGL ES1.x系列的固定功能管线,OpenGL ES2.0和OpenGL ES3.0都是可编程图形管线。开发者可以自己编写图形管线中的顶点着色器和片段着色器两个阶段的代码。在这里插入图片描述
在这里插入图片描述
2.0/3.0渲染流程

不同点

1.兼容性

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

2.新特性

采用阴影贴图 体渲染 基于GPU的粒子动画 几何形状实例化 纹理压缩和伽马校正等技术的重要功能在2.0中都不具备。3.0将这些功能接入,同事继续适应嵌入系统的局限性。

3.渲染管线

3.0中移除了Alpha测试和逻辑操作(LogicOp)两部分,这两部分存在于OpenGLES2.0和OpenGLES1.x中。
移除Alpha测试是因为片段着色器可能抛弃片段,因此Alpha测试可以在片段着色器中进行。
移除逻辑操作(LogicOp)是因为它很少被使用。

4.着色器脚本编写

着色器脚本的编写发生了比较大的变化,其中几点为:
(1)版本声明
必须在着色器脚本中使用#versuin 300 es声明为指定使用OpenGLES3.0版本。例如:

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

void main() {
    gl_Position = vPosition;
}

而不添加版本声明或者使用#versuin 100 es声明版本则指定使用OpenGLES2.0。
备注:以往2.0刚刚出来可编程程序管线,所以版本声明为#versuin 100 es,后来为了使版本号相匹配,OpenGLES2.0的shader版本直接从1.0跳到了3.0.
(2)输入输出
3.0中新增了in out inout 关键字,用来取代attribute和varying关键字。同时gl_FragColor和gl_FragData也删除了,片段着色器可以使用out声明字段输出。
(3)变量赋值
3.0中可以直接使用layout对指定位置的变量赋值。例如:

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

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

GLES30.glUnifromlf(1,1f);

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

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

OpenGLES3.0新功能

OpenGLES3.0加入了许多新的功能和特性,使得我们的开发更加灵活和便捷,下面是3.0的一些新功能。这部分摘自《OpenGLES3.0编程指南》一书:主要为纹理 着色器 几何形状 缓冲区对象 帧缓冲区

1.纹理

(1)sRGB纹理和帧缓冲区———允许应用执行伽马校正渲染。纹理可以保存在经过伽马校正的sRGB空间 在着色器中读取时反校正到线性空间,然后再输出到帧缓冲区时转换回sRGB伽马校正空间。空过在线性空间中正确的进行照明和其它计算,可能得到更高的视觉保真度。
(2)2D纹理数组——保存一组2D纹理的纹理目标。例如这些数组可以用于执行纹理动画。在纹理数组出现之前,这种动画一般通过在单个2D纹理中平铺动画帧并修改纹理坐标改变动画帧来实现。有了2D纹理数组,动画的每个帧可以在数组的一个2D切片中指定。
(3)3D纹理——一些OpenGLES2.0实现通过扩展支持3D纹理,而OpenGLES3.0将此作为强制的功能。
(4)深度纹理和阴影比较——启动存储在纹理中的深度缓冲区。深度纹理的最常见用途是渲染阴影,这时深度缓冲区从光源的角度渲染,然后用于在渲染场景时比较,以确定片段是否在阴影中。除了深度纹理外,OpenGLES3.0可以在读取时比较深度纹理。从而在深度纹理上完成双线性过滤。
(5)无缝立方图——以往立方图渲染可能在立方图各面之间的边界产生伪像。在OpenGLES3.0中,立方图可以进行采样如过滤来使用相邻面的数据并删除接缝处的伪像。
(6)浮点纹理——OpenGLES3.0罗占了支持的纹理格式。支持并可以过滤半浮点纹理(16位),也支持全浮点纹理(30位)但不能过滤。
(7)ETC2/EAC纹理压缩——OpenGLES3.0中强制支持ETC2/EAC。ETC2/EAC的格式为RGB888,RGB888和单通道及双通道又符号/无符号纹理数据。纹理压缩的好处包括更好的性能以及减少GPU内存占用。
(8)整数纹理——OpenGLES3.0引入了渲染和读取保存为未规范化又符号或无符号8位,16位和32位整数纹理的能力。
(9)其他纹理格式——OpenGLES3.0还包含了对11-11-10 RGB浮点纹理 共享指数RGB9-9-9-5纹理 10-10-10-2整数纹理以及8位分量有符号规范化纹理的支持。
(10)非2幂次纹理(NPOT)——纹理现在可以指定为不为2的幂次尺寸。
(11)纹理细节级别(LOD)——现在可以强制使用用于确定读取哪个Mipmap的LOD参数。此外,可以强制基本和最大Mipmap级别。这两个功能组合起来,可以流化Mipmap。在更大的Mipmap级别可用下,可以提高基本级别,LOD值可以平滑的增加,以提供平滑的流化纹理,这一功能非常有用,例如用于网络链接下载纹理Mipmap。
(12)纹理搭配——引入新的纹理对象状态,允许独立控制纹理数据每个通道(RGBA)在着色器中的映射。
(13)不可变纹理——为应用程序提供在加载数据之前指定纹理格式和大小的机制。在这样做的时候,纹理格式不可变,OpenGLES驱动程序可以预先执行所有一致性和内存检查。通过允许驱动程序在绘制的时候跳过一致性检查,可以改善性能。
(14)最小尺寸增大——OpenGLES3.0支持远大于OpenGLES2.0的纹理资源。

2着色器

(1)二进制程序文件——在OpenGLES2.0中可以二进制格式存储着色器,但是仍需要运行时链接到程序,在OpenGLES3.0中,完全链接过的二进制程序文件可以保存为离线二进制格式,运行时不需要链接步骤。这有助于减少应用程序的加载时间。
(2)强制的在线编译器——在OpenGLES2.0可以选择驱动程序是否支持着色器的在线编译,意图是降低驱动程序的内存需求,但是给这一功能代价很大,开发人员不得不依靠供应商专用工具来生成着色器。在OpenGLES3。0中,所有实现都有在线着色器编译器。
(3)非方矩阵——支持方阵以外的新矩阵类型,并在API中增加了相关的统一调用,以支持这些矩阵的个加载。非方矩阵可以减少执行变换所需的指令。例如执行仿射变换时,可以使用43矩阵代替最后一行为(0,0,0,1)的44矩阵,从而减少执行变换所需的指令。
(4)全整数支持——支持整数(以及无符号整数)标量和向量类型以及全整数操作。有各种内建函数可以实现从整数到浮点数 从浮点数到整数的转换以及从纹理中读取整数值和向整数颜色缓冲区中输出整数值的功能。
(5)质心采样——为了避免在多重采样时产生伪像,可以用质心采样声明顶点着色器和片段着色器的输出变量。
(6)平面/平滑插值程序——在OpenGLES2.0中所有插值程序均隐含地在图元之间采用线性插值。在OpenGLES3.0中插值程序可以显式声明为平面或者平滑着色。
(7)统一变量块——统一变量中可以组合为统一变量块。统一变量块可以更高效的加载,也可以在多个着色器程序间共享。
(8)布局限定符——顶点着色器输入可以用布局限定符声明,以显式绑定着色器源代码中的位置,而不需要调用API。布局限定符也可以用于片段着色器的输出。在渲染到多个渲染目标时将输出绑定到各个目标。而且布局限定符可以用于控制统一变量块的额内存布局。
(9)实例和顶点ID——顶点索引现在可以在顶点着色器中访问,如果使用实例渲染,还可以访问实例ID。
(10)片段深度——片段着色器可以显式控制当前片段的深度值,而不是依赖深度值的插值。
(11)新的内建函数——引入了许多新的内建函数,以支持新的纹理功能 片段倒数 半浮点数据转换和矩阵及数学运算。
(12)宽松的限制——大大放松了对着色器的现之。着色器不再限于指令长度,完全支持变量为基础的循环和分支,并支持数组索引。

3几何形状

(1)变化反馈——可以在缓冲区对象中捕捉顶点着色器的输出。这对许多GPU上执行动画而不需要CPU干预的技术很实用,例如:粒子动画或者使用“渲染到顶点缓冲区”的物理学模拟。
(2)布尔遮挡查询——应用程序可以查询一个(或者一组)绘制调用的任何像素是否通过深度测试。这个功能可以在各种技术中使用,例如镜头炫光效果的可见性确定,以及避免在边界遮挡的对象上进行几何形状处理的优化
(3)实例渲染——有效地渲染包含类似几何形状但是属性(例如变化矩阵 颜色或者大小)不同的对象。这一功能在渲染大量类似对象时很有用,例如人群的渲染。
(4)图元重启——在OpenGLES2.0中卫新图元使用三角形条带时,应用程序必须在索引缓冲区中插入索引,以表示退化的三角形。在OpenGLES3.0中,可以使用特殊的索引值表示新图元的开始。这就消除了使用三角形条带时生成退化三角形的需求。
(5)新顶点格式——支持包含10-10-10-2有符号和无符号规范化顶点属性;8位 16位和32位整数属性;以及16位半浮点。

4缓冲区对象

引入许多新的缓冲区对象,以提高为图形管线各部分指定数据的效率和灵活性
(1)统一变量缓冲区对象——为存储/绑定大的统一变量块提供高效的方法。统一变量缓冲区对象可以减少将统一变量值绑定带着色器的性能代价,这是OpenGLES2.0应用程序中的常见瓶颈。
(2)顶点数组对象——提供绑定和在顶点数组状态之间切换的高效方法。顶点数组对象世界上是顶点数组状态的容器对象。使用它们应用程序可以再一次API调用中切换顶点数组状态,而不是发出多个调用。
(3)采样器对象——将采样器状态(纹理循环模式和过滤)与纹理对象分离。这为在纹理中共享采样器状态提供了更高效的方法。
(4)同步对象——为应用程序提供检查一组操作是否在GPU上完成执行的机制。相关的新功能是栅栏(Fence),它为应用程序提供了通知GPU应该等待一组操作结束才能接受更多操作进入执行队列的方法。
(5)像素缓冲对象——使应用程序能够执行对像素操作和纹理传输操作的额异步数据传输。这种优化主要是为了在CPU和GPU之间提供更快的数据传输,在传输操作期间,应用程序可以继续工作。
(6)缓冲区子界映射——使应用程序能够映射缓冲区的一个子区域,供CPU访问。这可以提供比传统缓冲区映射更好的性能,在传统缓冲区映射中,必须使整个缓冲区可用于用户。
(7)缓冲区对象间拷贝——提供了高效的从一个缓冲区对象向另一个缓冲区对象传输数据的机制,不需要CPU干预。

5帧缓冲区

增太难了许多与屏幕外渲染带帧缓冲区对象有关的新功能
(1)多重渲染目标(MRT)允许应用程序同时渲染到多个颜色缓冲区,利用MRT技术,片段着色器输出多个颜色,每个用于一个相连的颜色缓冲区。MRT用于许多高级的渲染算法,例如延迟着色。
(2)多重采样渲染缓冲区——使用应用程序能够渲染到具备多重采样抗锯齿功能的屏幕外帧缓冲区。多重采样帧缓冲区不能直接绑定到纹理但是可以用新引入的帧缓冲区块移动解析为单采样纹理。
(3)帧缓冲区失效提示——OpenGLES3.0的许多实现使用基于块状渲染(TBR)的GPU。TBR常常在为了进一步渲染到帧缓冲区而毫无必要地恢复图块内容时导致很高的性能代价。帧缓冲区失效为应用程序提供了通知驱动程序不再需要帧缓冲区内容的机制。这使驱动程序能够采取优化步骤,跳过不必要的的图块恢复操作。这一功能对于在许多应用程序中实现峰值性能很重要,特别是那些进行大量屏外渲染的程序。
(4)新的混合方式——OpenGLES3.0支持最大值/最小值函数作为混合方程式。

晓龙Adreno对应的ES版本型号

Adreno是由高通开发的SIP核GPU并用于其自家的SoC,该核心最初作为BitBoys(英语:BitBoys)从事GPU开发工作。
2006年,BitBoys被ATI收购开设Imageon产品线。2006年AMD收购ATI。2009年1月,AMD出售Imageon予高通[1]。随后,Imageon被更名为Adreno。
也就是我们常说的骁龙手机端GPU框架
320开始支持3.0
手机芯片对应支持版本
添加链接描述
添加链接描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值