计算机图形学

第一章(3) 图形绘制系统概述

CPU vs GPU

CPU vs GPU

CPU 如何向 (GPU) 高效、准确地下达指令?

答案在于理解它们的指挥体系内部执行流程

课程目标

  • 解释CPU、GPU和API的分工
  • 描述渲染流水线的核心步骤

如何画一只兔子?

“CPU”需要向“GPU”传递哪些“数据”和“指令”?

数据 (Data)

兔子的外观?

  • 顶点位置
  • 颜色
  • 贴图...

指令 (Operations)

对兔子进行哪些处理?

  • 位置在哪里
  • 旋转多少度
  • 用什么光照...

整个图形体系结构,就是为了高效地传递数据对数据的操作

图形绘制体系结构

一个分工明确的“流水线”

CPU vs GPU
  • 应用层 - CPU:

    负责场景管理、物理、AI等,“决定”要画什么,并准备好所有数据

  • 驱动/API层- Graphics API:

    连接CPU和GPU的桥梁。将高级指令翻译成GPU能懂的底层指令,解决软硬件兼容性问题

  • 图形硬件层 - GPU:

    接收指令和数据,通过内部固化的硬件流水线执行实际的绘制工作

绘制流水线体系

GPU内部对数据的处理流程

Rendering Pipeline
  • 根据应用程序生成对象的顺序依次处理,可考虑局部光照效果
  • 所有的过程处理均在图形计算硬件上实现

绘制流水线体系

流水线流程

① 顶点输入: “原材料”进场 (顶点数据)

② 顶点着色器 (Vertex Shader): 可编程 - 决定顶点在哪

③ 光栅化 (Rasterization): 固定功能 - 决定覆盖哪些像素

④ 片元着色器 (Fragment Shader): 可编程 - 决定像素是什么颜色

⑤ 帧缓冲操作: 最后处理,写入显存

我们通过OpenGL API,主要就是为了控制这两个可编程阶段。

绘制流水线体系

顶点处理

Rendering Pipeline
  • 流水线的工作之一是将物体的表示从一个坐标系统变换到另一坐标系统,涉及坐标系包括对象坐标系、相机坐标系、屏幕坐标系等
  • 每个坐标系变换等价于矩阵变换
  • 顶点处理还负责计算顶点的颜色

绘制流水线体系

顶点处理

Rendering Pipeline
  • 投影的过程,即是通过三维观察,将三维物体对象投射到图形学编程平面上形成二维图像的过程
    • 透视投影,所有的投影线会聚于投影中心
    • 平行投影,所有的投影线平行,投影中心位于无穷远处,有投影方向

绘制流水线体系

顶点处理

Rendering Pipeline
  • 在进行裁剪之前,需要将所有的顶点组装成几何形体,包含线段、多边形、曲线和曲面
  • 与真实的相机类似,虚拟相机也只能"看见"部分场景,即只保留在相机空间中可见的物体对象,将位于相机空间以外的所有对象去除掉

绘制流水线体系

光栅化

Rendering Pipeline
  • 如果对象没有被裁剪,需要为在帧缓存中与该物体对应的像素指定颜色
  • 光栅化会为每个对象生成一系列的片元(Fragments),可理解为潜在的“像素”
  • 每个片元,在缓存中包含的属性有,位置,颜色和深度属性等
  • 在光栅化过程中,对象顶点的属性通过插值计算得到

绘制流水线体系

片元处理

Rendering Pipeline
  • 片元处理的目的是确定在帧缓存中对应的像素的颜色,颜色值可以是纹理映射的结果,也可以是对顶点颜色进行插值计算得到的结果
  • 片元也会被其它距离相机更近的片元遮挡,对应像素的颜色取决于离相机更近的片元的颜色,称为“隐面消除算法”

编程接口

概述

  • 从应用程序开发者角度看,图形系统是通过一系列软件接口实现的,即应用程序开发者接口(Application Programmer Interface. API)
  • API提供了对图形学编程各阶段功能的支持,包括对象描述、观察者、光源、材质等,除此之外,还可提供对输入设备、其他系统功能的支持

编程接口

对象描述

  • 构成对象的基本元素包括:
    • 点 (0D)
    • 线 (1D)
    • 多边形 (2D)
    • 部分曲线和曲面,如二次曲线、参数多项式曲线、贝塞尔曲线等
  • 所有的基本元素由空间中的位置坐标或顶点定义

编程接口

对象描述示例

OpenGL版

                            
//定义对象类型
glBegin(GL_POLYGON);
//定义顶点坐标位置
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();//结束定义
                            
                        

根据不同参数绘制不同类型的对象,数据在CPU中处理后,再通过管线传递给图形硬件(GPU)

GPU版

                            
var points = new Float32Array([
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
]);
                            
                        

将几何顶点存放在数组中,将数组传递给GPU,由GPU负责渲染,渲染结果为三角形

编程接口

相机描述

API中需要指定的相机参数包括:

  • 相机六自由度,包括镜头中心的位置和方向角度
  • 镜头焦距
  • 相片大小
  • 成像平面方向

知识检验

请将“任务”分配给最适合执行它的“组件”

任务 组件
响应用户输入,更新游戏角色位置 CPU (应用层)
翻译高级指令,管理硬件兼容性 图形 API
将模型的3D坐标转为屏幕2D坐标 GPU (顶点着色器)
根据光照,计算一个像素的最终颜色 GPU (片元着色器)

课程总结

  • 理解了 CPU, API, GPU 构成的三层体系结构。
  • 深入了GPU内部,了解了其 流水线体系