OpenGL初识
初始OpenGL
OpenGL (Open Graphics Library) 是一个跨平台编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象成为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。
OpenGL ES (OpenGL For Embedded Systems) 是OpenGL 三维图形API 的子集。(针对移动端设计)
OpenGL 的图像都是由图元组成的。在OpenGL ES 中,有三种类型的图元:点、线、三角形。
OpenGL/OpenGL ES在任何项目中解决问题的本质就是利用GPU来高效渲染图形图像。例如:
-
图层渲染
-
游戏引擎
-
视频渲染
-
动画
-
视频/图片特效
OpenGL 专业名词
OpenGL context(上下文)
OpenGL context
本质上就是一个庞大的状态机。描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动。因此具有以下特点:
-
有记忆功能
-
可以接受输入,根据输入的内容,修改当前状态,并且可以有对应输出。
-
当进入特殊状态的时候,不在接收输入,停止工作。
在调用任何OpenGL的指令之前,需要先创建一个OpenGL context
用于保存OpenGL中的各种状态,这也是OpenGL指令执行的基础,因此许多库都提供了自动创建OpenGL context
的功能。
OpenGL的函数是面向过程的函数,本质上都是对OpenGL context
这个状态机的某个状态或者对象进行操作。
可以在应用程序中创建多个不同的上下文,在不同的线程使用不同的上下文,上下文之间共享纹理、缓冲区等资源,会比反复切换上下文更加合理高效。
Render (渲染)
将图形/图像数据显示绘制到屏幕的过程称为渲染。
VertexArray (顶点数组) 与 VertexBuffer (顶点缓冲区)
在OpenGL 中 ,顶点数据就是要画的图像的骨架。 这些顶点数据在调用绘制方法时是直接由内存传入顶点数据。这部分数据之前是存储内存当中的称为顶点数组。
性能更高的做法是,提前分配一块显存,将顶点数据预先传入到显存当中,这部分数据称为顶点缓冲区。
Bitmap (位图) | 纹理
(PNG) 120 * 120 = 14400 -> RGBA -> 14400 * 4 = 位图 (也称为纹理 )
管线
类似流水线,顶点数据->顶点着色器->细分着色器->几何着色器->图元设置->剪切->光栅化->片元着色器->效果
固定管线/固定着色器
模块化,使用固定着色器。
可编程管线
自定义,使用自定义着色器(GLSL语法使用GPU)。
Shader (着色器程序)
Shader -> GPU 使用
-
固定着色器
OpenGL提供
-
自定义着色器 (基于GLSL 语法进行编写代码段)
-
片元着色器 |像素着色器 FragmentShader
处理像素点,GPU 并行运算。
-
顶点着色器 VertexShader (用来处理顶点相关代码)
-
确定位置
-
缩放/平移/旋转
-
3D图形数据 -> 2D(投影换算)
-
-
GLSL (OpenGL Shading Language)
遵循OpenGL标准,调用GPU做计算。
Rasterization (光栅化)
把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置是把顶点数据转换为片元的过程,称为光栅化。具有将图转换为一个个栅格(像素点)组成的图像的作用,光栅化过程产生的是片元。
-
决定窗口坐标中的哪些整形栅格区域被基本图元占用;(确定图像的像素范围)
-
分配一个颜色值和一个深度值到各个区域。(颜色附着上去)
Blending (混合)
透明度颜色混合行为,需要通过混合计算。
Transformation (变化矩阵)
图像想发生平移,缩放,旋转变化就需要使用变化矩阵。
Projection (投影矩阵)
投影方式
-
透视投影
-
正投影
OpenGL 坐标变化流程
物体坐标-> 模型变换-> 世界坐标->视变换->观察者坐标|摄像机坐标->投影变换->裁剪坐标->透视除法->规范化设备坐标->视口变换->屏幕坐标