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

    技术2022-07-16  91

    文章目录

    0. 介绍1. 概论2. 计算机图形系统3. 基本图形学程序4. 几何对象与变换5. 观察与投影6. 光照与明暗绘制7.图元裁剪8. 光栅化9~10. 隐藏面消除,纹理映射与片元处理11. 可编程流水线和GPU12. 几何建模13. 曲线曲面14. 场景图与图形程序开发

    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 全局光照: 全局的能量平衡, 绘制方程(积分方程,很难计算) 简化使用局部光照: 只考虑光源和表明的一次相互作用 光源模型: 照明函数 I I I(参数: 三个位置, 两个角度, 一个波长) 四类光源: 环境光(强度相同), 点光源(距离衰减), 聚光灯(发光强度衰减), 远距离光源(平行光源) 反射模型 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 , 交 换 x y ) m \in (0, 1)(m>1, 交换xy) m(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/…

    Processed: 0.019, SQL: 9