0%

OpenGL相关概念

OpenGL是什么?

  • OpenGL是一个图形API规范,由Khronos组织制定并维护。
  • OpenGL规范严格规定了每个函数如何执行,以及它的输出值,没有规定实现细节。
  • OpenGL库的开发者通常是显卡的生产商,不同显卡对应的OpenGL库实现细节可能不同,但是他们的功能和结果都遵循OpenGL规范。

核心模式和立即渲染模式

  • 立即渲染模式(Immediate mode):早期OpenGL使用,也就是固定渲染管线(Fixed Pipeline),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。
  • 核心模式(Core-Profile):也称为可编程渲染管线(Programmable Pipline)。OpenGL3.2开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式下进行开发。从OpenGL3.3开始,新版本都在此基础上引入了额外的功能,核心架构并没有改动。

状态机

  • OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前的OpenGL上下文渲染。
  • 当使用OpenGL的时候,我们会遇到一些状态设置函数(例如:glClearColor(0.2f, 0.3f, 0.3f, 1.0f);),这类函数将会改变上下文。也会遇到状态使用函数(例如:glClear(GL_COLOR_BUFFER_BIT);),这类函数会根据当前OpenGL的状态执行一些操作。

图形渲染管线

在OpenGL中,任何事物都在3D空间中,而屏幕和窗口确是2D像素数组,这导致OpenGL的大部分工作都是把3D坐标转变为适应屏幕的2D像素。3D坐标转为2D像素的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

  • 顶点着色器(Vertex Shader):图形渲染管线的第一部分是顶点着色器,他作用于每一个顶点,将输入的3分量向量坐标转换成4分量的向量坐标,生成每个顶点的最终位置,存储在gl_Position中。每个顶点执行一次。
  • 图元装配(Primitive Assembly):将顶点着色器输出的所有顶点作为输入,并将所有的点装配成指定图元的形状。
  • 几何着色器(Geometry Shader):图元装配阶段的输出会传递给几何着色器。几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新的顶点构造出新的图元来生成其他形状。
  • 光栅化(Rasterization Stage):在这个阶段里把图元映射为最终屏幕上相应的像素,生成片段(Fragment),供片段着色器(Fragment Shader)使用。在片段着色器运行之前会执行裁切(Clipping),裁切会丢弃超出你的视图以外的所有像素,用来提升效率。

    OpenGL中的一个片段是OpenGL渲染一个像素所需的所有数据。

  • 片段着色器(Fragment Shader):主要目的是计算一个像素的最终颜色,这也是OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
  • 测试与混合:在所有颜色确定以后,最终的对象会被传到测试和混合(Blending)阶段。这个阶段检测片段的对应深度和模板值,通过深度来判断像素是否被遮挡,是否应该丢弃。这个阶段也会检查alpha值,并对物体颜色进行混合。

大多数场合只需配置顶点和片段着色器就行,几何着色器是可选的,通常使用默认的几何着色器就行了。我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。

词汇表

  • GLAD: 一个拓展加载库,用来为我们加载并设定所有OpenGL函数指针,从而让我们能够使用所有(现代)OpenGL函数。
  • 视口(Viewport): 我们需要渲染的窗口。
  • 图形管线(Graphics Pipeline):一个顶点在呈现为像素之前经过的全部过程。
  • 着色器(Shader): 一个运行在显卡上的小型程序。很多阶段的图形管道都可以使用自定义的着色器来代替原有的功能。
  • 标准化设备坐标(Normalized Device Coordinates,NDC): 顶点在通过裁剪坐标系中裁剪与透视除法后最终呈现的坐标系。所有位置在NDC下-1.0到1.0的顶点将不会被丢弃并且可见。
  • 顶点缓冲对象(Vertex Buffer Object): 一个调用显存并存储所有顶点数据供显卡使用的缓冲对象。
  • 顶点数组对象(Vertex Array Object): 存储缓冲区和顶点属性状态。
  • 索引缓冲对象(Element Buffer Object): 一个存储索引供索引化绘制的使用的缓冲对象。
  • Uniform: 一个特殊类型的GLSL变量。它是全局的(在一个着色器程序中每一个着色器都能够访问uniform变量),并且只需要被设定一次。
  • 纹理(Texture): 一种包裹着物体的特殊类型的图像,给物体精细的视觉效果。
  • 纹理缠绕(Texture Wrapping): 定义一种当纹理顶点超出范围(0, 1)时,指定OpenGL如何采样纹理的模式。
  • 纹理过滤(Texture Filtering): 定义一种当有多种文素选择时指定OpenGL如何采样纹理的模式。这通常在纹理被放大情况下发生。
  • 多级渐远纹理(Mipmaps): 被存储的材质的一些缩小版本,根据观察者的距离会使用材质的合适大小。
  • 纹理单元(Texture Units): 通过绑定纹理到不同纹理单元从而允许多个纹理在同一对象上渲染。
  • 向量(Vector): 一个定义了在空间中方向或位置的数学实体。
  • 矩阵(Matrix): 一个矩形阵列的数学表达式。
  • GLM: 一个为OpenGL打造的数学库。
  • 局部空间(Local Space): 一个物体的初始空间。所有的坐标都是相对于物体原点的。
  • 世界空间(World Space): 所有坐标都是相对于全局原点的。
  • 观察空间(View Space): 所有的坐标都是从摄像机的视角观察的。
  • 裁剪空间(Clip Space): 所有的坐标都是从摄像机视角观察的,但是该空间应用了投影。这个空间应该是一个顶点坐标最终的空间,作为顶点着色器的输出。OpenGL负责处理剩下的事情(裁剪/透视除法)。
  • 屏幕空间(Screen Space): 所有的坐标都由屏幕视角来观察,坐标的范围是从0到屏幕的宽/高。
  • LookAt矩阵: 一种特殊类型的观察矩阵,它创建了一个坐标系,其中所有的坐标都根据从一个位置观察目标用户的旋转或平移。
  • 欧拉角(Euler Angles): 被定义为偏航角(Yaw),俯仰角(Pitch)和滚转角(Roll)从而允许我们通过这三个值构造任何3D方向。

参考链接

你好,三角形
Shader知识普及之:顶点着色器
顶点着色器、片段着色器、uniform变量