【北航计算机图形学笔记】完整版

0. 介绍

计算机图形学: 使用数学算法将三维或二维图像转化为计算机显示器的栅格形式. Data–>Image

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFyShkqt-1593676402391)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585298041484.png)]

主要研究内容: 渲染(光照模型), 建模(细分曲面, 扫描点云), 动画(物理真实感), 人机交互

1. 概论

计算机图形系统:
图像硬件系统: 图像输入输出设备, 图形计算设备.
图像软件系统: 图形应用程序, 图形支撑软件.

图像输出设备:
显示设备: CRT显示器, 平板显示器(等离子显示器, 液晶显示器)
硬拷贝设备: 打印机, 绘图仪
3D显示设备
除了,3D显示设备, 都是光栅设备, 但硬拷贝设备不能刷新.

光栅的硬件表现: 帧缓存
连续储存空间
储存屏幕上像素的颜色值
可看作所有显示设备的硬件接口

每个像素在帧缓存中1位的储存容量成为位面
不同位面的帧缓存展示的图像不同

颜色模型:
面向用户: HSV模型, HLS模型
面向设备: RGB模型, CMY模型, YIQ模型

图形计算设备: 显卡, GPU

输入方式: 测量过程, 设备触发器
输入模式: 请求模式, 采样模式, 事件模式

2. 计算机图形系统

图形软件系统

针孔照相机模型 虚拟照相机模型

图形绘制流水线:
顶点处理(座标变换, 顶点颜色值)->裁剪和图元组装(视域->裁剪, 顶点->图元)–>光栅化(输出片元)–>片元处理(纹理,透明化)

OpenGL, OpenGL ES, WebGL
图元: 几何图元(点, 线段, 折线, 多边形), 图像图元

3. 基本图形学程序

空间:
标量场
向量空间(座标系, 原点): 标量-向量乘法, 向量-向量加法
仿射空间: 点点减法
欧氏空间: 内积和正交, 度量的变换(长度和角度)

凸性: 满足下式, 为凸的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBDgSKo7-1593676402394)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585494950007.png)]

座标系在表示平移变换时,有困难,于是引入标架和齐次座标

标架: 空间的一个定点O,连同三个不共面的有序向量e1,e2,e3的全体,叫做空间中的一个标架,记做{O;e1,e2,e3}。如果e1,e2,e3都是单位向量,那么{O;e1,e2,e3}就叫做笛卡儿标架。两两互相垂直的标架叫做笛卡儿直角标架。在一般情况下,{O;e1,e2,e3}叫做仿射标架。

三维空间中: 座标系变换(3x3)–>标架变换(4x4)

仿射变换: 组合的线性变换=变换的线性组合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qIKlvhCW-1593676402396)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585495359508.png)]

流水线的级联 导致 变换的级联

4. 几何对象与变换

线性组合出各类变换

流水线:

COP投影中心, 透视投影
DOP投影方向, 平行投影(COP在无线远处)

没有COP,

平行投影: 正投影, 轴测投影, 斜投影
透视投影: 一点, 两点, 三点透视. (消失点的个数)

模-视变换矩阵: 模型到COP视角的变换.

三种方法定位相机(相机外参)

OpenGL的透视投影:
利用视域指定视景体

透视投影和平行投影都可以转换为正投影, 方便流水线使用.
P=N(透视投影的规范化矩阵)S(缩放变换)H(错切变换)

5. 观察与投影

模型变换: 模型座标系变到世界座标系下
计算光照: 利用光照模型
观察变换: 世界座标系变到相机座标系下
透视变换: 流水线进行

光照模型: 使2D图像(帧缓存是2D的)看起来像3D
全局光照: 全局的能量平衡, 绘制方程(积分方程,很难计算)
简化使用局部光照: 只考虑光源和表明的一次相互作用
光源模型: 照明函数II(参数: 三个位置, 两个角度, 一个波长)
四类光源: 环境光(强度相同), 点光源(距离衰减), 聚光灯(发光强度衰减), 远距离光源(平行光源)
反射模型
Phong反射模型(法向量n, 观察向量v, 光源向量l, 反射向量r)
改进Phong模型, 加入半角向量h

理想物体: 镜面反射表面, 漫反射表面, 半透明表面
实际物体是粗糙的: 表面反射, 微几何体
实际物体可以简化为三种表面反射的集合, 使用BRDF(双向反射分布函数)

法向量在OpenGL中是状态的一部分(已知的, 用户确定)

明暗绘制:
均匀着色(每个多边形内部颜色一致, 导致Mach带, 侧抑制)
平滑着色(多边形内部双线性插值颜色)
Phong着色(多边形内部双线性插值法向量,再用光照明公式计算颜色)

阴影: 局部光照模型需要补充阴影, 利用透视变换(投影)得到地面上的阴影区域.

6. 光照与明暗绘制

图元装配(连接图元)->裁剪(去掉不可见信息)->透视除法(规范化设备座标系)->视口变换(投影到二维摄像机平面上)

二维裁剪

线段裁剪:
暴力求交点需要大量乘法计算
Cohen-Sutherland算法: 4位端点编码(确定点的方位), 分类讨论(4种), 减少除法
Liang-Barsky算法: 与四条边界直线相交, 看交点顺序. 用减法替代大部分除法

多边形裁剪:
Sutherland-Hodgman算法: 利用四个边界的延长线依次裁剪(每次判断多边形所有边, 更新点集), 问题: 可能会产生两个以上个图像,中间连接部分重叠(不独立). 方便用于流水线结构
Weiler-Atherton算法: 规定边为矢量, 有出点和入点, 产生多个独立图像.

包围盒和包围体

曲线和曲面的裁剪

三维裁剪

二维算法都可扩展, Cohen-Sutherland算法变为6位, 其他算法加边界

视景体裁剪: 投影规范化后的正投影裁剪, 将三维任务简化为二维.

7.图元裁剪

光栅化: 顶点->片元(点->格子)

本PPT讲选取哪些顶点

片元Fragment: 颜色属性, 位置属性, 深度信息

直线光栅化:
DDA算法: 利用端点确定斜率m(0,1)(m>1,xy)m \in (0, 1)(m>1, 交换xy), 计算x,y, 只用加法.
Bresenham算法(经典): 不用浮点计算. 一个片元到下一个片元只有两种可能, 所有判断更接近那个就行.

圆光栅化: 使用平方/开方/三角函数(极座标)都很慢. 利用对称性先画第一象限, 这一步用中点画圆法(两个Bresenham算法), 然后对称得出.

椭圆光栅化: 同样利用对称性先画第一象限, 用中点()画圆法

多边形光栅化(填充):
内外测试
奇偶测试法: 点发出射线,计算与多边形的交点个数(奇内偶外) 但对于自交多边形\刚好通过顶点无效
环绕测试法: 先定义多边形为矢量, 再点发出射线, 交点的多边形矢量方向从左至右+1(反之-1), 环数不为0在内部.https://blog.csdn.net/freshForIphone/article/details/8273023
扫描线填充算法:
求交(类似DDA),排序,配对(两两配对),填充
处理奇点(扫描线与多边形顶点相交): 令顶点为非整数.
种子填充算法: 4连通/8连通, 递归太废空间, 沿扫描线填充

走样: 离散化引起锯齿状边缘. 区域平均反走样技术(将Bresenham算法中的比例作为着色的权重).

8. 光栅化

隐藏面消除/可见面判定

对象空间算法: 适用于重叠少
遍历O(N^2)不可取.
画家算法: 先画底层(远景), 再画近景. 重叠测试(观察平面,深度)->调换顺序(避免死循环)
BSP树算法: 用平面不断在深度上分割物体集合, 建立树

图像空间算法: 适用于重叠多
遍历COP发出的k条光线, O(k), 性能可以但精度受帧缓存限制
Z-Buffer算法: 逐个物体计算, 双缓存(深度+颜色)更近的就更新, 计算量小, 可同时处理正投影变换+隐藏面消除+明暗处理, 但精度不足, 不能处理透明表面(不同深度的颜色混合).
A缓存算法: 深度域和强度域(用链表将所有深度的颜色都保存)
扫描线算法: 标记ON(可见)/OFF(不可见), 重叠时才计算深度值. 但不能处理循环遮挡\表面相交(可以分割物体解决这两个问题)

9~10. 隐藏面消除,纹理映射与片元处理

纹理映射+片元处理

帧缓冲的写操作: 以位块为单位, 位块传送/光栅操作(源缓存->目标缓存)
写入模式: 16种模式(保持不变\替换\按位与\按位或\等等)

映射(不用复杂模型)
纹理映射:
一系列纹理映射: 屏幕座标, 对象座标, 纹理座标, 参数座标
线性纹理映射方法
两步映射方法
纹理->简单三维中间表面(圆柱\圆等), 中间表面->对象表面
三种映射关系建立(中间表面的法向量\对象表面的法向量\对象中心的法向量)
面积平均法改善颜色走样现象
OpenGL: 定义纹理对象, 给顶点设置纹理座标, 指定纹理参数, 设置纹理映射方式(调和\贴图(颜色不变))
环境贴图/映射:
两步方法
镜面中心绘制: 假装照相机放在镜子中心, 不需要计算所有光线及其反射. 中间表面: 球面映射/立方体映射. 但没有实现镜子本身的映射(比如光滑的水壶嘴)
常规绘制
凹凸映射:
法向量的扰动(几何不变)

片元合成:
α\alpha 合成(1=完全不透明, 0=完全透明). 也可以实现反走样, 多重采样

11. 可编程流水线和GPU

之前讲的是固定功能流水线: 参数控制, 各阶段功能固定,

可编程流水线: 较少状态变量, 某些阶段仍然是固定功能, 代码交复杂, 需要大量缓存对象.

顶点缓存对象VBO: 顶点数组对象VAO, 索引缓存对象EBO, 像素/纹理缓存对象PBO, 帧缓存对象FBO(实时渲染)/渲染缓存对象RBO(离线渲染)

着色器和着色语言:
实时渲染: OpenGL–GLSL, …
离线渲染: OSL, …
顶点着色器, 片元着色器, 细分着色器, 几何着色器

GPU:
划分多个GPC图像处理簇, 其中划分SM处理器, 其中划分线程core核心
SIMD单指令多数据, (升级版)SIMT单指令多线程
统一着色器架构

12. 几何建模

几何建模
Geometric Modeling+几何信息+拓扑信息
分为显式建模(点云, 多边形网格, 细分曲面) / 隐式建模(代数曲面, 体素表达, 水平集)

Geometric Modeling+几何信息+拓扑信息

显式建模(点云, 多边形网格, 细分曲面) / 隐式建模(代数曲面, 体素表达, 水平集)

线框模型: 顶点+棱边, 简单快速但不精确
边界表达法(B-rep): 用一组曲面(二维)描述三维物体
点是最基本的信息;
边是由两点确定的;
环是由一组相邻的边组成的;
面是由封闭的环组成的;
体是由空间封闭面组成的。
解耦性好, 方便转换为线框模型(点+边)
但是占用空间大, B-rep表示不一定对应一个有效形体,通常运用欧拉操作来保证B-rep表示形体的有效性、正则性等。

三维流形: 在任意一点的附近一小片区域, 都是一个二维的一个面(a, b是, c不是, 附近区域不是一个面)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyMJtWGF-1593676402398)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1589645627173.png)]

多边形网格
是边界表达法的一种应用
使用半边数据结构简化储存

代数曲面过于复杂
体素构造表示法 (CSG)
复杂物体可由简单形体(体素: 提前定义好的集合),经过布尔运算后得到
实体表示为一颗CSG树的二叉树, 其叶结点为基本体素或几何变换参数; 中间结点为布尔运算或几何变换操作
局部修改困难, 不具备面,环,边, 点的拓扑信息

距离函数: 利于描述动态融合过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gYtmpoKe-1593676402399)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1589646801610.png)]

水平集: 高维空间描述低维空间

隐式模型的表面获取
四/八叉树
Marching Cube(MC)算法

隐式方法:
优点:
表达方式简介
便于空间查询
便于射线追踪
简单形状无损失精度
便于表达拓扑变化(最明显)
缺点:
复杂形体外形表达困难

边界表达法: 用一组曲面(二维)描述三维物体

13. 曲线曲面

显示形式: 依赖座标系
隐式形式: 难以求解
参数形式(特殊的显示形式):
参数多项式曲线, 参数多项式曲面, 分段设计—利用三次参数多项式
得到曲线或曲面的三次参数多项式方法:
三次插值多项式
Hermite曲线和曲面 (控制点)
Bezier曲线和曲面 (控制点)
三次B样条曲线和曲面 (控制点)
NURBS(非均匀有理B样条曲线) (控制点)

多项式求值方法, Horner算法

14. 场景图与图形程序开发

场景图

立即绘制, 利用率不高
批处理, 利用率高
批预处理, 比如多个一样的图形, 可以先将图形预处理

OpenGL显示列表: 一组预先储存起来的待调用的OpenGL函数语句, 但无法支持动态数据
如: 矩阵操作, 光栅位图和图像, 光,材质和光照模型, 纹理和图案填充

层级结构: 树/有向无环图(DAG) 如: 道路->车->车窗->玻璃

图形程序开发

图形程序开发平台
OpenInventor/…
OpenSceneGraph(OSG)/OGRE/VTK/…
Three.js/Scene.js
Unity3D/Unreal/…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章