前言:在学习的过程中笔记是不可缺少的,匆匆看过一遍不记笔记和实操的话总会忘掉一些知识点或者是记的不牢固,所以我写了本系列文章,一方面是强迫自己认认真真的看完一章课程,另一方面记笔记加深一下自己的记忆以及思考。所以本系列文章是我学习过程中的笔记,思考,实操以及作业然后分享给大家,欢迎大佬们指正。//出处知乎@SakuraWhite
一、基础理解
电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或间接的使用到驱动。让硬件进行各种工作。
API是一个图形库,用于渲染2D,3D矢量图形的跨语言,跨平台的应用程序变化曾接口(API)。针对GPU去进行工作。
应用端:即我们自己的程序端,相对于OpenGL ES,OpenGL还有DirectX都属于应用端。我们去用这些东西去写我们自己的代码,然后去渲染出来。
图元:要渲染的几何物体,或者形状,比如要渲染一个正方形图片,就是一个图元。要渲染两条直线,这两条直线也是图元。不管是什么,只要你是渲染想要渲染到屏幕上,都可以说是一个图元。
纹理:通俗点可以理解为一张图片,在OpenGL ES中,纹理就是图片的另一种叫法。
纹素:纹素是纹理的基础单元,但并不是像素,两者并不是一个维度的东西。
顶点数组:顶点指的是组成图元的各个顶点的坐标数据(在3D笛卡尔坐标中即x,y,z坐标),这些顶点就像我们在图像中一般有点线组成的三角形,然后再用三角形去组成一个面。一个三角形有三个顶点,1个正方形它应该是具备4个顶点的,有两个顶点是公用的。这些坐标数据可以一起存到一个内存数组中,这个数组就叫做顶点数组。
顶点缓冲区:在现存中专门分配一块显存来存储这个顶点数组,这个显存就成为顶点缓冲区。
顶点着色器:顶点着色器是完全可编程的,它通常用于实现顶点的空间变换,顶点着色等功能
片元着色器:片元着色器,则是完全可编程的,它用于实现逐片元的着色操作
二、DirectX,OpenGL,OpenGL ES介绍
OpenGL 1.0到OpenGL ES2.0,不管是OpenGL ES1.1还是OpenGL ES 2.0改变的都是增加了新的片元着色器,去替代原先的一些方法。
三、Khronos对于图形和计算的开放标准
四、关于OpenGL ES
在OpenGL ES 2.0中,首先是模型准备,然后我们用顶点着色器去编辑,然后把这些点面进行图元重组,然后进行光栅化,然后去进行片段着色器的编写。最后经过三种测试,最后输出Frame Buffer。
在OpenGL ES 3.1中,是新拿到这些Buffer缓存,然后传到顶点的缓冲池里,然后传给顶点着色器。然后顶点着色器去进行分布Transform的Feedback就是进行一些返回让我们去了解一些数据给下一阶段使用。拿到这些数据使用之后,我们要进行光栅化。光栅化之后就是片元着色器的计算。经过片元着色器计算之后,就是逐片源去渲染,最后输出FrameBuffer。
五、OpenGL ES的不同点
六、着色器脚本编写
1.版本声明,必须在着色器脚本中使用#version 300 es声明为指定使用OpenGL ES 3.0。而OpenGL ES 2.0要使用#version 100 es。以往2.0刚刚出来可编程图形管线,这是2.0刚有功能,1.0是不具备的,所以版本说明为#version 100 es后来为了使版本号相匹配,OpenGL ES 3.0的Shader版本直接从1.0跳到了3.0。所以说3.0的版本声明为#version 300 es。
2.输入与输出,3.0中新增了in,out,inout关键字用来取代attribute和varying关键字。同时gl_FragColor,gl_FragDate就被删除了。片元着色器可以使用out声明字段输出。
3.变量赋值,在OpenGL ES 3.0中可以直接使用layout对指定位置的变量赋值,而2.0中是不可以的。2.0中是由固定的赋值形式的。
七、OpenGL ES 3.0新功能
1.纹理:
(1)sRGB纹理和帧缓冲区——允许应用程序执行伽马矫正渲染。纹理可以保存在经过伽马矫正的sRGB空间,在着色器中读取时反矫正到线性空间,然后在输出到帧缓冲区时转换回sRGB伽马矫正空间。通过在线性空间中正确的进行照明和其他计算,可能得到更好的视觉保真度。
(2)2D纹理数组——保存一组2D纹理的纹理目标。例如这些数组可以用于执行纹理动画。在2D纹理数组出现之前,这种动画一般通过在单个2D纹理中平铺动画帧,并修改纹理坐标改变动画帧来实现。有了2D纹理数组,动画的每个帧可以在数组的一个2D切片中指定。
(3)3D纹理。一些OpenGL ES 2.0实现通过扩展支持3D纹理,而OpenGL ES 3.0将此作为强制的功能。
(4)深度纹理和阴影比较——启用存储在纹理中的深度缓冲区。深度纹理的最常见的用途时渲染阴影。这时深度缓冲区从光源的角度渲染,然后用于在渲染场景时比较,以确定片段是否在阴影中。除了深度纹理外,OpenGL ES 3.0 可以在读取时比较深度纹理,从而在深度文理商完成双线性过滤。
(5)无缝立方图。以往立方图渲染可能在立方图各面之间的边界产生伪像。在OpenGL ES 3.0中,立方图可以进行采样过滤来使用相邻面的数据并删除接缝处的伪像。
(6)浮点纹理。OpenGL ES 3.0扩展了支持的纹理格式。支持并可以过滤半浮点纹理(16位),也迟滞全浮点纹理(32位),但不能过滤。
(7)ETX2/EAC纹理压缩。OpenGL ES 3.0中强制支持ETC2/EAC。ETC2/EAC的格式为RGB888,RGB888和单通道及双通道有符号/无符号纹理数据。纹理压缩的好处包括更好的性能以及减少GPU内存占用。
(8)整数纹理。OpenGL ES 3.0引入了渲染和读取保存为未规范有符号或无符号8位,16位和32位整数纹理的能力。
(9)其他纹理格式。OpenGL ES 3.0还包含了对11-11-10RGB浮点纹理,共享指数RGB 9-9-9-5纹理,10-10-10-2整数纹理以及8位分量又符号规范化纹理的支持。
(10)非2幂次纹理(NPOT)。纹理现在可以指定为不为2的幂次尺寸。
(11)纹理细节级别(LOD)。现在可以强制使用用于确定读取那个Mipmap的LOD参数。此外,可以强制基本和最大Mipmap级别。这两个功能组合起来,可以流化Mipmap。在更大的Mipmap级别可用时,可以提高基本级别,LOD值可以平滑的增加,以提供平滑的流化处理。这一功能非常有用,例如用于通过网络连接下载纹理Mipmap。
(12)纹理调配。引入新的纹理对象状态,允许独立控制纹理数据每个通道(R,G,B,A)在着色器中的映射。
(13)不可变纹理。为应用程序提供在加载数据之前指定纹理格式和大小的机制。在这样则的时候,纹理格式不可变,OpenGL ES驱动程序可以预先执行所有一致性和内存检查。通过允许驱动程序在绘制的时候跳过一致性检查,可以改善性能。
(14)最小尺寸增大。OpenGL ES 3.0支持远大于OpenGL ES 2.0的纹理资源。
2.着色器
(1)二进制程序文件。在OpenGL ES 2.0中可以二进制格式存储着色器,但是仍需要在运行时链接到程序。在OpenGL ES 3.0中,完全链接过的二进制程序文件可以保存为离线二进制格式,运行时不需要链接步骤。这有助于减少应用程序加载的时间。
(2)强制的在线编辑器。在OpenGL ES 2.0可以选择驱动程序是否支持着色器的在线编译,意图降低驱动程序的内存需求,但是这一功能代价很大,开发人员不得不依靠供应商专用工具来生成着色器。在OpenGL ES 3.0中,所有实现都有在线着色器编译器。
(3)非方矩阵。支持方阵之外的新矩阵类型,并在API中增加了相关的统一调用,以支持这些矩阵的加载。非方矩阵可以减少执行变换所需的指令。例如执行仿射变换时,可以使用43矩阵代替最后一行为(0,0,0,1)的44矩阵,从而减少执行变换所需的指令。
(4)全整数支持。支持整数(以及无符号整数)标量和向量类型以及全整数操作。有各种内建函数可以实现从整数到浮点数,从浮点数到整数的转换以及从纹理中读取整数数值和向整数颜色缓冲区中输出整数数值的功能。
(5)质心采样。为了避免在多重采样时产生伪像,可以用质心采样生命顶点着色器和片段着色器的输出变量。
(6)平面/平滑插值程序。在OpenGL ES 2.0中所有插值程序均隐含的在图元之间采用线性插值。在OpenGL ES 3.0中插值程序可以显示生命为平面或者平滑着色。
(7)统一变量块。统一变量值可以组合为统一变量块。统一变量块可以更高效的加载,也可以在多个着色器程序间共享。
(8)布局限定符。顶点着色器输入可以用布局限定符生命,以显示绑定着色器源代码中的位置,而不需要调用API。布局限定符也可以用于片段着色器的输出,在渲染到多个渲染目标时将输出绑定到各个目标。而且,布局限定符可以用于控制统一变量块的内存布局。
(9)实例和顶点ID。顶点索引现在可以在顶点着色器中访问,如果使用实例渲染,还可以访问实例ID。
(10)片段深度。片段着色器可以显示控制当前片段的深度值,而不是以来深度值的插值。
(11)新的内建函数。引入了许多新的内建函数,以支持新的纹理功能,片段倒数,班服点数据转换和矩阵以及数学运算。
(12)宽松的限制。大大放松了对着色器的限制。着色器不在限于指令长度,完全支持变量为基础的循环和分支,并支持数组索引。
3.几何形状:
(1)变换反馈。可以在缓冲区对象中捕捉顶点着色器的输出。这对许多在GPU上执行动画而不需要CPU干预的技术很实用。例如粒子动画或者使用‘渲染到顶点缓冲区’的物理学模拟。
(2)布尔遮挡查询。应用程序可以查询一个(或者一组)绘制调用的任何像素是否通过深度测试。这个功能可以在各种技术中使用。例如镜头炫光效果的可见性确定,以及避免在边界被遮挡的对象上进行几何形状处理的优化。
(3)实例渲染。有效的渲染包含类似几何形状但是属性(例如变化矩阵,颜色或者大小)不同的对象。这一功能在渲染大量类似对象时很有用,例如人群的渲染。
(4)图元重启。在OpenGL ES 2.0中为新图元使用三角形条带时,应用程序必须在索引缓冲区中插入索引,一表示退化的三角形。在OpenGL ES 3.0中,可以还是要投书的索引值表示新图元的开始。这就消除了使用三角形条带时生成退化三角形的需求。
(5)新顶点格式。支持包括10-10-10-2有符号和无符号规范化顶点属性;8位,16位和32位整数属性;以及16位半浮点。
4.缓冲区对象
引入了许多新的缓冲区对象,以提高位图形管线各部分指定数据的效率和灵活性。
(1)统一变量缓冲区对象。为储存.绑定大的统一变量快提供高效的方法。统一变量缓冲区对象以减少将统一变量值绑定在着色器的性能代价,这是OpenGL ES 2.0引用程序中的常见瓶颈。
(2)顶点数组对象。提供绑定和在顶点数组状态之间切换的高效方法。顶点数组对象实际上时顶点数组状态的容器对象。使用它们,应用程序可以在一次API调用中切换顶点数组状态,而不是发明多个调用。
(3)采样器对象。将采样器状态(纹理循环模式和过滤)与纹理对象分离。这为在纹理中共享采样器状态提供了更高效的方法。
(4)同步对象。为应用程序提供检查一组操作是否在GPU上完成执行的机制。相关的新功能时栅栏(Fence),它为应用程序提供了通知GPU应该等待一组操作结束后才能接受更多操作进入执行队列的方法。
(5)像素缓冲对象。使应用程序能够执行对像素操作和纹理传输操作的异步数据传输。这种优化主要时为了在CPU和GPU之间提供更快的数据传输,在传输操作期间,应用程序可以继续工作。
(6)缓冲区子界映射。使应用程序能够映射缓冲区的一个子区域,供CPU访问。这可以提供比传统缓冲区映射更好的性能,在传统缓冲区映射中,必须使整个缓冲区可用于客户。
(7)缓冲区对象间拷贝。提供了高效的从一个缓冲区对象向另一个缓冲区对象传输数据的机制,不需要CPU干预。
5.帧缓冲区:
为帧缓冲区对象增加了许多离线渲染有关的新功能。
(1)多重渲染目标(MRT)。允许引用程序同时渲染到多个颜色缓冲区。利用MRT技术,片段着色器输出多个颜色,每个用一个项链的颜色缓冲区。MRT用于许多高级的而渲染算法,例如延迟着色。
(2)多重采样渲染缓冲区。使应用程序能够渲染到具备多重采样抗锯齿功能的屏幕外帧缓冲区。多重采样帧缓冲区不能直接绑定到纹理,但是可以用新引入的帧缓冲区块移动解析为单采样纹理。
(3)帧缓冲区失效提示。OpenGL ES 3.0的许多实现使用基于块状渲染(TBR)的GPU。 TBR常常在必须为了进一步渲染到帧缓冲区而毫无必要的恢复图块内容时导致很高的性能代价。帧缓冲区失效为应用程序提供了通知驱动程序不再需要帧缓冲区内容的机制。这使驱动程序能够采取优化步骤,跳过不必要的图块恢复操作。这一功能对于许多应用程序中实现峰值性能很重要,特别是那些进行大量屏外渲染的程序。
(4)新的混合方程式。OpenGL ES 3.0支持最大值/最小值函数作为混合方程式。
//参考视频技术美术百人计划BV1sA411N7z3