什么是OpenGL
OpenGL是一套可以对计算机图形硬件设备(GPU)进行访问的API。主要用于渲染2D/3D矢量图形。OpenGL以两种形式存在,第一种形式是“OpenGL标准/规范”,定义了行业标准。第二种是OpenGL实现,开发者可以使用它的API。
OpenGL工具包
OpenGL只是负责渲染操作,所以还需要配合渲染之外的库使用,例如图形界面、键盘、鼠标事件等交互操作。
- glut/glfw是主要用于构建图形界面(GUI)的库。glut适用于练习,glfw支持Linux和Windows。
- GLEW/glad是实现了OpenGL API的封装,最重要的就是可以跨平台。GLAD可以看做GLEW的升级。
- GLTools是一个工具类库默认包含了GLEW库,包含了用于矩阵操作、和向量的3D数学库等。
OpenGL专业名词
OpenGL上下文(context)/状态机(state machine)
- 在启动OpenGL的程序前需要启动OpenGL的上下文,OpenGL需要初始化它的上下文,上下文实际就是状态机(state machine),它表示一组状态变量的集合,使用状态机追踪状态变量的变化,当一个变量被设置后就一直保持这个状态,直到有函数改变了当前状态。
- 如果有vue、react、flutter等经验就可以很好理解,启动程序后,如果state中的变量发生变化,那么就会重新渲染界面,不需要我们手动去刷新页面。
- OpenGL中的变量可能在CPU或者GPU所控制的内存中,会按需要在两个内存之间复制信息。
- 如果需要绘制多个模型,可以创建多个Opengl上下文,它们相互独立,可以共享数据。减少因频繁切换上下文带来的消耗。
渲染
渲染是一个将集合图形、颜色、灯光、和其它数据转换成2D空间的操作,简单说就是3D图形到2D图形的过程。
顶点数组
- 顶点:空间中的一个点,坐标表示为(x,y,z,w),分别表示长、宽、深度、缩放比例。主要在内存中。顶点主要是绘制图形的骨架。
- 顶点缓冲区:GPU内存中分配给顶点数组的空间。
渲染管线
-
它是一系列数据处理过程,将数据转换成最终渲染的图像。就像手机工厂根据各种配件最后组装成手机的一条流水线。
管线.png
上图是渲染管线的大致流程
- 顶点着色器,用来处理顶点相关的数据。
- 细分着色器(可选):使用面片来描述一个物体的形状,使用简单的面片增加几何图元的数量,模型的外观会更为平顺
- 几何着色器(可选):改变管线中的图元类型和数量。
- 图元装配:将顶点着色器处理后的顶点转换成图元,一般有点、直线、三角形
- 剪切:在渲染区域(视口)之外的顶点不会被渲染,所以这部分会被剪裁。
- 光栅化:把图元映射为最终屏幕上相应的像素(未被染色的像素点),生成供片元着色器使用的片元。两个过程:决定窗口坐标中的哪些栅格区域被基本图元占用(确定在像素中的范围),二是分一个颜色值和一个深度值。
- 片元着色:使用片元着色器来计算每个像素点的最终颜色,并填充
固定管线
固定管线是系统提供好的,只需要我们调用就行。
可编程管线
可编程管线中的顶点着色器和片元着色分别代替了固定管线上的各顶点的操作和片元处理。需要使用OpenGL提供glsl语言编写程序。
着色器
着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行(顶点着色器、片元着色器等)。OpenGL中有很多着色器,允许自定义的只有顶点着色器和片元着色器。
1.顶点着色器
用来处理顶点相关的数据。1.确定位置。2.缩放/平移/旋转等
2.片元着色器
计算每个像素点的最终颜色,并填充。
纹理
纹理可以简单的理解为图片,它是用来保存图像颜色元素值的缓存。硬件设备获取图片后需要对图片进行解压生成位图,而位图是有一个个像素点组成的,每个像素都是一个个RGBA数据。图片中的像素变成了纹理中的一个纹素,纹素保存着每个RGA数据。
混合
在测试阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓冲区中颜⾊附着上的颜⾊进⾏混合,混合的算法可以通过OpenGL的函数进⾏指定。但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,⼀般可以通过像素着⾊器进⾏实现,当然性能会⽐原⽣的混合算法差⼀些。
变换矩阵
变换矩阵可以对图形进行平移、缩放、旋转
投影矩阵
用于将3D坐标转换为二维屏幕坐标
渲染上屏/交换缓冲区(SwapBuffer)
• 渲染缓冲区⼀般映射的是系统的资源⽐如窗⼝。如果将图像直接渲染到窗⼝对应的渲染缓冲区,则可以将图像显示到屏幕上。但是,值得注意的是,如果每个窗⼝只有⼀个缓冲区,那么在绘制过程中屏幕进⾏了刷新,窗⼝可能显示出不完整的图像
• 为了解决这个问题,常规的OpenGL程序⾄少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在⼀个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像
在屏幕上的显示。
• 由于显示器的刷新⼀般是逐⾏进⾏的,因此为了防⽌交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,因此交换⼀般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进⾏交换,这个信
号就被称为垂直同步信号,这个技术被称为垂直同步
• 使⽤了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进⾏下⼀帧的渲染,使得帧率⽆法完全达到硬件允许的最⾼⽔平。为了解决这个问题,引⼊了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发⽣时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利⽤硬件性能的⽬的
参考
《OpenGL编程指南》
《OpenGL超级宝典》
视觉笔记——CC老师
网友评论