什么是 OpenGL
OpenGL 是由Khronos组织制定并维护的规范。通常被认为是一个 API ,包含了一系列可以操作图形、图像的函数。但是,OpenGL本身并不是一个API,OpenGL 严格规定了每个函数该如何执行,如何输出。函数内部具体的实现则是由开发者去实现,这造就了 OpenGL 跨平台的特性,任何硬件厂商都可以实现 OpenGL 的 API。
规范文档可在 https://www.khronos.org/registry/OpenGL/specs/gl/ 找到
OpenGL基本概念
OpenGL 状态机
状态机是一个手抽象的概念,表示一组状态变量的集合。每个状态变量都有不同的值。想象一下有这么一台机器,这台机器上有很多开关,控制着这台机器的运行的效果。改变这些开关的状态,就能达到不同的效果。
OpenGL 上下文
OpenGL 上下文保存了 OpenGL 的各种状态。OpenGL 上下文是一个巨大的状态机。应用程序调用任何 OpenGL 的指令之前,需要安排首先创建一个 OpenGL 的上下文。
由于 OpenGL 上下文是一个巨大的状态机,上下文的切换会产生较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中分别创建多个不同的上下文,在不同线程中使用不同的上下文,上下文之间共享纹理、缓冲区等资源。这样的方案,会比反复切换上下文,或者大量修改渲染状态,更加合理高效的。
渲染
计算机将图像数据显示到屏幕上的过程。这是一个将原始图形数据图形化的过程。
顶点数组和顶点缓冲区
顶点数组:用于存储顶点数据,是存储在内存中的数据结构。
顶点缓冲区:在显卡的显存中,也存储的顶点信息。
管线(图形渲染管线)
将一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程。是将3D坐标转为2D坐标的处理过程。
管线主要完成两部分工作:1、3D坐标转换为2D坐标;2、把2D坐标转变为实际的有颜色的像素。
固定管线/存储着色器
固定管线就像是一个封闭的流水线,设置好指定的参数,原始图形数据经过预先设计好的流程,完成渲染。
着色器
顶点着色器
可编程着色器中的一个,是 OpenGL中计算顶点属性的程序,用来确定顶点的位置、顶点位置的换算、投影换算。
片元着色器
另外一个可编程着色器,用来对每个像素点的计算和填充
GLSL(OpenGL Shader Language OpenGL着色语言)
开发人员使用GLSL编写着色器程序,在 GPU 上执行。代替了固定渲染管线中部分功能,使渲染管线中不同层次具有可编程性。
光栅化
根据顶点确定像素点的范围,计算片元供片元着色器使用
片元着色器
计算一个像素的最终颜色。
纹理(位图)
纹理指的就是图像的内容,包含了图像上每个像素点的颜色和透明度。
变换矩阵
用于图形的平移、缩放、旋转
投影矩阵
将 3D 坐标转换成二维屏幕坐标
视口
OpenGL的渲染窗口
投影
正投影,避免远小近大问题。
透视投影,显示的更加逼真,显示 3D 效果