计算机图像学之可编程渲染管线理解

1,141 阅读6分钟

1、图形渲染管线

指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上的整个过程。

1.1 发展历程

  • 早期的图形编程:调用硬件供货商提供的函数库(用来绘制图元及其属性的函数库不存在)
  • 图形标准的产生:硬件供货商提供标准图形数据库,使得能够在设备无关的方式下生成图像
    • GKS(Graphical Kernel System, 图形核心系统)
    • PHISS(Programmer's Hierarchical Interactive Graphics System, 程序员层次式交互图形系统)
    • OpenGL
  • 固定管线:图形API提供了一个对硬件进行操作的标准接口;从内部实现上来说,API对程序员提出的各种绘制图元或属性的请求都采用固定的方式来处理。这种内部实现方式通常称为固定功能渲染流水线
  • 固定到可编程: 钩函数hooks的出现:突破固定功能流水线的限制,使用可编程着色器修改流水线中某些特定步骤的行为。
  • 可编程流水线(OPenGL2\OpenGLES2开始支持可编程流水线)

2、可编程渲染管线的三个阶段

OJ@MW{Z6WEYTGS{U5M_$V.png

2.1、应用阶段

将需要屏幕上显示出来绘制的几何体,也就是绘制图元,如点、线、矩形等输入到绘制管线的下一个阶段。
具体包括图元的顶点数据、摄像机位置、光照纹理等参数    

2.2、几何阶段

几何阶段需要将顶点数据最终进行屏幕映射
这其中需要:
	将各个图元放到世界坐标系中,也就是进行模型变换
	根据关照纹理等计算顶点处材质的光照着色效果
	根据摄像机的位置、取景范围进行观察变换和裁剪
	最后进行屏幕映射,也就是把三维模型转换到屏幕坐标中
            

QQ图片20210515121143.png

2.3、光栅化阶段

光栅化部分的输入是经过变换和投影后的顶点、颜色以及纹理坐标, 它的工作是给每个像素正确配色,以便绘制整幅图形。 由于输入的是三角形顶点,所以需要根据三角形表面的差异,逐个遍历 三角形计算各个像素的颜色值。之后根据其可见性等进行合并得到最后的输出。

image.png

  • 三角形设置是由顶点数据得到三角形边界,即连点成线。

  • 三角形遍历对设定的三角形顶点生成网格,计算得到覆盖三角形网格的像素位置,对应的像素就生成了一个片元。而片元中的每个像素都是根据三角形顶点信息插值得到的。

    注意: 三角形设置和三角形遍历都是由渲染管线自动完成。

  • 片元着色:实际上,之前的光栅化阶段并不会影响屏幕上像素的颜色变换,而是生成了一系列的数据信息,用来描述每一个三角网格是如何覆盖每个像素的,每个片元就负责存储这些数据,那么片元着色就可以根据这些数据计算出每个片元的颜色值。这个阶段可以完成很多重要的渲染技术,比如:纹理贴图。但是直到这里,片元都没有影响到像素点的颜色值,像素点的颜色值需要经过逐片元操作。

  • 片元操作:比如两个物体之间有遮挡并且深度值也不同,那最终呈现像素点的颜色值需要进行深度和颜色混合。流程如下:

image.png

3、CPU与GPU的协作

应用阶段由CPU完成,之后的几何阶段和光栅化阶段则有GPU完成,那它们之间图和写作呢?

3.1 着色器语言

如果需要程序员直接访问GPU是一件非常麻烦的事情,需要与各种寄存器、显存打交道。而图形编程接口则在这些硬件上做了一层抽象,也就是之前提到的图形标准。现在的工业标准是OpenGL/DirectX。 image.png 应用程序调用OPenGL/DirectX图形接口将渲染所有的数据传输给CPU,CPU调用相应的渲染命令进行渲染,而显卡驱动则将这些渲染命令翻译成GPU可以理解的代码完成真正的渲染。 image.png

因此,显卡制作商需要提供OPenGL/DirectX接口的驱动。如果OPenGL/DirectX版本更新,显卡制作商需要更新对应的显卡驱动。

image.png

3.2 GLSL

3.2.1 OPenGL的着色器语言

重点包含:

  • 顶点着色器(vertex shader)这个是告诉电脑如何打线稿的——如何处理顶点、法线等的数据的小程序。
  • 片面着色器(fragment shader)这个是告诉电脑如何上色的——如何处理光、阴影、遮挡、环境等等对物体表面的影响,最终生成一副图像的小程序。 采用了这两种着色器小程序 的 数据传输处理计算的渲染过程,称之为 可编程管线。 着色器语言编写的代码可以以文本的形式存在,在CPU中是不编译的,在程序运行的时候,在GPU中由显卡驱动对其进行翻译。 在OpenGL中使用着色器的流程:
    创建着色器对象
    源码关联到着色器对象
    编译着色器
    创建一个程序对象
    将着色器对象关联到程序对象
3.2.2 与OpenGL通信

image.png

3.2.3 数据类型

image.png

3.2.4 控制结构

image.png

3.3 EBO、VBO和VAO

3.3.1 EBO

Element Buffer Object,也叫IBO:Index Buffer Object,我们称其为索引缓冲区对象,这个缓冲区主要用来存储顶点的索引信息

image.png

3.3.2 VBO

Vertex Buffer Object,顶点缓冲对象,主要用来存储顶点的各种信息。 优势:模型的顶点信息放进VBO,这样每次绘制模型时,数据不用再从CPU的势力范围里面取,而是直接从GPU的显存中取,从而提高效率。

image.png

3.3.3 VAO

Vertex Array Object,顶点数组对象,它是一个保存了所有顶点数据属性的状态结合,它存储了顶点数据的格式以及顶点所需的VBO对象的引用。说明:VAO中并没有存储模型的顶点数据,数据还在VBO中存储着,VAO相当于是持有有个VBO的引用。 image.png

4、代码实验

image.png

image.png

image.png

5、参考说明

以上都是学习笔记,源自华科计算机图形学课程www.icourse163.org/course/HUST…