状态机
绘制3D图形是一项复杂的任务,对于一个特定的图形,有许多因素可能会影响它的绘制。比如:
对象是不是与背景混合?
要不要进行正面或背面剔除?
当前限制的是什么纹理?
我们将这类变量的集合称为管线的状态。状态机是一组状态变量的集合,每个状态变量可以有各种不同的值,或者只能可以打开或关闭。
当一个状态值被设置后,它就一直保持这个状态,知道其他函数对它进行修改为止。
参见:OpenGL超级宝典5版 P32
渲染
将数学和图形数据转换成3D空间图像的操作叫做渲染。
这个术语做动词使用时,指的是计算机创建三维图像是所经历的过程。
作为名词使用时,指的仅仅是最终的图像作品
渲染流程:
是一系列数据处理的过程,并且将应用程序的数据转换到最终渲染的图形。
参考:www.jianshu.com/p/c0e71b4c1…
顶点
我们用线条绘制一个放在一个平面上的立方体。这个立方体上的每一个角就叫做顶点。
vertices,单数为vertex。
- 顶点数组
顶点数据存储起来构成的数组。顶点数组存储在内存中,顶点数据是由GPU处理。
- 顶点缓冲区
这个缓冲区不在内存中,在显卡显存中。缓冲区存储的内容也是顶点数据。
渲染管线
贴切翻译应该是渲染流水线。是指将数据从3D场景转换成2D图像,最终在屏幕上显示出来的总过程。
它分为几个阶段:
- 应用阶段
主要是CPU与内存打交道。如:碰撞检测,计算好的数据(顶点坐标、法向量、纹理坐标、纹理)就会通过数据总线传给图形硬件。
- 几何阶段
被称为”变换和光照阶段“。为了从3D场景转到2D场景,场景中的所有物体都需要转换到几个空间。每个空间都有自己的坐标系。
这些转换是通过一个空间的顶点转换到两一个空间的顶点来实现的。
- 光栅阶段
矢量图形转换成像素点的过程
着色 Shader
通过沿着表面(在顶点之间)改变颜色值。
着色器
图形硬件上执行的单独程序,用来处理顶点和执行光栅化的任务。
着色器是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有输入和输出。
参考:www.jianshu.com/p/af8d2a83c…
光栅化
OenGL超级宝典:实际绘制或填充每个顶点之间的像素形成线段就叫做光栅化(Rasterization)
理解:将顶点数据转为片元的过程或将几何图元变为二维图像的过程。
将点连接起来形成线?
纹理
一个纹理不过是一幅用来贴到三角形或多边形上的图片。
可以理解为一个位图。
位图就是一个像素数组,数组中的像素代表途中的一个点
混合
将不同的颜色混在一起
变换/投影
- 变换矩阵
顶点可以通过变换矩阵(Transformation Matrix)的数据结构对顶点进行旋转。
- 投影矩阵
用于将3D坐标转换成为二维屏幕坐标,实际的线条也将在二维屏幕坐标上进行绘制。
视口
把绘图坐标映射到窗口坐标。
裁剪区域的宽度和高度很少正好与窗口的宽度和高度(以像素为单位)相匹配。因此,坐标系统必须从逻辑笛卡尔坐标映射到物理屏幕像素坐标。这个映射就是通过视口(ViewPort)的设置来指定的。
视口就是窗口内部用于绘制裁剪区域的客户区域。视口简单地把裁剪区域映射到窗口中的一个区域。
通常,视口被定义为整个窗口,但这并非必须。
openGL投影方式
- 正投影【平面图形】无远近大小区分
- 透视投影【立体图形】,有个投影中心,观察者
片段
GPU需要遍历2D图像,并进行转换,将数据转化为大量”像素候选“即所谓的片段(Fragment,可以理解为像素原型,但绝不是指一大片像素)。
片段是包含位置、颜色、深度、纹理、坐标等属性的数据结构。
顶点/图元/片元/像素
- 顶点到图元
几何顶点被组合为图元(点,线段或多边形),然后图元被合并为片元,最后片元被转换为帧缓存中的像素数据。
-
图元经由以下几步转为片元
- 适当裁剪, 颜色和纹理数据也相应作出调整
- 相关坐标被转换为窗口坐标
- 光栅化将裁剪好的图元转换为片元
-
片元到像素
- 像素所有权检测
- 裁剪检测
- Alpha检测
- 模板检测
- 深度检测
- 融合
- 抖动
- 逻辑操作
深度测试/深度缓存
深度其实就是该像素点在3d世界中距离摄像机的距离。
深度缓存中存储着每个像素点(绘制在屏幕上的)的深度值。
深度测试:据定了是否绘制较远的像素点(或较近的像素点),通常选用较近的,而较远优先能实现透视的效果。
本文用于学习分享,转载请注明出处!
欢迎评论一起完善知识体系!