OpenGL常见术语
2020-07-02 本文已影响0人
只写Bug程序猿
1.图形API简介
-
OpenGL(Open Graphics Library)
是一个跨编程语言.跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL
的对象,对这些资源的操作抽象为一个个OpenGL
指令 -
OpenGL ES(OpenGL for Embedded Systems)
是OpenGL三维图形API的子集,针对手机 PDA 和游戏主机等嵌入式设备而设计的,祛除了许多不必要和性能低的API接口 -
Directx
是由很多API组成的,Directx
并不是一个单纯的图形API,Directx
属于Windows
上一个多媒体处理框架,并不支持其他的平台,所以不是跨平台的框架,按照性质分类,分为四大部分,显示部分,声音部分,输入部分和网络部分 -
Metal
Apple为游戏开发者退出的新的平台技术,能够为3D图像提高10倍的渲染性能,
2.状态机
2.1 OpenGL上下文Context
- 应用程序调用任何
OpenGL
指令前,首先需要创建一个OpenGL
的上下文,这个上下文就是一个庞大的状态机,保存了OpenGL
中的各种状态,这也是OpenGL
指令执行的基础 -
OpenGL
的函数不管在哪个语言中,都是类似C语言一个的面向过程的函数,本质上都是对OpenGL
上下文中的某个状态或者对象进行操作,当然你得先把这个对象设置为当前对象,因此通过对OpenGL
指令的封装,是可以将OpenGL
相关调用封装成一个面向对象的图形API -
OpenGL
上下文是一个巨大的状态机,切换上下文往往会产生巨大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理,因此,可以创建多个上下文,在不同线程中使用不同的上下文,上下文之间共享纹理,缓冲区等资源,这样的方案会比反复切换上下文,或者大量修改渲染状态更加合理高效
2.2状态机概念 特点
状态机是理论上的一种机器,状态机描述了,一个对象在其声明周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动,或者说状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应, 有一下特点
- 记忆功能,能记住当前的状态
- 可以接收输入,根据输入的内容和自己的原先状态,修改自己当前状态
- 当进入特殊状态(停机状态)的时候,不在接收输入,停止工作
类推到OpenGL
中
-
OpenGL
可以记录自己的状态,比如颜色.是否开启混合功能等 -
OpenGL
可以接收输入(当调用OpenGL
函数时,实际上就是OpenGL
在接收输入),比如低啊用了glColor3f
,则OpenGL
接收到这个输入后会修改自己当前颜色 -
OpenGL
可以进入停止状态,不在接收输入.程序退出前OpenGL
总会先停止工作.
3.渲染
将图形/图像数据转换成2D空间图像的操作叫做渲染(Rendering)
4.顶点数组(VertexArray) 和顶点缓冲区(VertexBuffer)
OpenGL
中图像是有图元组成的,OpenGL ES
中有三种类型的图元: 点, 线,三角形,
顶点是绘制图形时,他的顶点位置数据,这个数据可以直接存储在数组中,
更高效的做法就是提前分类一块显存,将顶点数据预先传入GPU的显存中去,这个提前分配的显存就叫做顶点缓冲区(VertexBuffer)
5.着色器(Shader)
常见着色器:
- 顶点着色器(
VertexShader
) - 片段着色器(
FragmentShader
)/像素着色器(PixelShader
)OpenGL
和DX
中的不不同叫法⽽而已 - ⼏何着⾊器 (
GeometryShader
) - 曲⾯细分着⾊器(
TessellationShader
)
OpenGLES 3.0
中只支持顶点着色器和片段着色器.几何着色器和曲面细分着色器不让操作,也没有权限进行自定义操作
5.1着色器渲染流程
- 顶点着色器对传入的顶点数据进行运算
- 通过图元装配,将顶点转换为图元,(此阶段判断顶点是一条直线还是三角形)
- 进行光栅化并转化成栅格化数据
-
栅格化数据传入片元着色器中进行运算,片元着色器对栅格化数据中每个像素点进行运算并决定像素的颜色
着色器渲染流程
5.2 顶点着色器
- 一般用来处理图形每个顶点变换(旋转/平移/投影等)
- 顶点着⾊色器器是逐顶点运算的程序,也就是说每个顶点数据都会执⾏行行⼀一次顶点着⾊色器器,当然这是并 ⾏行行的,并且顶点着⾊色器器运算过程中⽆无法访问其他顶点的数据
- 一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照 运算等等。顶点坐标由⾃自身坐标系转换到归⼀一化坐标系的运算,就是在这 ⾥里里发⽣生的
5.2 片元着色器FragmentShader
- 一般用来处理图形中每个像素点颜色计算和填充
- 片段着色器是逐像素运算的程序,也就是说每个像素都会执行一次片段着色器,当然也是并行的
6.光栅化Rasterization
- 是顶点数据转化为片元的过程,具有将图转化为一个个栅格组成的图像的作用,特点是每个元素对应帧缓冲去中的一像素
- 光栅化其实就是一种将集合图元变为二维图像的过程,该过程包含了两部分,一: 决定窗口坐标中的那些整型栅格区域被基本图元占用,二: 分配一个颜色值和一个深度值到各个区域,光栅化过程产生的是片元
- 把物体的数学描述以及与物体相关的颜色信息转化为屏幕中用于对应位置的像素以及用于填充的颜色,这个过程叫做光栅化,这是一个将模拟信号转化为离散信号的过程
纹理
可以理解为图片,渲染图形时,需要在顶点围成的区域填充图片,使场景更加逼真,这里使用的图片就是纹理
渲染上屏/交换缓冲区(SwapBuffer)
- 渲染缓冲区一般映射的是系统的资源比如窗口,将图像直接渲染到窗口对应的渲染缓冲区就可以将图像渲染在屏幕上
- 每个窗口只有一个缓冲区,如果在绘制过程中屏幕进行刷新,窗口可能显示不出完整的图像
- 为了解决这个问题,OpenGL程序至少会有两个缓冲区,显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区,在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示
- 显示器的刷新一般是逐行进行的,因此为了防止交换缓冲区的时候屏幕上下区域出现不同帧,因此交换一般会等待刷新完成信号,在显示器两次刷新建个中进行交换,这个信号就叫做垂直同步信号,这个技术成为处置同步
- 使用了双缓冲区和垂直同步信号之后,由于总是要等待缓冲区交换之后再进行下一帧的渲染吗,使得帧率无法达到硬件语序的最高水平,为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏缓冲区,而垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利用硬件性能的目的.