OpenGL 名词解释
OpenGL (Open Graphics Library) 是用于渲染2D 3D矢量图形的跨语言 跨平台的应用程序编程接口(API)
OpenGL ES (OpenGL for Embedded Systems) 是OpenGL的子集 去掉了openGL 里面许多非绝对必要的特性 针对手机 PDA 和游戏主机的嵌入式设备而设计的。
Metal WWDC2014年推出的新技术 能够为3D图像提高10倍的渲染性能
以上三个框架的本质都是利用GPU芯片来高效渲染图形和图像 图形接口是开发者唯一能够接近GPU的方式
OpenGL上下文(context)
在应用程序调用任何openGL指令之前,首先得创建openGL的上下文 类似于我们使用对象(object) 之前得初始化 这个上下文是一个非常庞大的状态机 保存了openGL中的各种状态
OpenGL 的函数 本质上都是对openGL上下文这个状态机中的某个状态或者对象进行操作 对openGL指令的封装 是可以将openGL的相关调用封装成一个面向对象的API
openGL上下文是一个巨大的状态机 切换上下文一般会产生巨大的开销 但是绘制不同的模块 可能会需要使用完全独立的状态管理 基于此 可以在程序中创建多个不同的上下文 在不同的线程中使用不同的上下文 不同的上下文之间可以共享纹理 缓冲区等资源 这种工作方式 会比反复切换上下文 或者大量修改渲染状态 会更加的高效
OpenGL状态机
描述了一个对象在他的生命周期内经历的各种状态 发送转变的原因 状态间的转变 转变的条件 转变中执行的活动 。具有以下的特点
有记忆功能 能记住当前的状态
可以接受输入 根据输入的内容 和自己原来的状态 来修改自己当前的状态 并且可以有对应的输出
当前进入特殊的状态比如说停机状态的时候 就不再接受输入 停止工作
渲染(Rendering).
将图形/图像数据转换成3D空间图像的操作叫做渲染
顶点数组(VertexArray)和顶点缓冲区VertexBuffer)
画图一般来说先画图像的骨架 ,然后再往骨架里面填充颜色 OpenGL 也一样 。 顶点 数据就是图像的骨架 OpenGL中的图像是有图元组成的 OpenGLES 有三种类型的图元 :点 线 三角形 顶点数据可以存在内存中 存在内存的这部分数据叫做顶点数组 更高效的办法是预先传入到显存中 这部分显存 就叫做顶点缓冲区
管线 OpenGL在渲染图形的时候会经历一个一个的节点 就可以理解为流水线上的每一个步骤 就像流水线上做产品一样 这个固定的顺序是从开始的第一步 第二步 一直到最后一步 顺序不能乱
固定管线 存储着色器
早期的OpenGL中 封装了很多种着色器程序块 这些固定的着色器(shader)程序来完成图形的渲染 开发者不需要关注底层实现 只需要传入相应的参数就可以了
但是随着使用常用越来越丰富 固定管线或者存储着色器已经不能满足需求 这时候就有一个步骤变成了可以自己自定义编程 就像iOS中一般不复杂的界面可以调用系统已有的控件 但是不规则的图形 就需要开发者自己绘制了
着色器程序
在固定渲染管线架构变成了可编程渲染管线 OpenGL在调用绘制函数之前 需要指定着色器程序 常见的着色器有顶点着色器 片段着色器/像素着色器 几何着色器 曲面细分着色器 到OpenGL3.0 还是只支持顶点着色器和片段着色器
OpenGL 处理着色器程序的时候 要通过编译 链接等步骤 生成了着色器程序 步骤分为
1 顶点着色器对传入的顶点数据进行运算
2 图元装配 顶点转换成图元
3 光栅化 将图元这种矢量图形 转换成栅格化的数据
4 将栅格化的数据 传入片段着色器中进行运算 片段着色器 对栅格化的数据中的每一个像素进行计算 来决定像素的颜色
顶点着色器 vertexShader
一般来处理图形的每个顶点的变化 旋转 平移和投影等等
顶点着色器会对每个顶点数据都并行执行一次 在运算过程中无法访 问别的顶点的数据
片元着色器FragmentShader
一般来处理图像中每个像素点的颜色计算和填充
对每一个像素点 一个一个的并行计算
GLSL OpenGL shading language
OpenGL 着色语言 开发者自定义的程序 代替了固定的渲染管线的一部分
GLSL的着色器代码包含顶点着色器和片段着色器两个部分
光栅化 Rasterization
将顶点数据 转换成片元的过程 具有将图转化为一个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的一像素。
1 决定窗口坐标中那些整形栅格区域被基本图元占用
2 分配一个颜色值和深度值到各个区域
纹理
纹理可以理解为图⽚ ⼤家在渲染图形时需要在其编码填充图⽚,为了使得 场景更加逼真.⽽而这里使用的图⽚,就是常说的纹理.但是在OpenGL,我们更加 习惯叫纹理,⽽不是图⽚.
混合
在测试阶段之后,如果像素依然没有被剔除,那么像素的颜色将会和帧缓冲区中颜⾊附着上的颜色进行混合
变换矩阵 Transformation
图形的平移 缩放 旋转变换 需要使用变换矩阵
投影矩阵 projection
用于将3D坐标变成二维屏幕的坐标 实际的线条也将在二维坐标中进行绘制
渲染上屏/交换缓冲区(SwapBuffer)
渲染缓冲区 一般映射的是系统的资源 比如窗口 将图像直接渲染到窗口对应的渲染缓冲区 可以将图像显示到屏幕
如果窗口只有一个缓冲区 在绘制的过程中 可能显示不出完整的图像
为了解决这个问题 常规的OpenGL程序至少有两个缓冲区 显示在屏幕上的成为屏幕缓冲区 没有显示在屏幕上的称为离屏缓冲区 一个缓冲区渲染完成后 将屏幕缓冲区和离屏缓冲区交换 来实现屏幕上的显示
OpenGL 坐标变换
物体坐标/对象坐标——>模型变换——>世界坐标——>视变换——>观察者坐标/摄像机坐标——>投影变换——>裁剪变换——>透视除法——>规范化设备坐标——>视口变换——>屏幕坐标
着色器渲染流程
顶点数据——>顶点着色器——>细分着色器——>几何着色器——>图元设置——>剪切——>光栅化——>片元着色器——>效果