OpenGL--相关名词解释

825 阅读8分钟

相关目录:

  1. OpenGL--图形API简介
  2. OpenGL--相关名词解释
  3. OpenGL--环境配置
  4. OpenGL--案例1-绘制一个三角形
  5. OpenGL--案例2-绘制正方形
  6. OpenGL--图像撕裂
  7. OpenGL--3D数学相关(向量和矩阵)
  8. OpenGL--矩阵变换和矩阵堆栈

前面了解了 图形图像 以及各种 图形 API 的相关概念, 为了接下来更好的对 OpenGL 的学习, 下面来一起看一下 OpenGL 中的一些专有名词

OpenGL 上下文 (Context)

  • OpenGL Context (也就是 OpenGL 的上下文), 在应用程序调用任何 OpenGL 的指令之前, 首先会创建一个 OpenGL 的上下文。这个上下文是一个非常庞大的状态机, 它保存了 OpenGL 中的各种状态, 是 OpenGL 指令执行的基础。
  • OpenGL 的函数不管在 哪个语言环境中, 都是类似 C 语言 一样的面向过程的函数, 本质上都是对 OpenGL 上下文这个庞大的状态机中的某个状态或者对象进行操作, 当然首先得把这个对象设置为当前对象。所以, 可以通过对 OpenGL 指令进行封装, 将相关的调用封装成为一个面向对象的图形 API。
  • 由于 Context 是一个非常庞大的状态机, 那么如果切换 Context 就会产生很大的开销, 但是不同的绘制模块可能需要使用完全独立的状态机进行状态管理。因此, 可以在应用程序中分别创建多个不同的上下文, 在不同的线程中使用不同的上下文, 他们之间共享纹理、缓冲区等资源。
  • OpenGL 的绘制命令都是作用在当前的 Context 上的, 这个 Current Context 是一个 线程私有 (thread-local) 的变量 , 也就是说如果我们在线程中绘制, 那么需要为每个线程制定一个 Current Context, 并且多个线程不能同时指定一个 Context 为 CurrentContext。

OpenGL 状态机

概念:

个人理解, 状态机就相当于一个 存在于理论中的机器 , 它保持自身的各种状态, 然后用户通过 输入一条命令 让它去改变某个状态。

特点:

1. 具有记忆功能, 能够记住自己当前的状态

2. 可以接收输入, 根据输入的内容和自己当前的状态来修改自己的状态, 并且可以得到输出

3. 当它进入某个特殊状态的时候(停机), 它不再接收输入, 停止工作

渲染

  • 渲染 (Rendering) 将 图形/图像 数据转换成 2D 空间图形的操作。

顶点数组 和 顶点缓冲区

  • **顶点数据: **也称作顶点属性, 指定每个顶点的数据。指定顶点数据属性可以用一个顶点数组对每个顶点指定, 也可以将一个常量值用于一个图元的所有顶点。
  • **顶点数组 (VertexArray): **在调用绘制方法的时候, 直接由内存传入顶点数据, 也就是说这部分数据之前是存储在内存当中的, 被称为顶点数组。顶点数组指定每个顶点的属性, 保存在应用程序地址空间的缓冲区内。最常用的顶点属性存储方式包括: 结构数组数组结构
  • **顶点缓冲区 (VertexBuffer): **为了提高性能, 提前分配一块现存, 并将顶点数据预先传入到现存中。这部分显存, 就称为顶点缓冲区。

管线

管线 (即 渲染管线), 也可以称为 渲染流水线或像素流水线或像素管线。 可以想象成工厂的流水线作业, 管线下的每个任务都类似流水线般的执行, 并且任务之间有先后顺序。管线是一个抽象的概念, 之所以称为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的, 严格按照这个顺序并且不允许打乱, 类似于工厂的流水线。

固定管线

早起的 OpenGL 版本里封装了很多着色器程序块, 这些程序块内置的 shader程序中包括了光照、坐标转换、裁剪等功能来帮助开发者完成图形渲染, 开发者只需要传入相应的参数就能够快速完成图形渲染。

可编程管线

后来由于 OpenGL 的使用场景逐渐丰富, 固定管线无法完成每一个业务, 这时候指向的相关部分功能开放变成了可编程, 就诞生了可编程管线。

着色器 (Shader)

固定渲染管线架构变成可编程渲染管线之后, OpenGL 在调用绘制函数之前, 还需要指定一个由 shader 编译成的着色器程序。

常见的着色器主要有 顶点着色器(VerterShader), 片元着色器(FragmentShader)/像素着色器(PixelShader)、几何着色器(GeometryShader)、曲面细分着色器(TessellationShader)。后来到了 OpenGL ES 3.0 后, 只支持 顶点着色器 和 片元着色器 这 2 个最基础的着色器。

顶点着色器 (VertexShader)

  • 一般用于处理图形每个顶点的变换 (旋转/平移/投影等)
  • 是 OpenGL 中用于计算顶点属性的程序, 顶点着色器是 逐顶点运算 的程序, 也就是说每个顶点数据都会执行一次顶点着色器, 这是并发执行的, 并且顶点着色器运算过程中无法访问其他顶点数据
  • 一般来说需要计算的顶点属性主要包括 顶点坐标转换、逐顶点光照运算等, 顶点坐标由自身坐标系转换到归一化坐标系的运算也发生在这里

片元着色器 (FragmentShader)

  • 一般用来处理图形中每个像素点颜色的计算和填充
  • 是 OpenGL 中用于计算片段(像素) 颜色的程序, 是逐像素运算的程序, 也就是每个像素都会执行一次片元着色器, 当然也是并发执行的

GLSL (OpenGL Shading Language)

OpenGL 着色语言, 用来进行着色编程, 他是在 GPU (Graphic Process Unit 图形处理单元) 上执行的, 代替了固定的渲染管线的一部分, 使得渲染管线中不同层次具有可编程性, 如视图转换, 投影转换等。GLSL 着色器代码分为 2 个部分: Vertex Shader (顶点着色器)Fragment Shader (片元着色器)

光栅化 (Rasterization)

  • 把顶点数据转换为片元的过程, 具有将图转化为一个个栅格组成的图像的作用, 特点是每个元素对应帧缓冲区中的一个像素
  • 光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分工作, 第一部分工作决定窗口坐标中的哪些整型栅格区域被基本图元占用, 第二部分工作分配一个颜色值和一个深度值到各个区域。
  • 光栅化过程产生的是 片元
  • 把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色, 这个过程称为 光栅化。 这是一个将 模拟信号 转化为 离散信号 的过程。

纹理 (纹理贴图 Texture)

  • 表示物体表面细节的一幅或几幅二维图形, 也称: 纹理贴图(texture mapping) 。当把纹理按照特定的方式映射到物体表面上的时候能够使物体看上去更加真实。纹理映射是一种允许我们为三角形赋予图像数据的技术, 这让我们能够更细腻更真实地表现我们的场景。
  • 也可以理解为图片. 在渲染图形时为了使得场景更加逼真,需要在其编码填充图片。 而这里使用的图片, 就是常说的纹理。但是在OpenGL, 我们更加习惯叫纹理, 而不是图⽚。

混合 (Blend)

  • 混合是将 源色目标色 以某种方式混合生成特效的技术。混合常用来绘制透明或半透明物体, 在混合中起关键作用的 α值 实际上是将源色和目标色按给定比例进行混合, 以达到不同程度的透明。α值 为 0 则完全透明, α为 1 则完全不透明。
  • 混合操作只能在 RGBA 模式下进行, 颜色索引模式下无法指定 α值
  • 物体的绘制顺序会影响到 OpenGL 的混合处理

矩阵

线性代数~

3D 数学~

变换矩阵

在图形想要发生平移、缩放、旋转等变换时, 就需要使用到变换矩阵。

投影矩阵

用于将 3D 坐标转换为二维屏幕坐标, 实际线条也将在二维坐标下进行绘制。

总结

以上就是本次的所有内容, 主要是对后面学习 OpenGL 会设计到的一些名词的解释, 可能不是很全面, 希望小伙伴们多多补充。

和谐学习, 不急不躁~