OpenGL 基础
OpenGL 上下文(Context)
帧缓冲区 (FrameBuffer)
- 所有的运算结果最终都是需要通过图像进行输出的
- 帧缓冲区 就是 OpenGL 中的画板
- 帧缓冲区 并不是实际存储数据的对象
- 实际存储数据的 Attachment 所指向的对应缓冲区
Attachment
帧缓冲区中有三种 Attachment
,Color Attachment,Depth Attachment,Stencil Attachment。这三种Attachment
对应的缓冲区分别是颜色缓冲区(Color Buffer),深度缓冲区(Depth Buffer),模板缓冲区(Stencil Buffer)。
纹理(Texture)和渲染缓冲区(Render Buffer)
- 纹理和渲染缓冲区都是存储图像的对象
- 渲染缓冲区对应操作系统提供的窗口,而纹理代表离屏的图像存储区域
- 渲染缓冲区都是 2D 的图像类型
- 纹理一般有立方体纹理,1D、2D、3D 纹理等类型
- 渲染缓冲区和纹理不能同时挂载在同一个帧缓冲区上
顶点数组(Vertex Array)和顶点缓冲区(Vertex Buffer)
OpenGL 中的图像都是由图元组成的,由三种类型的图元:点、线、三角形。
- 顶点数据以数组的形式存储在内存当中称为 顶点数组
- 顶点数据存在显存当中称为 顶点缓冲区
索引数组(Element Array)和索引缓冲区(Element Buffer)
- 索引数据的目的主要是为了实现顶点的复用,通过索引数据指示 OpenGL 绘制顶点的顺序,能防止顶点的重复运算
- 索引数据以数组的形式存在内存当中成为 索引数组
- 索引数据存在显存当中称为 索引缓冲区
- OpenGL 提供了 2 中主要的绘制方法:
glDrawArray
和glDrawElements
,前者对应的时没有索引数据的情况,后者对应的时由索引数据的情况
顶点着色器(Vertex Shader)
- 顶点着色其时 OpenGL 中用于计算顶点属性的程序。每个顶点数据都会执行一次顶点着色器(并行的),并且顶点着色器运算过程中无法访问其他顶点的数据
- 顶点着色器的数据输入主要有两种:
- 统一变量(Uniform):在所有顶点运算中是一样的
- 顶点属性(Vertex Attribute):从外部输入的顶点数据中获取,一般在每个顶点运算中不同
- 典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等
- 顶点着色器的输出结果也会作为片段着色器的输入
片段着色器(Fragment Shader)
- 片段着色器是 OpenGL 中用于计算片段(像素)颜色的程序。每个像素都会执行一次片段着色器。
- 片段着色器有三种:
- 统一变量(Uniform):在同一个 OpenGL 着色器程序中顶点着色器和片段着色器是一致的
- 顶点着色器输入变量(Varying):在每个像素运算中一般是不同的,它的值由组成图元顶点的顶点着色器运算输出的值,根据像素位置进行插值的结果而决定
- 采样器(Sampler):从设定好的纹理中获取纹理的像素颜色
逐片元操作(Per-Fragment Operation)
测试(Test)
- 测试主要可以分为像素所有者测试(PixelOwnership Test)、裁剪测试(Scissor Test)、模板测试(Stencil Test)和深度测试(Depth Test)
- 模板测试:通过模板测试决定最终的像素是否丢弃,根据 OpenGL 的模板覆写状态决定是否更新像素的模板值
- 深度测试:主要通过对像素的运算出来的深度进行对比,根据 OpenGL 设定好的深度测试程序,决定是否最终渲染到画布上。
混合(Blending)
在混合阶段,像素的颜色和帧缓冲区中颜色 Attachment 上的颜色进行混合,混合的算法可以通过 OpenGL 的函数进行指定。但是 OpenGL 提供的混合算法是有限的,如果需要更加复杂的混合算法,一般可以通过像素着色器进行实现,当然性能回避原生的混合算法差一些
抖动(Dithering)
抖动是一种针对于可用颜色较少的系统,可以以牺牲分辨率为代价,通过颜色值的抖动来增加可用颜色数量的技术
渲染到纹理
有些 OpenGL 程序并不希望渲染出来的图像立即显示在屏幕上,而是需要多次渲染。可能其中一次渲染的结果是下次渲染的输入。因此,如果帧缓冲区的颜色 Attachment 设置为一张纹理,那么渲染完成之后,可以重新构造新的缓冲区,并将上次渲染出来的纹理作为输入,重新进行前面所述的流程
渲染上屏 / 交换缓冲区(Swap Buffer)
- 渲染缓冲区一般映射的系统资源比如窗口,如果每个窗口只有一个缓冲区,那么在绘制过程中屏幕进行了刷新,窗口可能显示出不完整的图像
- 常规的 OpenGL 程序至少都会由两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区
- 垂直同步:由于显示器刷新一般是逐行进行的,因此为了防止交换缓冲区的时候屏幕上下区域的图像分属两个不同的帧,因此交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进行交换,这个信号就被称为 垂直同步信号 ,这个技术称为 垂直同步
- 使用了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后在进行下一帧的渲染,使得帧率无法达到硬件允许的最高水平。为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,而垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利用硬件性能的目的
OpenGL 基础
https://silhouettesforyou.github.io/2021/11/04/2086c49205f7/