高级计算机图形学笔记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-03ryXxuU-1576743462382)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191215144426468.png)]

长安大学-柳有权老师讲授

文章目录

3D

Geometry Representation几何表示

Topological information(拓扑信息)

Geometrical information (几何信息 )

  • Position位置坐标
  • Normal法向

Appearance information(外观信息)

  • Material and texture (物体表面的材质和纹理)

其他

  • Mass质量
  • Density密度

3D对象表示

~Raw data 、
Point cloud点云、Range image深度图像Polygon soup多边形集合
~Solids
Voxels体素、BSP tree、Cell complex细胞复合体
~Surfaces
Mesh网格、Subdivision细分、Parametric参数、Implicit 隐式
~High-level structures
CSG、Constrained blocks、Generative model、Skeleton、 Sweep、Scene graph
(构造实体几何、约束块、生成模型、骨架、扫描、场景图)

CG中的3D模型

  • Wire frame model(线框模型)

    • 只有顶点和边,无表面信息
    • 优势:简单好画
      劣势:很难产生现实的结果,很难避免歧义。
  • Surface model (表面模型)

    • 将物体表示为一系列面片

    • Polygon surfaces:用一系列多边形面片来表达物体的表面

    • 多边形性质

      • 简单多边形、凹凸性、有孔多边形、退化多边形(Non single +多边形面退化为线)
        • GOOD
          同一平面内、单一、简单、无洞、凸;
          只有一个法向、易于判断内外、快速三角化、快速填充和绘制
    • 边界表示法(B-Rep)
      通过描述实体的边界顶点、边、面来表示一个实体的方法。

      扫描二维码关注公众号,回复: 9447073 查看本文章

      点至少和三个面(或三条边)邻接,不允许存在孤立点
      边只有两个邻面,不允许存在悬边

    面是形体表面的一部分,不允许存在悬面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ttcU96Jp-1576743462385)(…/…/md_files/photo_file/1573995322310.png)]

    1. 几何信息
      顶点、棱边、表面的大小、尺寸、位置、形状
    2. 拓扑信息
      点、线、面的连接关系
    • 曲面建模

      • Parametric surfaces (参数化曲面) :Q(u) = (X(u), Y(u), Z(u))
        • Beziér 曲线,由一系列控制点来决定的曲线。16个控制点定义一张Beziér曲面片。
        • 犹他茶壶,改变控制顶点可改变曲面形状。
      • Implicit surfaces (隐式曲面):f (x, y, z) = 0
        • 元球造型技术
    • 曲面建模和多边形建模的对比!

      • 多边形建模:简单灵活(只有一个法向、易于判断内外、快速三角化、快速填充和绘制
      • 曲面片建模:参数化曲面保持表面的连续性变形控制方便=改变控制点可修改曲面形状
  • Solid model (实体模型)

    • 体素构造法 (Constructive Solid Geometry, CSG,构造实体几何)

      • “实体”(solid) ==三维欧拉空间中的正则三维点集:
        r·X = k·i·X(点集X,正则化算子r,k和i为点集的闭包和内部)
        iX是X的全体内点组成的集合
    • CSG树

      叶子结点:基本体素。中间结点: 几何变换;集合操作。根结点:最终构造的物体。
      优点:形象直观,易于理解;物理属性易于计算,如体积、质量
      缺点:不利于用“面片绘制”的方式进行快速绘制;复杂的自然物体很难采用CSG方法来构建。

  • Sweep Representations(推移表示

    • Translational sweep (平移式)
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSqxqGtH-1576743462385)(G:\md_files\photo_file\1573998122812.png)]

    • Rotational sweep (旋转式)
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPQbVpP8-1576743462386)(G:\md_files\photo_file\1573998141689.png)]

    • General sweep (广义式)
      sweep 路径可以是任意曲 线,截面的形状和大小可以沿着路径而发生变 化,最终生成三维物体。

    • 最常见的方法:三角网格法
      图形的目标是什么?-给定3D场景和摄像机位置,生成(渲染)2D图像。
      3D场景的数据结构/表示是什么?
      用于简单的图元,如球体、立方体……在复杂模型中,通常使用三角形网格或参数曲线/曲面

      • 包含一系列的面F和点V:
        e.g.
        f1 --(v1,v2,v3 ), f2 --(v4,v5,v6 ), f3 --(v7,v8,v9 ), …
    • 采用空间划分的表示方法(Space- partitioning)—八叉树表示法 (Octrees)

可视化方法

  • 扫描线绘制
    光线跟踪
    辐射度
    体绘制

第三章 Transformation

  • Geometric transformation in 3D space
  • Projection(投射
  • Clipping(裁剪
  • Transformation from window to viewport(从窗口到视图的转换

Geometric Transformation

Translation(平移)
Scaling(放缩)
Rotation(旋转)
Homogeneous Coordinates(齐次坐标)
Global transformation and local Transformation(全局/局部变换

Translation(平移)

​ Point P(x, y, z) translate to P’(x’, y’, z’) by the distance T(Δx, Δy, Δz)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLkdbNHv-1576743462386)(…/…/md_files/photo_file/image-20191125100829008.png)]

Scaling(放缩)

  1. 原点放缩

    Point P(x, y, z) is scaled to get the point P’(x’, y’, z’)
    x’ = x * Sx,y’ = y * Sy,z’ = z * Sz,最终为:P’ = P * S

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4di3e93-1576743462386)(…/…/md_files/photo_file/image-20191125101205108.png)]

  2. 定点放缩

    – Translate (-xp, -yp, -zp) 平移
    – Scaling with (Sx, Sy, Sz) 缩放
    – Translate (xp, yp, zp) 平移

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zppbyDCR-1576743462386)(…/…/md_files/photo_file/image-20191125101636343.png)]

Rotation(旋转)

点P相对于Z轴旋转α角度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cIhJKU6W-1576743462386)(…/…/md_files/photo_file/image-20191125101851946.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wRaFrCH3-1576743462386)(…/…/md_files/photo_file/image-20191125102007409.png)]

​ 相对于哪个轴旋转,该矩阵的行对应位为1,该行其余为0.

为什么要把各种变换表示成矩阵运算的形式?

​ – 因为可将连续变换组合成一个矩阵运算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pik1IYxq-1576743462388)(…/…/md_files/photo_file/image-20191125102347235.png)]

参考博客:https://blog.csdn.net/ningxuanyu5854/article/details/101905295

左乘: 坐标系不动,点动,则左乘。
【若绕静坐标系(世界坐标系)旋转,则左乘,也是变换矩阵乘坐标矩阵;】
右乘: 点不动,坐标系动,则右乘。
【若是绕动坐标系旋转(自身建立一个坐标系),则右乘,也就是坐标矩阵乘变换矩阵】

全局/局部变换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLSz9x1u-1576743462388)(…/…/md_files/photo_file/image-20191125105015278.png)]

  • Global transformation
    – 每一次变换均可以看成是**相对于原始坐标系**执行的
    – 后调用的变换矩阵乘在先前矩阵的左边(后调用的在左边
    – 先调用的变换矩阵先执行(先调用的先执行
  • Local transformation
    – 每一次变换均可以看成是在**上一次变换所形成的新的坐标系**中进行
    – 后调用的变换矩阵乘在先前矩阵的右边(后调用的在右边
    – 后调用的变换矩阵先执行(后调用的先执行

局部变换可以通过逆全局变换的相乘顺序来实现

先平移10,再旋转45度。M1是全局变换矩阵,M2是局部变换矩阵。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yRYM7SXD-1576743462388)(…/…/md_files/photo_file/image-20191125105151305.png)]

法向的转换

曲面法线:局部垂直于曲面的单位向量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cjs4Pw7H-1576743462389)(…/…/md_files/photo_file/image-20191125105742333.png)]

法向常常用来制造阴影,使得物体看起来更3D一些。

各种光照模型利用表面法线进行光照计算。

  • 对法向的切平面进行转换,而不是直接对法向量直接操作。
  • 选择切平面的任一向量V(os)进行转换:V(ws) = M · V(os)

切平面的向量V(os)是垂直于法向量的。

第四章 渲染流水线

  • 基本的固定管道

    Model view模型视图
    Projection 投影
    Rasterization 光栅化
    Framebuffer 帧缓冲区

Projection

Projection:3D --> 2D

(x, y, z) --> (wx, wy)

在投影时,每个像素的深度都要记录下来。这个深度值在“可见性表面检测( visible surface detection” )”时很有用。

Perspective projection(透视投影)

投影中心与投影平面之间的距离为有限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aRCkXYlK-1576743462389)(…/…/md_files/photo_file/image-20191127192920859.png)]

Parallel projection(平行投影)

投影中心与投影平面之间的距离为无限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6VG4naS-1576743462389)(…/…/md_files/photo_file/image-20191127192940688.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6R77Fvzl-1576743462389)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202211631676.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iiIN56lW-1576743462389)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202211645899.png)]

Clipping

Point clipping (点的裁减)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4KAqBF7Q-1576743462389)(…/…/md_files/photo_file/image-20191127194643679.png)]

Line clipping (线的裁减)

1.确定直线是完全可见;
2.部分可见;
3.还是完全不可见;

Cohen-Sutherland line clipping algorithm
Mid-point partition algorithm(中点分割算法)

线与裁剪窗口之间的关系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPMLdmz9-1576743462390)(…/…/md_files/photo_file/image-20191127194826023.png)]

  1. 完全在内部。
  2. 完全在外部。
  3. 其他。

方法一:

Cohen-Sutherland直线裁剪算法,也叫作编码算法。
Binary Region Codes:

从左往右:依次为第1位–第4位。
第1位:1,位于窗口的左边;0,其它
第2位:1,位于窗口的右边;0,其它
第3位:1,位于窗口的下方;0,其它
第4位:1,位于窗口的上方;0,其它

img

  • 两条线段的端点的区域编码都为0,则二者“或”运算=0,说明二条线段都在窗口内。简取之。
  • 若都不为0(逻辑与操作的结果不是全0),则均在窗口外的同一侧,或左方、右方、上方、下方。简弃之。
  • 若不满足简取,也不满足简弃,则线段与窗口进行“求交”判断

方法二:

Mid-point partition algorithm :中点分割裁剪法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlzPaBJU-1576743462390)(…/…/md_files/photo_file/image-20191127215042461.png)]

从P0出发找出离P0最近的可见点(A点),和从P1点出发找出离P1最近的可见点(B点)。则AB即为裁减后的线段。中点分割直线段裁剪算法对Cohen-Sutherland直线裁剪算法的第3种情况做了改进, 用中点分割的方法求出线段与窗口的交点。A、B分别为距P0 、 P1最近的可见点,Pm为P0P1中点。

从P0出发找出离P0最近的可见

  1. 先求出P0P1的中点Pm
  2. 若P0Pm不是显然不可见的,并且P0P1在窗口中有可见部分,则距P0最近的可见点一定落在P0Pm上,所以用P0Pm代替P0P1;
  3. 否则(P0Pm显然不可见)取PmP1代替P0P1。
  4. 再对新的P0P1求中点Pm。重复上述过程,直到PmP1长度小于给定的控制常数ε为止,此时Pm收敛于交点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKhhPy5c-1576743462391)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202213148296.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCybwHiw-1576743462391)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202213157584.png)]

ε可取一个像素的宽度。对分辩率为2N*2N的显示器,上述二分过程至多进行N+1次。主要过程只用到加法和除法运算,适合硬件实现,它可以用左右移位来代替乘除法,这样就大大加快了速度。

Polygon clipping (多边形的裁减)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSdfV2ro-1576743462391)(…/…/md_files/photo_file/image-20191128163434702.png)]

Sutherland-Hodgman polygon clipping

  1. 一次用窗口的一条边来裁剪多边形

  2. 窗口的任意一条边的所在直线(裁剪线)把窗口所在平面分成两部分:

    可见一侧:包含窗口那部分

    不可见一侧:不包含窗口那部分

将每条线段的端点S, P与裁剪线比较之后,可以输出0~2个点:

(1) S, P都在可见一侧,输出顶点P。

(2) S, P都在不可见一侧,输出0个顶点。

(3) S在可见一侧,P在不可见一侧,输出SP与裁剪线的交点I。

(4) S在不可见一侧,P在可见一侧,输出SP与裁剪线的交点I和顶点P。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZ7e42ZS-1576743462391)(…/…/md_files/photo_file/20190602190235493.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0creUiE-1576743462391)(…/…/md_files/photo_file/image-20191128164707090.png)]

如右侧图,线段P1P2,保留末端点P2;下面左图,保留线段和窗口的交点P1’;下面右图,不保留。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bM7YWMyP-1576743462392)(…/…/md_files/photo_file/image-20191128164737875.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdToD7QI-1576743462392)(…/…/md_files/photo_file/image-20191128164831861.png)]

2D裁剪算法 扩展 到3D

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVzmee2X-1576743462393)(…/…/md_files/photo_file/image-20191128170519173.png)]

平行投影中,视角是由x=0,x=1,y=0,y=1,z=0,z=1六个平面组成的截体。
视角投影中,视角是由x=z,x=-z,y=z,y=-z,z=z(min)和z=1六个平面组成的截体。

从Window到Viewport的变换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJvuPO1d-1576743462393)(G:%5C1%E7%A0%94%E7%A9%B6%E7%94%9F%E8%AF%BE%E5%A0%82%E6%96%87%E4%BB%B6%5C%E9%AB%98%E7%BA%A7%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6%5Cimage-20191128171948324.png)]

上式中,坐标Y的计算存在问题。(yw-WYB) / (WYT - WYB)

X-左边界 / (X右边界 - X左边界)

在归一化空间(window)中保持与视图空间(viewing coordinates)中相同的相对比例。

第五章 光栅化过程

多边形的扫描转换:主要是通过确定穿越区域的扫描线的覆盖区间来填充,区域填充是从给定的位置开始涂描直到指定的边界条件为止.

区域填充:第一步先确定需要填充哪些象素;第二步确定用什么颜色值来填充.

扫描线转换和区域填充

  • 多边形填充

    顶点边缘表示(用多边形的顶点序列来刻画多边形)

    —转换为—>

    像素集表示(也叫点阵表示,用位于多边形内的像素集合来刻画多边形)

    扫描转换、区域填充

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BmbfTumQ-1576743462393)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201202616147.png)]

    从点到与多边形边相交的点的箭头;如果扫描线和多边形图形的相交点为奇数,则该点位于多边形内;如果是偶数,则位于多边形外。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFCkeBbz-1576743462393)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201210425960.png)]

多边形填充的步骤:

(1)求交:计算扫描线与多边形各边的交点;
(2)排序:把所有交点按递增顺序进行排列;
(3)交点配对:第一个与第二个,第三个与第四个等等.每对交点就代表扫描线与多边形的个相交区间;
(4)区间填色:把这些相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色.

  • 当扫描线与多边形顶点相交时,交点的取舍问题:

在第一种情况,共享顶点的两条边分别落在扫描线的两边。这时,交点只算一个。

在第二种情况,共享交点的两条边在扫描线的同一边,这时交点作为零个或两个,取决于该点是多边形的局部最高点还是局部最低点。

  • 多边形边界上象素的取舍问题

规定落在右/上边界的象素不予填充,而落在左/下边界的象素予以填充。

按照最大区域的多边形进行填充。

Scan-line polygon-fill algorithm

  • 充分利用像素的相关特性
  • 三个相关性质
    • Area coherence (区域的连贯性)
    • Scan-line coherence (扫描线的连贯性)
    • Edge coherence (边的连贯性)

区域一致性

两条扫描线之间的屏幕区域被多边形分割为梯形

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6Jw9dlX-1576743462393)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201212605809.png)]

(1)梯形分为多边形内梯形和多边形外梯形。

(2)两种梯形交错布置。

扫描线一致性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZ0FDBB8-1576743462394)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201213231604.png)]

n是偶数;扫描线上,只有段(Xei,Xei+1)在多边形内部,i=1,3,5,7,9

扫描线相干性是区域相干性在扫描线上的反映。

边的一致性

假设扫描线y=e、y=e-1上的交点序列分别为上、下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHAL6odw-1576743462395)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201214133749.png)]

如果边PiPj与扫描线y=e和y=e-1相交;对应点Xd和Xe的对应关系有:Xe= Xd十1 / m。

因此,计算y=e与y = e-1的交点:
(1)计算与y=e-1 andy=e相交的边的交点。
(2)计算只与y=e相交的边上的点。

边缘相干是区域相干在边缘上的反映。

奇点

当扫描线与多边形P的交点是P的顶点时,则称该交点为奇点。

  • 如果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RuBcM9V-1576743462395)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201214717931.png)],则该点为局部极值点;否则,为非极值点。
  • 规定:奇点是极值点时,该点按两个交点计算;否则按一个交点计算。
  • 预处理非极值点:边缘端点的y坐标增加1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6TcccyQo-1576743462395)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202194641918.png)]

区域填充

多边形填充算法按扫描线顺序进行。

种子填充算法则采用不同的原理:假设在多边形区域内都有一象素已知,由此出发找到区域内的所有象素。(区域边界和边界外的像素具备某个特定值,但是区域内部的像素均不取这个特征值)

从给定的内部位置(种子)开始,从该点向外绘制,直到遇到指定的边界条件。这个区域应使用其内部颜色或边界颜色进行标识。

  • 将所有内部像素着色为指定颜色=内点表示法
  • 将所有边界像素着色为边界颜色=边界表示法

种子填充

邻点属性:四连通、八连通

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nzddjAZM-1576743462395)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202201018867.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cc7S4POm-1576743462396)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201215423951.png)]

四连通区域的边界为八连通区域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yp4zQVJQ-1576743462397)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201215741378.png)]

八连通区域的边界必须是四连通的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYiIyNhN-1576743462397)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191201215749563.png)]

扫描线转换和区域填充的比较:

  • 基本思想不同
    多边形的扫描转换:将多边形的顶点表示转换成点阵表示。在扫描转换过程中利用了多边形各种形式的连贯性。顶点表示:用多边形的顶点序列来描述,由于未指出哪些像素在多边形内,所以不能直接进行填充。点阵表示:用多边形覆盖的像素点集来描述该多边形,但是缺少几何信息。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h1vQPF6H-1576743462397)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202192746959.png)]
    区域填充:只改变区域的颜色,不改变区域的表示方法。在填充过程中利用了区域的连通性

  • 算法的要求不同
    在区域填充中要求指定区域内的一点为种子点,然后从这点开始对区域进行着色。
    对多边形的扫描转换没有这个要求。

  • 对边界的要求不同
    在多边形的扫描转换中要求每- -条扫描线与多边形边界的交点个数是偶数。
    在区域填充中要求4连通区域的边界为封闭的8连通区域,而8连通区域的边界为封闭的4连通区域。

反走样、反混淆

光栅图形的走样问题

走样:低频采样(欠采样)引起的信息失真

用离散的量来表示连续的量所引起的失真称为走样。用来减少或消除走样的技术称为反走样。

锯齿状边界

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrgCbJyt-1576743462398)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202201509308.png)]

变形

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSeQTvJP-1576743462398)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202201739371.png)]

细小图形失真:像素尺度的限制使得细小图形无法得到正确显示。如图长方形被显示成线。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkDsXhkz-1576743462398)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202201929347.png)]

超薄图元丢失

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6XZkAAY7-1576743462398)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202202030716.png)]

图形闪烁:显示器的隔行扫描机制决定的,现在的显示器一般都是逐行扫描机制,图形运动时才有闪烁现象。

反走样方法:

Adopting area-sampling instead of point sampling(用面积采样代替点采样)
Supersampling(过采样、超采样)

硬件方法:采用高分辨率光栅显示
软件方法:以高分辨率采样对象并以低分辨率显示结果

高分辨率采样:将每个像素划分为若干个子像素,如3*3分区。然后计算所有子像素的颜色
低分辨率显示:用加权掩模将像素的所有子像素颜色相加,计算像素的颜色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1TghImak-1576743462398)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191202202854832.png)]

USing transitional color scales on the edges(在边缘使用过渡色阶)

  • 精确采样算法:

Wu’s algorithm for drawing antialiasing lines (绘制抗锯齿线

Pitteway and Watkinson’s algorithm for drawing antialiasing polygons(绘制抗锯齿多边形

可见性判断

目的:消除二义性、提高绘制效率。

判别可见面

Back- Face Detection(后向面判别)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MCjLYit-1576743462401)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211151224121.png)]

多边形面法向量N(A,B,C),视线向量V,世界坐标系。若V·N>0,则为后向面,视角θ。

计算题—Visible-Surface detection methods(可见表面检测)

Ray Casting Method(光线投射法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PAf97lxb-1576743462402)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211151655422.png)]

1.通过视点和投影平面(显示屏幕)上的所有象素点作一入射线,形成投影线

2.将任一投影线与场景中的所有多边形求交。

3.若有交点,则将所有交点按z值的大小进行排序,取出最近交点所属多边形的颜色;
若没有交点,则取出背景的颜色

4.将该射线穿过的象素点置为取出的颜色。

Z-buffer method

深度缓冲区(Z缓冲区)、刷新缓冲区。实质:对给定的x,y,寻找最小的z(x,y)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-43tQn23w-1576743462402)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211151940713.png)]

​ 在把显示对象的每个面上的颜色值填入帧缓冲器前,该点Z坐标值与Z缓冲器相应单元进行比较。
当Z坐标值 > Z缓冲器值时,用前者替换后者,同时修改缓冲器中的值修改为该点Z坐标值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FX7mZ2pF-1576743462402)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211152351899.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKnhFi2e-1576743462402)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211152505901.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HY4vpEpt-1576743462403)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211152523977.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTcEbOxY-1576743462403)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211152546010.png)]

离得越近,值越大,这个值是根据Z轴来计算得到的。

优点:取代方法优于总体排序,有利于硬件实现。缺点:占用空间大,没有利用图形的相关性与连续性。

  • 如何降低存储需求?

一次处理屏幕的一个部分,
一次处理屏幕的一个扫描行——Scan-Line z-buffer 方法

Area- Subdivision method(区域子分算法

它是通过将整个观察区域分成越来越小的矩形来应用的,直到每个小区域是单个可见表面的一部分或根本没有表面的投影。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lIb5J4t-1576743462404)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211153334587.png)]

在细分窗口的过程中,需要不断判断子窗口与多边形的关系。共有四种可能的关系:
多边形包围了窗口( surrounding)
多边形和窗口相交( overlapping)
窗口包围了多边形(inside)
窗口和多边形分离(outside)

(1)如果窗口内没有物体则按背景色显示

(2)若窗口内只有一个面,则把该面显示出来

(3)否则,窗口内含有两个以上的面,则把窗口等分成四个子窗口。对每个小窗口再做上述同样的处理。
这样反复地进行下去

分辨率为2N*2N的窗口,经过N次细分就可以使子窗口和一个像素的大小一样了。
1024 X 1024的窗口,经过10次细分即可。

Depth Sorting Method(深度排序算法)

油画家算法

算法原理:若场景中任何多边形在深度上均不贯穿或循环遮挡,则各多边形的优先级顺序可完全确定,

深度排序算法:

  1. 先根据每个多边形顶点z坐标的极小值z的大小把多边形做一个初步的排序。
  2. 设Zmin:最小的多边形是P,它暂时成为优先级最低的一个多边形,把多边形序列中其他多边形记为Q
  3. 依次检查P和其他各个多边形的关系
    若能确定P不遮挡某个多边形Q,则继续向下判断
    若不能确定P不遮挡某个多边形Q,则在多边形序列中把尸和Q交换一下次序,并对交换后的序列中优先级最低的多边形Q检查,看Q是否遮挡别的多边形
  4. 找到优先级最低的多边形后,可画之。然后对剩下的多边形重复此过程

光照模型

物体表面呈现的颜色是由表面向视线方向辐射的光能决定的。光能大小,决定亮度光谱分布,决定颜色
RGB三原色。

光照明模型:计算景物表面上任一点投向观察者眼中的光亮度的大小和色彩组成的公式

光是三种成分的结合:

漫反射、镜面反射、环境光。

漫反射

由粗糙或颗粒表面会将反射光向各个方向散出去而形成。

垂直于入射光方向的表面会获取到更多的光照明,比起与入射光方向成斜角的等大小的表面。

朗伯余弦定律:
对于一个漫反射体,表面的反射光亮度和光源入射角(入射光线和表面法向量的夹角)的余弦成正比。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJDsomap-1576743462405)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211162928096.png)]

环境光 +漫反射:I = Ka·Ia + Kd·I(l)·(NL)

环境光反射系数Ka,环境光强度Ia,漫散射系数Kd,单位光源方向向量L,表面位置单位法向量N。

镜面反射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RGH5q9K1-1576743462405)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211165758232.png)]

Illumination model(光照明模型)

Ambient环境 + Diffuse漫反射 + Specular镜面反射。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHfN1Afr-1576743462405)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211164735456.png)]

环境光反射系数Ka,环境光强度Ia,漫散射系数Kd,单位光源方向向量L,表面位置单位法向量N。

I(l)是入射光的强度。

R表示一个理想镜面反射方向的单位向量;L表示指向点光源的单位向量;V为指向视点的单位向量;角度φ是观察方向与镜面反射方向R之间的夹角。

Phong模型,分别计算RGB分量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYBXD2X1-1576743462405)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211170024134.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9E0PVKb6-1576743462406)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191211170038277.png)]

纹理映射

为什么我们需要纹理?

  1. 表面细节的建模是渲染真实图像最重要的任务之一。

例如,如果我们想对砖墙建模,一个选择是:使用大量具有适当表面颜色和反射特性的多边形来建模表面细节

什么是纹理?

一个近似真实的砖墙,称为纹理的图像。纹理应用到物体表面的过程称为texture mapping(纹理映射)或texturing(贴纹理)

纹理解决的问题:

  1. 将曲面表示为纹理图形。避免了几何和材质细节的建模。
  2. 渲染一个墙砖 / 纹理,通过光线跟踪或者硬件来完成。节省了时间和资源。

纹理

  1. texture acquisition获取:手工绘制、拍照、procedure texture过程纹理、texture synthesis纹理合成
  2. texture mapping贴图:给定纹理图像和3D模型,通过指定每个顶点一个纹理坐标来指定纹理图像的颜色。
  3. texture filtering滤波:在决定如何进行贴图后,需要在渲染过程中进行纹理采样,否则形成不必要的痕迹。

过程纹理:

柏林噪声:Perlin Noise Perlin 2002,其基本思想是简单和优雅。

白噪声white noise:是一种信号(在所有的频段都有均匀的分布!),白噪声的傅里叶变换是将其进行平坦化。可以通过一个随机函数来生成!

柏林噪声:是一个带限函数,它可以被构造为不同频段的白噪声之和,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaruEOhr-1576743462406)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191215153721757.png)]

n为频带总数,p为持久性,i为频带数,i=0为最低频带

频带i处的白噪声携带有特定的图形尺寸2^i。不同的波段有不同的大小,我们需要在求和之前在它们之间进行插值interpolate。持久性Persistence是用户指定的参数[ 0 ~ 1 ],它只控制不同频带的相对权重。

在柏林噪声的基础之上,可以合成大理石和木材的纹理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTDZUSno-1576743462406)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191215153529989.png)]

纹理合成

Pixel-based texture synthesis 。基于像素的

Patch-based texture synthesis。基于面片的

基于像素的纹理合成:
该方法中每个像素的值由其局部邻域来决定,从相似临近的区域选择要输入的像素。

基于片的纹理合成:
基于像素的方法可以通过合成块来改进。重要算法:图像切割。片的选择也是根据相匹配的邻居来进行的。

纹理贴图

给定模型和一个2D纹理图像。
通过表面映射函数(surface mapping function),将该图像上的点映射到模型上的(u,v)坐标处。
在对模型上的一个点进行着色时,将从2D纹理中找到一个合适的像素并以此来生成最终的颜色。

如何定义一个表面映射函数?

通过自然参数化规则对象。如球体,立方体,圆柱

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIoq4jKY-1576743462406)(G:%5Cmd_files%5Cphoto_file%5Cimage-20191215160949482.png)]

通过手动指定纹理坐标。复杂物体的每个顶点都被指定为纹理坐标

纹理过滤

Aliasing(走样) and anti- aliasing(反走样

方法一:设置较高的采样频率。
方法二:将信号预滤波设置成低频信号。

Isotropic(各向同性) filltering

Mipmapping:构建一个金字塔形的图像,在原始图像的1/2、1/4、1/8等位置进行预过滤和重新采样。

Anisotropic(各向异性) Filtering

通过预计算各向异性滤波建立 ripmap 代替 mipmap 。

三种纹理

  • Solid textures 体纹理
    3D纹理数组(用函数[xyz] -> [RGB] 将颜色映射为点。
    纹理比颜色更重要。
  • Bump mapping 凹凸纹理
    使用纹理来改变表面的法线,不会改变表面的实际形状,只是阴影。
  • Displacement mapping 位移纹理
    使用位移纹理来实际移动表面的点
发布了92 篇原创文章 · 获赞 23 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Pit3369/article/details/103616560