计算机图形学
第一章绪论
计算机图形学主要研究内容:计算机中图形的表示方法,以及利用计算机进行图形的计算、处理和显示的相关原理和算法
计算机图形学之父:Ivan Sutherland
1950年第一台图形显示器作为美国MIT旋风I号的附件诞生了
印刷业常用的颜色模型是CMY
计算机显示设备一般使用RGB颜色模型
图形学最高级 Steven A. Coons奖
siggraph 是图形学组织及最高会议
图形学应用领域:可视化、真实感图形学实时绘制,计算机动画、用户接口、计算机艺术、自然景物仿真
第一次提出光投射的是 Whitted模型
半边数据结构要保存的信息:顶点几何信息 和 从此顶点出发的半边信息
定义纹理的两种方法:图像纹理 和 函数纹理
第二章 光栅图形学
关键字:扫描转换(光栅化)、区域填充、裁剪、反走样
2.1绘制一个像素的直线
2.1.1数值微分法 DDA
利用增量式的思想,在直线y = kx + b ,x每增加1,y每增加△k,
void DDA(int x0,int y0,int x1,int y1,int color)
{
float dx,dy,y,k;
dx = x1 - x0,dy = y1 - y0;
k = dy/dx;
y = y0;
for (x=x0;x!=x1;x+=1)
{
drawpixel(x,int(y+0.5),color);
y+=k;
}
}
注意:上述算法仅只用于|k|<=1的情况,当不符合时,需要将x,y的地位互换。
2.1.2 中点画线法
原理:x逐步递增,每次通过与中点的位置关系判断取上面那个点还是下面那个点
d = F(x,y) = ax+by+c (a = y0-y1 b =x1-x0 c = x0y1-x1y0)
F(x,y) = 0 ,线上
F(x,y) < 0,上方
F(x,y) > 0,下方
采用了增量式的思想,
当d >= 0,d1 = F(xp+2,y+0.5) = a(xp+2) + b(yp+0.5)+c = d+a 增量为a,
当d < 0, d2 = F(xp+2,y+1.5) = a(xp+2) + b(yp+1.5)+c = d+a+b ,增量为a+b
拜托浮点运算,用2d代替d
5 void line1(int x0,int y0,int x1,int y1){
6
7 int x,y,d0,d1,d2,a,b;
8 y=y0;
9 a=y0-y1; //直线方程中的a的算法
10 b=x1-x0; //直线方程中的b的算法
11 d0=2*a+b; //增量初始值
12 d1=2*a; //当>=0时的增量
13 d2=2*(a+b); //当<0时的增量
14 for(x=x1;x<=x2;x++){
15 putpixel(x,y,GREEN); //打亮
16 if(d0<0){
17 y++;
18 d0+=d2;
19 }else{
20
21 d0+=d1;
22 }
23
24 }
25 }
2.1.3 Bresenham算法
原理:x逐步递增,每次判断增值是否大于0.5,来判断取上面的点还是下面的点
为了避免除法:e‘ = 2e *dx
void Bresenham(int x0,int y0,int x1,int y1,int color)
{
int x,y,dx,dy,e;
dx = x1-x0,dy = y1-y0,e = -dx;
x=x0,y=y0;
fpr(i=0;i<=dx;i++)
{
drawpixel(x,y,color);
x++,e+=2dy;
if(e>=0){y++;e-=2dx;}
}
}
2.2 圆弧的扫描转换算法
2.2.1 圆的特征
八对称性,只要扫描转化1/8圆弧就能利用八对称性求出整个圆弧的像素集。
2.2.2 中点画圆法
原理:F = x² + y² - R² 圆上的点F =0, 圆外的点F >0,圆内的点F<0
类似与中点画线法,d = F(M) = F(xp+1,yp-0.5) = (xp+1)² + (yp-0.5)² - R²
d<0,取上面的点,下一个点为F(xp+2,yp-0.5),d2-d1 = 2xp+3
d>0,取下面的点,下一个点为F(xp+2,yp-1.5),d2-d1 = 2(xp-xy)+5
算法:
26 void MP_Circle(int xc , int yc , int r)
27 {
28 int x, y;
29 double d;
30
31 x = 0;
32 y = r;
33 d = 1.25 - r;
34 CirclePlot(xc , yc , x , y);
35 while(x <= y)
36 {
37 if(d < 0)
38 {
39 d = d + 2 * x + 3;
40 }
41 else
42 {
43 d = d + 2 * ( x - y ) + 5;
44 y–;45 }
46 x++;
47 CirclePlot(xc , yc , x , y);
48 }
49 }
2.3多边形扫描转换和区域填充
多边形表示方式:1.顶点表示 2.点阵表示
扫描转换:将顶点表示转化为点阵表示
2.3.1.1 扫描线算法
(1)求交 (2)排序 (3)配对 (4)填色
升级方法:1.增加活性边表 2.增量法计算 3.新边表
AET活性边表:(当前x坐标,△x ,ymax)
创建一个新边表,里面用ymin记录每一条扫描线第一次出现位置
NET新边表:(最小x坐标,△x ,ymax)
算法:
void polufill(polypon,color)
{
for(各个扫描线i)
{
初始化新边表表头指针NET[i];
把ymin=i的边放入NET[i];
}
y = 最低扫描线号;
初始化活性边表为空;
for(各条扫描线i)
{
把NET[i]中边结点用插入排序法插入AET,使之按x坐标递增顺序排序;
若允许多边形的边自交,用冒泡排序法对AET重新排序;
遍历AET,把配对交点区间(左开右闭)上像素(x,y),改颜色;
遍历AET,把ymax=i的点删去,并把ymax>i的点的x值递增△x
}
}
2.3.1.2 边界标志算法
有适合用硬件实现,不用维护边表和排序,所以比扫描线算法快1-2个数量级
先对多边形每条边进行直线扫描转换,将多边形边界经过的像素打上标记;
然后类似直线扫描转换来上色。
对每条扫描线,从左到右遍历像素x,维护一个变量inside,经过一个标记便取反,inside为true则上色;
算法:
{
对多边形poludef每条边进行直线扫描转换;
for(每条与多边形poludef相交的扫描线y)
{
inside = false;
for(扫描线上每个像素x)
{
if(像素x被打上边标记)
inside = !inside;
if(inside)
上色;
else
改为背景色;
}
}
}
2.3.2 区域填充算法
区域分为四连通区域和八连通区域,区域表示分为:内点表示和边界点表示
对于点阵表示的填充图形
2.3.2.1 递归算法
对于内点表示,从区域内一点(x,y)开始递归遍历4个方向的点,如果是内点则上色,不是则结束。
对于区域点表示,同上,如果不是区域点则继续,是则结束
2.3.2.2区域填充的扫描线算法
(1)初始化。堆栈为空,将种子点(x,y)入栈
(2)出栈。栈空则结束,否则取栈顶元素(x,y),以y为当前扫描线
(3)填充并确定种子点所在区域,从(x,y)出发,向左右分别找边界点xl,xr
(4)确定新的种子点。
2.4 字符
点阵字符压缩技术:黑白段压缩,部件压缩和轮廓字形压缩
2.5 裁剪
2.5.1.1 直线段裁剪
1.Cohen-Sutherland 裁剪算法
思想:对于每条线段p1p2分成3种情况
(1)p1p2完全在窗口内,取
(2)p1p2完全在窗口外,弃
(3)p1p2穿过窗口,将线段分成窗口外和窗口内,然后分别弃和取
算法书本p34页
区域编码思想:code1 = code2 =0 表示都在区域内则取
code1&code2 !=0 则表示都在区域外则弃
否则 求交点,再继续判断
2.5.2.2 中点分割裁剪算法
同直线段裁剪,先编码,再分3种情况处理。只是对于第三种情况,利用中点来分2段后递归求解
2.5.1.3 梁友栋-Barskey裁剪算法
p36页
upk <= qk
求出u1,u2
当pk<0 ,从外到内,取qk/pk与0的max,
当pk>0, 从内到外,取 qk/pk和1的min
最后u1>u2 弃,u1<u2,取
2.5.2 多边形裁剪
p37-38
一次用窗口的一条边裁剪一次多边形 不适合于凹窗口
2.6 反走样
用离散量表示连续量引起的失真现象称为 走样,减少或者消除这种效果的技术成为 反走样
方法:1.提供分辨率,像素点变多 2.区域采样 3.加权区域采样
2.7 消隐
2.7.1 消隐的分类
1.消隐对象分 线消隐 和 面消隐
2.消隐空间分类
物体空间的消隐算法(光线投射算法,Robrtys算法)、
图像空间的消隐算法(Z-buff算法,扫描线算法,Warnock算法)、
物体空间和图像空间的消隐算法(画家算法)
2.7.3 消除隐藏面
1.画家算法,一层又一层,从远到近,不断更新
2.Z-buff 设置一个Z缓冲区存放每个像素的深度,一个帧颜色缓存区存放颜色
p47页
第三章 几何造型技术
几何造型系统中有3种方法描述物体的三维模型:线框模型、曲面模型和实体模型
实体模型中基本表示方式:
3.1参数曲线和曲面
曲线
显示表示:y=f(x) 隐式表示:f(x,y)=0 参数方程:P(t) =[x(t),y(t)]
曲率 绕率
曲线间连接的光滑度的度量方式:参数连续和几何连续
3.1.3插值、拟合和光顺
插值:构造一条曲线顺序通过给定的一组数据点,称为对这些数据点的插值,构造的曲线称为插值曲线。
拟合:构造一条曲线使之在某种意义下最接近给定的数据点(未必要通过这些点),称为对这些数据点进行拟合,构成的曲线为拟合曲线。
光顺:曲线的拐点不要过多
对平面曲线而言,相对光顺条件如下:①具有二阶几何连续性G2 ②不存在多余拐点和奇异点 ③曲率变化较小
3.1.6连续性
1.函数的可微性 C^n或n阶参数连续性
2.几何连续性 G^n
Cn连续包含在Gn连续中
G0/C0连续 要求曲线在连接点处连接
G^1连续 要求曲线在满足G^0连续前提下,有公共的切矢量 Q‘ = αP’
G^2连续 要求曲线在满足G^1连续前提下,满足有公共的曲率矢Q’‘ = α²P’‘ + βP’
由此可见,C1连续则G1连续(α=1),C2连续则G2连续(α=1,β=0)
3.2 Bezier曲线和曲面p66
1.定义P(t) = ∑PiBi,n(t),t∈[0,1]
Bi,n (t) 是n次Bernstein基函数,性质:
正性 Bi,n(t) >0
权性:累加和为1
最大性:Bi,n(t)最大值在t=i/n上取到
Bezier函数的性质:
对称性:起点的性质和终点性质相同
凸包性(凸包:定义在一个点集上,2D上的定义是一堆点,以外围点构成的凸多边形)
几何不变性:几何特性不依赖坐标
变差缩减性:若Bezier为平面图形,平面上任意直线与P(t)交点个数不多于该直线与特征多边形交点个数
仿射不变形
割角算法:递归递进
Bezier曲线的拼接
G1连续的话 Pn-1,Pn=Q0,Q1 3点共线
G2连续的话,Pn-2 Pn-1 Pn=Q0,Q1,Q2五点共面
Bezier曲面
Pij(i=0,1,…,m;j=0,1,…,n)为(m+1)*(n+1)的空间点列
3.3 B样条曲线与曲面P78
P(t) = ∑PiNi,k(t)
欲确定第i个k阶B样条Ni,k(t),要用到ti,ti+1 到 ti+k 一共k+1个点,称[ti,ti+k]为Ni,k(t)的支撑区间
一组B样条基的节点矢量T=[t0,t1,…,tn+k]
类型画风
1)均匀B样条 ti+1-ti =常数>0
2)准均匀B样条曲线 两端节点具有重复度k
3)分段Bezier曲线 节点适量中两端节点具有重复度k,所有内点重复度为k-1
4)非均匀B样条曲线
de Castljau算法
3.3.2 B样条曲线的性质
1.局部性,P(t)最多和k个控制点有关
2.连续性
3.凸包性
4.变差缩减性
5.几何不变性
6.仿射不变性
B样条优于Bezier曲线之处:
与控制多边形的外观更接近,局部修改能力强,可以绘制任意形状,易于拼接,阶次低,计算简便
de Boor 算法!
3.6 形体在计算机内的表示
实体模型表示方法:分解表示,构造表示和边界表示
用八叉树表示形体
优点:形体表示的数据结构简单,简化了形体的集合运算,分析算法适合并行处理
3.9 三角网格
相比于点云表达 网格表达 支持真实感图形学绘制
半边数据结构 half-edge
半边结构每个顶点至少需要保存两部分信息:1.顶点的几何信息 2.从这个顶点出发的半边
1.是顶点的坐标 2.该半边的源顶点,统一三角形内下一个半边,同属一条边的对边,所属的面即三角形
3.9.4网格简化p118
减少一个网格的面片数量同时仍能表达原三维模型的过程
三种基本化简操作:
(1)顶点删除操作
(2)边压缩操作
(3)面片压缩
计算操作误差(权值:两条边的二面角,角度约小越易失)
将每个基本元素的权值按递增排序,每次取队首操作,并更新改变了的权值再插入队列中,直到满足需要
3.9.5 网格细分p120
1.增加顶点 Loop细分,在每条边上都加一个点,使得顶点数变成原来的4倍
2.顶点位置跳转
流水线Graphics Pipeline
输入 3D space的顶点 -> vector stream -> Triangle Stream(Rasterization光栅化) -> Fragment Stream(Z-buffer) -> Shaded Fragments(绘制,如明暗处理)
顶点着色器 像素着色器
第四章 真实感图形学
颜色3个特性:色调、饱和度、亮度
RBG
CMY印刷
HSV面向用户
4.3简单光照模型
4.3.2 phong 光照明模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MulZQLk-1640513327831)(C:\Users\自嘲丶\AppData\Roaming\Typora\typora-user-images\image-20211225172049861.png)]
1.理想漫反射 diffusion reflection
Id = Ip* Kd*cos(θ) cos(θ) = L * N
2.镜面反射光 specular reflection
Is = Ip* Ks* cos^n(α) ,cos α = R* V
3.环境光 ambient
Ie = Ia * Ka
4.phone光照明模型
I = Ia * Ka + Ip* Kd*cos(θ) + Ip * Ks cos^n(α)
有时候 H* N 近似 R* V
4.3.3 增量式光照明模型
1.双线性光强插值 Gouraud 明暗处理
基本算法描述:
(1)先计算多边形顶点的平均法向
(2)用phong光照明模型计算顶点的平均光强
(3)插值计算离散边的各点光强
(4)插值计算多边形内域中各点的光强
先计算顶点处的平均光强,再通过线性插值计算其他各点光强
缺点:没有镜面反射 优点::能有效的显示漫反射效果,计算量小,图形光滑
2.双线性法向插值 phong明暗处理的特点
(1)保留双线性插值,对多边形边上的点和内域各点采用增量法
(2)对顶点的法向量进行插值,而顶点的法向量用相邻多边形的法向量的平均值得到
(3)插值得到的法向量,计算各个像素的光亮度
(4)假定光源和视点在无穷远处,光强只是法向量的函数
1.先对顶点的法向量进行插值,再通过插值得到的法向量计算每个像素的光亮度
特点:可以产生正确的高光区域,但计算量大
4.7 整体光照明模型
4.7.1 光线跟踪算法
跟踪镜面反射和折射
算法 p150-151
RayTracing(start,direction,weight,color)
{
if(weight < minWeight)
color = black;
else
{
计算光线与所有物体交点中离start最近的点;
if(没有交点)
color = black;
else
{
I1 = 在交点出用局部光照明模型计算的光强
计算反射反向R
RayTracing(最近的交点,R,weight*wr,Ir)
计算折射方向T
RayTracing(最近的交点,T,weight*wt,It)
color = I1 + KsIr + KtIt
}
}
}
光线跟踪算法的加速
包围盒技术 AABB p154
OBB定向包围盒,能旋转的AABB包围盒(利用PCA,得到正交向量,之后坐标转换,计算AABB,再转化回来)
属于空间剖分技术的光线跟踪加速方法:三维DDA,空间八叉树
附录A
A.3 齐次坐标
(x1,x2,…,xn)->(x1,x2,…,xn,h)
h=1表示点,h=0表示一个点沿着直线到无穷远过程
附录B 图形的几何变换p207
C.5 透视投影 p214-215
体光照明模型
4.7.1 光线跟踪算法
跟踪镜面反射和折射
算法 p150-151
RayTracing(start,direction,weight,color)
{
if(weight < minWeight)
color = black;
else
{
计算光线与所有物体交点中离start最近的点;
if(没有交点)
color = black;
else
{
I1 = 在交点出用局部光照明模型计算的光强
计算反射反向R
RayTracing(最近的交点,R,weight*wr,Ir)
计算折射方向T
RayTracing(最近的交点,T,weight*wt,It)
color = I1 + KsIr + KtIt
}
}
}
光线跟踪算法的加速
包围盒技术 AABB p154
OBB定向包围盒,能旋转的AABB包围盒(利用PCA,得到正交向量,之后坐标转换,计算AABB,再转化回来)
属于空间剖分技术的光线跟踪加速方法:三维DDA,空间八叉树
附录A
A.3 齐次坐标
(x1,x2,…,xn)->(x1,x2,…,xn,h)
h=1表示点,h=0表示一个点沿着直线到无穷远过程
附录B 图形的几何变换p207
C.5 透视投影 p214-215