Skip to content

XJTUSE-图形学 ​

非常感谢泉佬的笔记,同时感谢祝老师把资源都放出来。(不像某些PPT用7年的老师|_|)

希望看到这篇的同学考试顺利!!!

本文转载部分blog,若侵权,请联系

请注意,编写者为21届考生。

部分内容为略,但不代表一定不涉及考试,各届需根据祝老师的说法适当改变。

2023-11-24 开始复习,主要是最近事情也不少,各种DDL,复习也不连续,写到哪里算哪里吧。

2023-11-30 更新了部分省略的内容。

前言 ​

复习资料参考:

泉和其他学长学姐的笔记:

计算机图形学_雨落俊泉的博客-CSDN博客

老师群里发的笔记:eg:习题2.pdf

最后一节课的视频

思源学堂上的OpenGL相关内容+PPT

下面先进行知识汇总和复习,其实泉佬的很全了,我主要是自己写一下复习,建议同学们看泉的。我自己写的主要是按照PPT上面来着,有些一概而过,有些压根没写

第一章 ​

1.1 研究内容 ​

典型的图形系统由图形输入、图形输出和图形处理系统组成。

图形的要素:

  • 几何要素:刻画对象的轮廓、形状等- 非几何要素:刻画对象的颜色、材质等 图形图像表示法:

  • 点阵图- 矢量图

1.2 发展历史 ​

个人想法:我觉得发展历史这一块了解啥的就好了,没想到老师真出考题,哎/>____0),称为后向面(背面)。

后向面总是看不见的,不会由于后向面的遮挡,而使别的棱成为不可见的。因此计算时,可以把这些后向面全部去掉,这并不影响消隐结果。

  • 空间分割技术:将投影平面上的窗口分成若干小区域;为每个小区域建立相关物体表,表中物体的投影于该区域有相交部分;则在小区域中判断那个物体可见时,只要对该区域的相关物体表中的物体进行比较即可- 物体分层表示:模型变换中的树形表示方式;

消除隐藏线 ​

算法

1️⃣ 若线段的两端点及视点在给定平面的同侧,线段不被给定平面遮挡,转(7);

2️⃣ 若线段的投影与平面投影的包围盒无交,线段不被给定平面遮挡,转(7);

3️⃣ 求直线与相应无穷平面的交:

•无交点转(4);

•若交点在线段内部,交点将线段分成两段,与视点同侧一段不被遮挡,另一段在视点异侧转(4);

•若交点在线段外部,转(4)。

4️⃣ 求所剩线段的投影与平面边界投影的所有交点。若无交点,转(7)。

5️⃣ 以上所求得的各交点将线段的投影分成若干段,求出第一段中点。

6️⃣ 若第一段中点在平面的投影内,则相应的段被遮挡,否则不被遮挡;其他段的遮挡关系可依次交替取值进行判断。

7️⃣ 结束。

消除隐藏面 ​

  • 画家算法- Z缓冲算法- 扫描线Z缓冲算法- 区间扫描线算法- 区域子分割(Warnack)算法- 光线投射算法

这几个算法难的不行,看不懂~~

画家算法 列表优先算法:画家的作画顺序暗示出所画物体之间的相互遮挡关系。

基本思想 1️⃣ 先把屏幕置成背景色;

2️⃣ 再把物体的各个面按其离视点的远近进行排序,排序结果存在一张深度优先级表中;

3️⃣ 然后按照从远到近的顺序逐个绘制各个面。

关键是如何对场景中的物体按深度排序。

优点:简单(如何对场景中的物体按深度排序)。

缺点:只能处理互不相交的面,且深度优先级表中面的顺序可能出错

Z缓冲算法

Z-Buffer算法()
{
	帧缓存全置为背景色
	深度缓存全置为最小Z值
	for(每一个多边形)
	{
		扫描转换该多边形
	    for(该多边形所覆盖的每个象素(x,y) )
	   {
	   		计算该多边形在该象素的深度值Z(x,y);
			if(Z(x,y)大于Z缓存在(x,y)的值)
			{
				把Z(x,y)存入Z缓存中(x,y)处
				把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处
			}
	  }
     }
}

优点:

  • 简单稳定,利于硬件实现;- 不需要整个场景的几何数据。 缺点:

  • 空间:需要一个额外的Z缓冲器;- 时间:在每个多边形占据的每个像素处都要计算深度值。

改进算法:先像素后多边形

{
	帧缓存全置为背景色
	for (屏幕上的每个象素(i, j)) {
		深度缓存变量zb置最小值MinValue
		for (多面体上的每个多边形Pk) {
			if (象素点(i, j)在Pk的投影多边形之内) {
				计算Pk在(i, j)处的深度值depth;
				if (depth大于zb) {
					zb = depth;
					indexp = k;
				}
			}
		}
		if (zb != MinValue)
			在交点 (i, j) 处用多边形Pindexp的颜色显示
		}
}

扫面线Z缓冲算法

扫描线Z - buffer算法() {
	建多边形y表;根据多边形顶点最小y值,将多边形置入多边形y表。
	活化多边形表APT,活化边对表AET初始化为空。
	For(每条扫描线i,i从小到大) {
		1. 帧缓存CB置为背景色。
		2. 深度缓存ZB (一维数组) 置为负无穷大。
		3. 将对应扫描线i的,多边形Y表中的多边形加入到活化多边形表APT中。
		4. 对新加入的多边形,生成其相应的边表。
		5. 对APT中每一个多边形,若其边表中对应扫描线i增加了新的边,将新的边配对,加到活化边对表AET中。
		6. 对AET中的每一对边:
			6.1 对xl < j < xr 的每一个象素,按增量公式z = z + ? za计算各点depth 。
		    6.2 与ZB中的量比较,depth > ZB(j), 则令ZB(j) = depth,并确定颜色
		                值,写帧缓存。
		7. 删除APT中多边形顶点最大y坐标为i的多边形,并删除相应的边。
		8. 对AET中的每一个边对,作如下处理:
		    8.1 删除ylmax或yrmax 已等于i的边。若一边对中只删除了其中一边,
		        对该多边形的边重新配对。
		    8.2 用增量公式计算新的xl 、 xr 和zl
	}
}

优点:

  • 将整个绘图窗口内的消隐问题分解到一条条扫描线上解决,使所需的Z-Buffer大大减少 - 计算深度值时,利用了面连贯性,只用了一个加法 。 缺点:

  • 每个像素处都计算深度值,甚至不止一次的计算(多边形重叠区域),运算量仍然很大。

区间扫面线算法 基本思想

把当前扫描线与各多边形在投影平面的投影的交点进行排序后,使扫描线分为若干子区间。只要在区间任一点处找出在该处z值最大的一个面,这个区间上的每一个象素就用这个面的颜色来显示。

for (绘图窗口内的每一条扫描线)
{   求投影与当前扫描线相交的所有多边形
     求上述多边形中投影与当前扫描线相交的所有边,将它们记录在活化边表AEL中
     求AEL中每条边的投影与扫描线的交点;
     按交点的u坐标将AEL中各边从左到右排序,  两两配对组成一个区间;
      for (AEL中每个区间)
       {
          求覆盖该区间的所有多边形,将它们记入活化多边形表APL中;
          在区间上任取一点,计算APL中各多边形在该点的深度值,记深度最大者为P;
           用多边形P的颜色填充该区间
        }
}

区域子分割(Warnack)算法 基本思想

首先将场景中的多边形投影到绘图窗口内,判断窗口是否足够简单,若是则算法结束;否则将窗口进一步分为四块。对此四个小窗口重复上述过程,直到窗口仅为一个像素大小。此时可能有多个多边形覆盖了该像素,计算它们的深度值,以最近的颜色显示该像素即可。

光线投射算法 基本思想:

  • 考察由视点出发穿过观察屏幕一象素而射入场景的一条射线,则可确定出场景中与该射线相交的物体;- 在计算出光线与物体表面的交点之后,离象素最近的交点的所在面片的颜色为该象素的颜色;- 如果没有交点,说明没有多边形的投影覆盖此象素,用背景色显示它即可。
for屏幕上的每一象素
  {形成通过该屏幕象素(u,v)的射线;
	 for 场景中的每个物体
         {将射线与该物体求交;
		if 存在交点
		     以最近的交点所属的颜色显示象素(u,v)
		 else
		      以背景色显示象素(u,v)
	    }
    }

第三章 ​

参数曲线与曲面 ​

描述物体的三维模型:

  • 线框模型- 曲面模型- 实体模型

基本概念 ​

主要涉及一些基本概念,比如曲线曲面的参数表示,切线,法线,法平面,密切平面,从切平面,曲率,挠率等等等。其实就是高数教的那些东西,估计也不会考,不再赘述,感兴趣可自行查阅高数书。

插值、拟合和光顺 ​

  • 插值:给定一组有序的数据点Pi构造一条曲线顺序通过这些数据点,所构造的曲线称为插值曲线。- 拟合:构造一条曲线使之在某种意义下最接近给定的数据点,所构造的曲线为拟合曲线。-  光顺(Fairing):指曲线的拐点不能太多。对平面曲线而言,相对光顺的条件是
  • a. 具有二阶几何连续性(G2)- b. 不存在多余拐点和奇异点;- c. 曲率变化较小。

在图形学中,逼近包含了插值和拟合。

参数化 ​

  • 均匀参数化- 累加弦长参数化- 向心参数化- 修正弦长参数化

连续性 ​

简单理解:

参数连续性为在连接处,不仅切线的方向一致,而且切线斜率大小也一样。

而几何连续性为在连接处,方向一致,大小不等。

Bezier 曲线与曲面 ​

可以看我写的了解一下都讲了什么,但要看懂还是得看PPT或者泉的笔记。这一部分确实好难懂/—\

是什么? ​

按照我的学习理解,可以理解为把所有控制点给予一定的权重,其中权重就是基函数。同时,可以注意到,该公式与所有的控制点都有关系。

Bernstein基函数的性质 ​

  • 正性- 端点性质- 权性- 对称性- 递推性:高一次的Bernstein基函数可由两个低一次Bernstein基函数线性组合而成

  • 导函数- 最大值:在i/n处最大- 积分- 升阶公式

Bezier曲线的性质 ​

  • 端点性质 Bezier曲线的起 点、终点与相应的特征多边形的起点、终点重合。- 起点和终点处的切线方向和特征多边形的第一条边及最后一条边的走向一致- r阶导矢只与(r+1)个相邻点有关- k阶导函数的差分 对称性

  • 凸包性- 几何不变性- 变差缩减性- 仿射不变性

de Casteljau递推算法 ​

Bezier曲线的拼接(略) ​

非重点复习,同时我也看不懂

Bezier曲线的升阶和降阶(重点掌握升阶) ​

升阶核心公式:

升阶示意图如下:

降阶公式如下:

降阶时,选择一个递推公式即可

Bezier曲面 ​

掌握递推公式即可:

Bezier曲线缺点:

  • 缺少灵活性- 控制性差- 不易修改

B样条曲线与曲面 ​

是什么? ​

de Boor-Cox递推 ​

基函数性质 ​

  • 局部支撑性- 权性- 微分公式- 非负性

如果节点数目是(m+1),函数的阶数是k,控制点的个数是(n+1),则m=(n+k),即节点数等于控制点数+阶数

分类 ​

  • 均匀样条曲线- 准均匀样条曲线- 分段Bezier曲线- 一般的非均匀B样条曲线

B样条性质 ​

  • 局部性- 开曲线定义域- 凸包性- Bezier曲线是B样条曲线的特例- 分段参数多项式- 连续性- 导数公式- 变差缩减性- 仿射不变性- 几何不变性- 直线保持性- 造型灵活性

De Door算法 ​

三次B样条的Bezier表示(略) ​

节点插入算法 ​

B样条曲面(略) ​

三角网格 ​

形体表示方法:

  • 线框模型- 实体模型- 表面模型

三角网络概念 ​

用三角形组成面片列表近似三维模型;

三角网格描述 ​

  • 顶点几何信息- 三角网络拓扑连接的信息- 附加属性

三角网格模型的存储 ​

  • 文本:易于阅读和理解;(OBJ和PLY文件格式) - 二进制:具有较高的编码效率。

三角网格的半边表示(略) ​

网格处理概述 ​

网络处理包括以下:

  • 简化:用较少面片表示几何,提高绘制效率;- 细分:以原始网格为基础,按一定规则生成包含更多面片的几何;- 重剖:为了获得更规则的网格模型,可能具有更少或更多的面片。

  • 光顺- 参数化- 网格修复:因为数据采集和配准存在误差- 网格变形- 网格分割- 网格分析- 模型检索

网格简化

  • 顶点删除操作- 边压缩操作- 面片收缩操作- 几何形状过渡

网格细分

  • Loop细分法- Butterfly细分。

特征敏感网格重剖 在网格简化后的模型中,三角形形状的规则性难以有较好的保证;网格重剖:生成较规则的网格模型,并尽可能与原网格在几何上相近。

特阵区域:具有至少一个较大主曲率的区域

第四章 ​

真实图像的生成(略) ​

颜色视觉 ​

光源分类 ​

  • 点光源- 线光源- 面光源

颜色 ​

  • 非彩色只有一个属性:明度- 彩色有三个属性:色调(Hue) ;饱和度(Saturation) ;亮度(Value) 同时,颜色的物理属性有

主波长(Dominant Wavelength):产生颜色光的波长,对应于视觉感知的色调;

纯度(Purity):对应于饱和度;

明度(Luminance):对应于光的亮度。

颜色视觉理论 ​

简要看看了解三色学说,四色学说啥的(基本属于常识范围内的了)

CIE色度图(略) ​

常用颜色模型 ​

  • RGB模型- CMY模型- HSV模型

简单光照明模型 ​

Phong光照明模型 ​

单光照明模型模拟物体表面对光的反射作用,不考虑折射。

增量式光照明模型 ​

不同法向的多边形邻接处光强突变且有马赫带效应.

增量式光照明模型:

  • 在每个多边形顶点处计算光照明强度或参数,然后在各个多边形内部进行双线性插值,得到多边形光滑均匀颜色分布-  保证多边形之间的颜色光滑过渡。

两个主要算法(掌握步骤)

  • 双线性法向插值:Phong明暗处理- 双线性光强插值:Gouraud明暗处理

Gouraud明暗处理的步骤:

  • 求出多边形顶点的平均法向。- 使用Phong光照明模型计算顶点的平均光强。- 利用线性插值,计算多边形各边上的像素的光强。- 利用线性插值,计算多边形区域内各像素的光强。

Phong明暗处理的步骤:

  • 计算各顶点的平均法向。- 利用线性插值,计算多边形各边上的像素的法向。- 利用线性插值,计算多边形区域内各像素的法向。- 利用光强是法向量的函数(简单光照明模型),计算各点的光强。

对比:

阴影 ​

阴影分类:

  • 自身阴影- 投影阴影

纹理及纹理映射(掌握概念) ​

纹理概述 ​

纹理:物体表面的微小结构

从三方面思考:

  • 简单光照明模型:改变漫反射系数->改变颜色;改变物体表面法向量。- 真实感图形学:图像纹理;函数纹理- 二维图像纹理和三维物体之间的关系:纹理空间,景物空间,图像空间。

二维纹理映射:

  • 获取和表示- 映射- 滤波

几何纹理:生成图像时,对曲面的法向量进行扰动。

20届期末考题 ​

一、填空题 ​

1.常见的三角网格存储格式包含         和             。

2.深度缓冲区算法两类需要存储器存储的信息分别是:          和         。

  1. 图形通常由点、线、面、体等          要素和灰度、色彩、线型、线宽等         要素组成。

4.非点光源生成的阴影由         _和          组成。

5.典型的图形系统通常由哪三种设备组成:         、          和          。

6.投影变换有两种基本方式,分别是         和         。

  1. OpenGL函数库主要分为哪三类:           、            和          。

8.在计算机图形学中,          和          都可视为逼近。

二、选择题 ​

三、简答题 ​

四、计算证明题 ​

答案 ​

填空 ​

1.OBJ     PLY

2.颜色     深度值

3.几何 非几何

4.本影  半影

5.输入设备 输出设备 图形处理设备

6.透射投影 平行投影(正投影)

7.核心库gl      实用库glu       工具库glut

8.拟合         插值

选择 ​

1.A

2.B

3.D

4.D

5.A

6.D

7.C

8.C

9.D

简答 ​

3.Phong明暗处理的实质是法向插值。

基本思想:

1、求顶点的法向;

2、用线性插值的方式求线上的法向;

3、用线性插值的方式求面上的法向;

4、根据各个点的法向使用简单光照明模型来计算各个点的光强。

计算证明题 ​

看代码画图:

(草图)

理论作业 ​

第二章 (除了2-2,基本都能在前面找到,不再给出)

第三章 (答案老师发了,自查)

答案:

2-2:

字丑勿喷~~~~~~~~~~~

OpenGL ​

参考:

OpenGL知识点-CSDN博客

和老师给的资料

基本概念 ​

使用的光照模型是整体光照模型

两种物体着色模式:RGBA颜色模式、颜色索引模式

OpenGL主要有核心库,实用库,辅助库,工具库,Windows(X窗口)专用库, Win32 API函数库。其中最主要的核心库gl,实用库glu,工具库glut。

坐标变换 ​

  • 视图变换:从不同的位置去观察它。- 模型变换:移动或者旋转它,可以放大或缩小它。- 投影变换:透视投影(近大远小)和平行投影。- 视口变换:希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。

  • glFrustum函数:将当前可视空间设置为透视投影空间- glOrtho函数:将当前的可视空间设置为正投影空间- gluPerspective():设置透视投影矩阵- glViewport:视口变换,两个参数定义了视口的左下角(0,0表示最左下方),后两个参数分别是宽度和高度。- gluLookAt:视图变换- glMatrixMode(GL_PROJECTION):模型视图和投影矩阵都有相应的堆栈,glMatrixMode来指定当前操作。- glScale* : 缩放物体

双缓冲技术 ​

在存储器(很有可能是显存)中开辟两块区域,一块作为发送到显示器的数据,一块作为绘画的区域,在适当的时候交换它们 。

glutInitDisplayMode (GLUT_ RGB| GLUT_SINGLE);

GLUT_SINGLE:单缓冲

GLUT_DOUBLE:双缓冲

glutIdleFunc:在CPU空闲的时间调用某一函数

glutDisplayFunc(&myDisplay):如需绘制窗口,调用myDisplay函数

垂直同步技术 ​

只有在显示器刷新时,才把绘制好的图象传输出去供显示

看代码画图 ​

个人总结以下步骤:

  • 先看显示屏的像素,是10241024啊,还是800800;- 看主函数中,将要绘制的窗口设置在那里,注意左上角是(0,0);- 看绘制窗口的大小。- 在看glutDisplayFunc(&myDisplay)中myDisplay绘制的图像,注意窗口的中心点为(0,0)。- 需要了解简单的绘制函数,下面进行总结 多边形:
glBegin(GL_POLYGON);// 绘制为多边形
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.0f, 0.5f);
glEnd();
 // 实际是一个矩形

圆:

void myDisplay(void)
{
    //画一个圆
    int i;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);//单个简单填充多边形
    for (i = 0; i < n; i++) {
        glVertex2f(R * cos(2 * Pi / n * i), R * sin(2 * Pi / n * i));
    }
    glEnd();
    glFlush();
}

画点:

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPointSize(5.0f);
    glBegin(GL_POINTS);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.5f, 0.5f);
    glEnd();
    glFlush();
}

颜色:

glColor3f(1.0f, 1.0f, 1.0f); // RGB,范围从0-1

考后 ​

整张试卷难度不大,不过有部分小题没复习到。OpenGL考了之前没遇到过的代码。整体来说,老师挺好的。