Lecture 01 Overview of Computer Graphics

What is Computer Graphics?

图形学在动画,电影,游戏,设计,可视化,VR,数字插画,模拟,GUI,字体等领域均有应用

最难做的往往是日常生活中最常见的东西

Why Study Cmputer Graphics?

  • Fundamental Intellectual Challenges
  • Technical Challengs
  • Forget about the previous reasons
    **Computer Graphics is AWESOME! **

Course Topics

Rasterization(光栅化)

光栅化:把三维空间的几何形体显示在屏幕上

Curves and Meshes

Ray Tracing(光线追踪)

慢,但能达到好的效果

Animation/Simulation

games101 is NOT about

  • Using OpenGL/DirectX/Vulkan
  • The syntax of Shaders
  • We Learn Graphics, not Graphics APIs!
  • After this course you’ll be able to learn these by yourself
  • 3D modeling and GameEngine
  • Computer Vision/Deep Learning

Course Logistics

General Information

//关于课程网站,教学资料什么的
推荐书籍:Fundamentals of Computer Graphics(虎书)

Use An IDE!

Lecture 02 Review of Linear Algebra

Graphics’ Dependencies

  • Basic mathematics
  • Basic physics
  • Misc:Signal processing/Numerical analysis
  • A bit of Aesthetics

//讲了一些简单的线性代数,我酌情跳过了一些

点乘可以计算两个向量的夹角,接近程度
如果有a·b,则b-bcos(a,b)与bcos(a,b)垂直

本课的叉乘用的是右手系

叉乘可以判定左右,内外

Lecture 03 Transformation

2D transformations

Sclale

对角阵可以作为缩放变换矩阵

reflection matrix

eg.
horizontal reflection: x‘ = -x,y’ = y

Shear matrix

运用特定种类的矩阵发生的变换

04BD1869807CA9F444AF462AFE52666C

Rotate

A4107D0F86D9E2895F4D04CEDFDBE16C

Homogeneous coorinates

关于平移变换:
当我们想到平移变换的表示,直观的想法是(x,y)+(a,b),但这种表示法不能用矩阵乘向量的形式表示,所以我们要引入齐次坐标

1BA1C5FFEEE394B85E1B04D0977F2289

Affine Transformations

  • 仿射变换:线性变换和平移变换的叠加

8CD980E9146458046BB19ACAE8695723

顺序:先线性变换再平移

Inverse Transform

Composite Transform

变换的顺序非常重要,矩阵乘法没有交换律

变换应用的顺序是从右到左

Decomposing Complex Transforms

如果有一个正方形,取其一点a(x,y),绕其旋转,我们可以现将正方形移动-a,也就是将a点移动到原点,进行旋转,然后再移动a,就得到了结果

B49D8D2A4C6683BB4FB9203833E6F22F

3D Transformatios

//大概意思是和2D类似

Lecture 04 Transformation Cont

对上节课的补充:旋转矩阵的逆等于旋转矩阵的转置,都表示旋转负角度

数学上一个矩阵的逆等于它的转置,那么我们称它为正交矩阵

3D Transformatios

三维的旋转

4067C45ACFD171F666A1604882E93A5C

欧拉角

绕任意轴的旋转可以转换成绕xyz轴的复合旋转

Rodrigues’Rotation Formula

8E091BAFDB69779BF22AEE0C747F3117

Viewing transformation

View/Camera trnasformation

我们希望把三维的图形转化为二维的视图

  • What is view transformation?

    MVP变换 找到模型,改变相机的位置,方向,将三维的图形投影到摄像机

  • Defne the camera first

    Position e

    Look-at/gaze direction g

    Up direction t

  • Key observation

    如果相机和所有的东西共同运动,那么视图是保持不变的

    那么我们就可以认为,相机永远在原点,而所有的视图的变化都是物体的变换造成的

    把相机放到标准位置有好处,但也会造成一定的问题

  • Transform the camera by Mview

    So it’s located at the origin ,up at Y, look at-Z

  • Mview in math?

    Translates e to origin

    Rotates g to -Z

    Rotates t to Y

    Rotates (g 叉乘 t ) To X

64092AB3BA85812623319943D6DE8E8E

336092115DD73AE1F9B07AF3E73646DE

所以我们要对Rview矩阵求逆,还记得吗,旋转矩阵的逆就是它的转置

Projuction transformation

Orthographic projection

  • A simple way of understanding

    camera located at origin ,looking at -Z, up at Y

    Drop Z coordinate

    Translate and scale the resulting rectangle to [-1,1]^2(一个原定俗成的做法,简便之后的计算)

  • In general

226B01F32412D95F882FC24FBA172E3A

120B63F68DB8C2FA399CB94AE06B7EC0

再次确认,本课我们坚持右手系

Perspective Projection

近大远小

首先回忆一些知识

3144BE577FCD66BE07BA8ADC2067FB0A

如果k是任意的,那么k就可以是z

81170AE76F18783863D1F94E94F02411

表示正交投影,可以将远处的4点”挤”成和近处4点一样大的形状,再进行一次正交投影

9A025B96A635725DA783D319D62216D5

6625A31E66330610974DFB63614705C3

D8F4654487BB0ED1B195221D7310DFCF

此时我们需要明确:进出的点不会变化,远处的点的z也不会变化

用f表示远处点z的值

B288DD0F4F4179F365E25B3BD455AB50

Lecture 05 Rasterization 1(Triangles)

如果我们想定义一个视锥,可以只定义一个可视角度和一个宽高比

  • What after MVP?

Canonical Cube to Screen

  • What is a screen?

    an array of pixels

    Size of the array: resolution

    Atypical kind of raster display

  • Rasterize(光栅化) == drawing onto the screen

  • Defining the screen space

    认为屏幕的左下角是原点,屏幕中所有的像素用(x,y)表示

    Pixel’s indices are from (0,0)to (width-1,height-1)

    Pixel(x,y) is centered at (x+0.5,y+0.5)

    the screen covres range (0,0)to (width,height)

    我们先简单的认为像素是内部颜色均匀的小方块

Triangles-Fundamental Shape Primitives

  • Why triangles?

    Most basic polygon

    Break up other polygons

    Guaranteed to be planar

    Well-defined interior

    Well-defined method for interpolating values at vertices over triangle

Sampling a Funation

简单的光栅化做法:采样-给你一个函数,你给它不同的x,求不同的值

在光栅化的过程中,我们对像素中心进行采样,判断一个像素是否在三角形内,这里应用叉乘

We sample time(1D),area(2D),direction(2D),volume(3D)

Lecture 06 Rasterization2(Antialiasing and Z-Buffering)

在采样后,如果屏幕的像素不高,那么我们会得到一个”走样”的图形,如何抵消锯齿感的技术就是抗锯齿(反走样)

  • 一种简单的反走样方法

    对原来的图形做模糊(滤波),然后再对它进行采样

985D23E93540C0A5D903958B9F3E89E5

B977CC3D552D343757FB16288C9C8A3F

就像像素画中的人工抗锯齿,或者反过来

  • Frequency Domain

    调整cos或者sin中自变量前面的系数,我们可以得到不同频率的波

    我们可以用傅里叶级数变换将一个函数变换为另一个函数,且可逆

    任何一个函数可以用傅里叶级数展开分解

    如果我们对两种截然不同的函数用同一种采样方式采样,得到的结果可能是相同的

  • Filtering = Getting rid of certain frequency contents = Convolution (= Averaging)

  • 高通滤波:只剩下高频信息//低通滤波同理

  • 卷积定理:Convolutio in the spatiall domain is quual to multiplication in the frequency domain, and vice versa

3EDA2393C5CAC4843862B73344AA6D3A

  • Sampling = Repeating Frequency Contents

  • 反走样的办法

  1. 增加采样率。但这不是反走样要做的事情
  2. Antialiasing先做模糊,再做采样。也就是先把图像的高频信息去掉,再采样。

实际中,用反走样的近似方法(MSAA),用更多的像素点去采样

为了减少计算的像素,可以用像素不规则分布或是像素复用

  1. FXAA(Fast Approximate AA)
  2. TAA(Temporal AA):将MSAA的样本引入到时间上

Lecture 7:Shading 1(lllumination,Shading and Graphics Pipelne)

可见性:如果我们要把一堆物体放到屏幕上,一定有顺序。由远及近

画家算法:先将远处的东西做光栅化,再将近处的东西做光栅化

但有些情况相当复杂:

屏幕截图 2023-04-18 143503

此时我们无法定义图形的深度关系

Z-Buffer

Z-Buffer(深度缓存):记录像素,而不是图形的深度

在渲染时,我们既记录图形的深度,也记录像素的最近深度

屏幕截图 2023-04-18 144151

如果发现某个像素的最近深度比它的之前的图形离屏幕更近,更新这个像素的深度

屏幕截图 2023-04-18 144828

深度缓存的结果与渲染顺序没有关系

Shading

着色:The processo of applying a material to an object.

  • Shadig is Loval

着色只考虑这个点自己

Blinn-Phong refectance model

对于一个点光源,对于某个时刻发出的光,它的能量在每个时刻都应该在一个球壳上,且球壳越来越大,单位球壳的能量越来越小

FE3E7BA697FC5724E352E205A0F5FFD0

从式子可以看出,漫反射的反射方向v不记入计算.也就是说,从任何方向看到漫反射的物体,获得的能量都一样

Lecture 8 Shading2(Shading ,Pipeline and Texture Mapping)

如果物体不是那么光滑,镜面反射的方向会适当发散

当我们观察方向和镜面反射的方向接近的时候,我们就看到了高光

BED16BCB2B4771CA7B10927B4699DCC3

将环境光项,漫反射项,高光项相加,得到Blinn-Phong reflection Model

979F4FF628C7D39087C9766CCF35CB5B

Shading Frequencies(着色频率)

Flat shading:Triangle face is flat -one normal vertor , Not good for smooth surfaces

Gouraud shading :对每一个顶点着色

Phong shading : 对每一个像素着色

当几何面足够复杂的时候,可以选用较低的着色频率

如何计算顶点的法线:相邻面的法线求加权平均

Graphics Pipeline

把所有这些东西加一起,称作Graphics Pipeline

决定这个过程的代码叫shader

Shader Programs

OpenGL是图形学的API,可以用来写shader

1
2
3
4
5
6
7
8
9
10
11
12
uniform sampler 2D myTexture;
uniform vec3 lightDir;
varying vec2 uv;
varying vec3 norm;

void diffuseShader()
{
vec3 kd;
kd = texture2d(myTexture,uv);
kd*= clamp(dot(-lightDir,norm),0.0,1.0);
gl_FragColor =- vec4(kd,1.0);
}

推荐网站:shadertoy.com

Texture Mapping(纹理映射)

如何定义一个点的基本属性?

首先,把属性定义在表面上.

任何一个三维物体的表面都是二维物体

纹理,就是一张图,可以蒙在一个三维物体的表面

屏幕截图 2023-04-23 183009

怎么把一个空间的表面映射到三角形上,我们不管,假设已经有了这种映射

现在在纹理上定义坐标系(u,v),

Lecture 09 Shading(Texture Mapping Cont)

有时我们希望在三角形内部插值某种属性,得到一个平滑的过渡

完成这个操作,我们需要重心坐标

以及,我们已经知道,模型上的一个三角形映射到了纹理上的一个三角型,但三角形的内部,我们也可以用插值计算纹理映射到模型的颜色

重心坐标

定义

屏幕截图 2023-05-13 145419

在三角形平面中一点的坐标,可以用三角形三个点坐标的线性组合表示,如果αβγ都是非负的,说明重心坐标在三角形内部

αβγ可以用面积比来得出

屏幕截图 2023-05-13 145955

或者

屏幕截图 2023-05-13 150107

现在,得到了任一点的重心坐标,我们就可以使用重心坐标来计算三角形中任意一个点的插值,下图为颜色插值

image-20240408202945605

  • 重心坐标无法做到投影下不变

应用纹理

我们可以直接用纹理代替漫反射光的颜色,就相当于是将图贴在这个模型上了

至于一个片元用纹理上的哪个点,就是纹理映射的事情了

纹理的放大:如果纹理太小了怎么办

如果纹理太小,屏幕的分辨率太高,一些点会映射纹理的同一像素

Bilinear interpolation

线性插值: lerp(x,v0,v1) = v0 +x(v1-v0)

计算某一个点的水平和竖直插值

屏幕截图 2023-05-13 151627

这样我们可以得到点与点之间的平滑过渡

屏幕截图 2023-05-13 151732

如果纹理太大了会怎么样

如果纹理太大,反而会引起更严重的问题:走样

屏幕截图 2023-05-13 152153

如果纹理过大,屏幕上一个像素覆盖的纹理上的区域过大,如果此时取这个区域的平均值作为屏幕上像素的值,走样就出现了

在这个情况下走样的原因:在一个像素内的采样频率较低

解决办法:避免采样
如果我们可以立刻知道一个区域内的平均值,而不使用采样,就可以避免低频采样的问题

Range Query

60738D6222540D2170EA2E483E60CB4C

不同的物体有不同的像素覆盖的大小,此时我们就需要范围查询

Mipmap

0499D67A647BD5360F6114BA24F24F54

Mipmap允许近似的正方形的范围查询
我们拿到了一个纹理之后,先生成纹理里的mipmap,也就是分别生成它在不同大小下(不同层)的复制体

使用mipmap

CF1C90898372624B88F55FE95832E02C

任何一个像素都一个纹理上的区域,那么我们也能知道一个像素映射的纹理区域占的长度,也就是区域的大小
这样我们就可以动态的查询一个物体所需的mipmap的层数
如果一个像素映射的区域不大不小,我们又可以在两个mipmap层间插值(Trilinear Interpolation)

Mipmap的问题

41289D69433B2B776AB2560A90A7369B

mipmap会使远处的东西糊掉,也就是(overblur)

一个部分解决三线性插值的问题:各向异性过滤
屏幕上的像素映射到纹理上,不一定是一个规则的区域,使用各向异性过滤,以允许我们在一个矩形区域上查询,但不能完全解决其他形状的问题

43D0AB7074CD1617FD699E78CB3EF328

Lecture 10:Geometry 1(Intrdouction)

环境光照(Environment Map):如果我们可以把各个方向进入人眼的光记录下来,这就是环境光照

Spherical Environment Map:我们可以假设我们有一个光滑的球,那么我们就可以用这个球记录环境光

屏幕截图 2023-05-17 085254

但Spherical Map有一些问题,当球记录靠近地球极点位置的环境光,展开后会出现画面扭曲

屏幕截图 2023-05-17 085355

解决方案,我们可以用一个立方体记录环境光

屏幕截图 2023-05-17 085606

屏幕截图 2023-05-17 085549

纹理可以应用于凹凸贴图

我们可以定义在一个表面上,每一个点的相对高度

如果想表示一个橘子,我们需要的三角形太多了,但我们也可以不用三角形,只定义表面每个点的相对高度,即可出现凹凸形的着色对比

屏幕截图 2023-05-17 090131

如何定义相对高度

我们对像素的法线作扰动

屏幕截图 2023-05-17 090422

计算法线

可以计算一个曲线的导数,作与曲线切线垂直的射线,即可得到法线

屏幕截图 2023-05-17 090922

或者,我们可以定义一个局部的坐标系,在这个坐标系里认为原法线是(0,0,1),用纹理映射的办法修改法线坐标,再将坐标系转换回世界坐标

凹凸贴图没有像位移贴图一样改变定点的坐标,有一定的局限

屏幕截图 2023-05-17 091708

几何的表示方法

隐式几何

概念:不会告诉你几何的点在哪,而是告诉你几何中点点关系
比如,圆的标准式

隐式几何的缺点:很难直接确定几何的点在哪
好处:很好判断一个点是否在一个图形上

相对的也有显示的表达方法

显示几何

通过参数映射的方法表示

屏幕截图 2023-05-31 083942

我们需要判断在什么情况下使用什么表示方法

CSG

屏幕截图 2023-05-31 085454

通过几何之间的交并补等,可以用简单的几何表示复杂的几何

距离函数

我们描述一个几何的点到一个表面的最近距离,来隐式表示几何

通过距离函数融合几何

屏幕截图 2023-05-31 090217

水平集

记录一个坐标系中,一个函数的值相同的点

屏幕截图 2023-05-31 090747

地理上的应用:等高线

我们也可以把水平集定义在三维空间中

屏幕截图 2023-05-31 090840

我们现在可以用距离函数水平集描述一个复杂几何的表面

Fractals(分形)

一个几何的图形在内部重复

屏幕截图 2023-05-31 091104

这样类型的几何在渲染时很容易出现强烈的走样

Lecture11:Geometry 2(Curves and surfaces)

显示的几何也有许多不同的方法表示

显示几何

点云

我们不考虑一个物体的表面,而是考虑一个物体是由一堆点组成的,如果我们考虑的点足够细,足够密,点云就可以变成一个几何的面

屏幕截图 2023-05-31 091919

多边形面

任何一个面都可以拆成一堆小的三角形

我们可以通过定义很多三角形来描述一个几何

贝塞尔曲线

我们用一系列控制点定义一个曲线,且定义曲线的性质

屏幕截图 2023-05-31 092849

在四个控制点间连线,线段分半,继续分半,当每个线段只有一个点时,我们就得到了一个曲线

屏幕截图 2023-05-31 093549

控制点的移动会造成贝塞尔曲线的移动

在每两个点间找时间t,相当于在两个点之间做线性插值

贝塞尔曲线的性质

  1. 贝塞尔曲线一定过起点和终点
  2. 对一个贝塞尔曲线做仿射变换,得到的新曲线和对它的控制点做仿射变换后重新画出的曲线相同
  3. 贝塞尔曲线一定在几个控制点组成的凸包内

逐段定义

通过过多的控制点定义一个复杂的曲线会很困难

我们可以通过定义许多简单的贝塞尔曲线,来定义一个较复杂的曲线

屏幕截图 2023-06-07 083302

那么我们怎么保证连起来的曲线是光滑的呢

曲面

我们可以把曲线的定义发散到三维

屏幕截图 2023-06-07 084743

几何处理

  • Mesh subdivision
  • Mesh simplification
  • Mesh regularization

屏幕截图 2023-06-07 085551

Lecture 12:Geometry 3

Mesh Subdivision

网格细化:增加描述几何的三角形的数量

屏幕截图 2023-06-07 090442

Loop Subdivision

跟循环没有关系,这个名字和海参炒面一个道理

第一步,将三角形拆分,使三角形数量增多

![屏幕截图 2023-06-07 090857](C:\Users\hanfe\Pictures\Screenshots\屏幕截图 2023-06-07 090857.png)

第二部,调整细分三角形的位置

通过某种更新方式更新定点的位置

Catmull-Clark Subdivision

定义概念

非四边形面

奇异点:度不为4的点

也就是说,只要是非四边形面的定点,就是奇异点

屏幕截图 2023-06-07 092803

在边上取中点,在面上也取中点,将边的中点和面的中点连起来

屏幕截图 2023-06-07 092858

这是一次细分,经过了一次细分之后,奇异点会增加,非四边形面都消失了

那么我们可以认为每一个非四边形面引入了一个奇异点

如果我们继续做细分,奇异点数量就不会增加了

屏幕截图 2023-06-07 093301

但几何将会越来越平滑

屏幕截图 2023-06-07 093547

Mesh Simplification

网格简化

屏幕截图 2023-06-07 090530

屏幕截图 2023-06-07 094226

有时我们不需要太多三角形的几何,为了节省机能,我们需要将几何简化,但又不能过于简化

边坍缩

找到一个边,将这个边的两个定点合并,就可以减少面数

那么我们怎么判断坍缩哪些边呢

二次误差度量

探索后形成的点,到其原本组成的边的距离的平方叫二次度量误差

我们很容易想到,可以计算每一个边的二次度量误差,优先坍缩二次度量误差较小的点

问题在于,当坍缩一个边之后,与其相关联的边的二次度量误差会变化

使用优先队列堆结构,当进行坍塌之后,更新边的误差值

Mesh Regularization

网格正规化

屏幕截图 2023-06-07 090617

阴影

现在我们进行一个大的话题转变,我们说光线追踪

Shadow Mapping

如果我们看到一个点不在阴影里,我们又能看到这个点,说明我们可以通过摄像机看到这个点,并且光也能看到这个点

屏幕截图 2023-06-14 081610

进行光源对到shadowmap的深度缓存,当摄像机看见shadowmap上不同的像素时,分析这个像素的深度和其投影到光源上的像素记录的深度是否一致

Shadow Map会出现浮点精度的问题

硬阴影和软阴影

屏幕截图 2023-06-14 083036

Lecture 13 Ray Tracing 1

光栅化最大的问题是无法很好的表示全局的效果,比如软阴影,Glossy reflection,间接光照

屏幕截图 2023-06-14 084001

光线

  1. 光线是沿着直线传播的(虽然这是错的)
  2. 光线和光线不会发生碰撞(虽然依然是错的)
  3. 光线从光源出发最终到达我们的眼睛

在某种语境下,我们可以认为光线可逆,也就是说眼睛可以投射”感知的射线”,如果感知的射线投射到物体上,我们就看到了物体,这就是光线追踪

屏幕截图 2023-06-14 085641

屏幕截图 2023-06-14 085749

Whitted-Style Ray Tracing

当光线投射到类似玻璃的表面上,一部分能量对反射,一部分能量会折射

屏幕截图 2023-06-14 090655

在图中,第一个打中玻璃球的点会继续向后打中3个点

我们可以在第一个打中玻璃球的点做所有点着色的加权平均

屏幕截图 2023-06-14 090857

光线和物体表面的交点

屏幕截图 2023-06-14 102031

交点P要满足以上两个式子

屏幕截图 2023-06-14 102310

怎么样做光线和三角形的交点:

我们可以用光线和平面求交点,然后求交点是否在三角形内

点是否在三角形内的问题已经解决了,现在研究怎么让光线和平面求交

屏幕截图 2023-07-12 104210

已知,交点一定又在平面上,一定又在光线上,可得计算方法

屏幕截图 2023-07-12 104305**

当一个场景过于复杂,我们就要计算光线与所有三角形是否有焦点,这是非常浪费机能的

包围盒(Bounding Volumes)

可以用一个简单的形状包围住一个复杂的物体屏幕截图 2023-07-15 125055

我们就可以获得一个思路,如果一个光线连物体的包围盒都碰不到,说明这个光线也不可能碰到这个物体

长方体包围盒

我们可以用3个对面定义一个长方体

怎么判断一个光线和包围盒有交点

只有当光线进入了所有的3个对面,光线才算进入了盒子,当光线离开了任意一个对面,光线就离开了盒子

对于所有光线进入对面的时间,取最大值,就是光线进入盒子的时间

离开时间同理,但取最小值

如果光线的进入时间小于离开时间,说明光线势必在盒子里待了一段时间,也说明光线一定进入了盒子

屏幕截图 2023-07-15 130317

考虑负值的情况

如果一个光线的离开时间为负,说明盒子在光线后面,不可能有焦点

如果一个光线的离开时间不为负,且进入时间为负,说明光线起点在盒子里面,一定有交点

  • 尽量让盒子的面与坐标面平行以利于计算
  • 屏幕截图 2023-07-15 131034

Lecture 14:Ray Tracing 2

使用AABB加速光线追踪

创建包围盒,使用光线追踪之前,我们可以把包围盒分成许多小格子,标记可能有物体的小格子

如果小格子的数量适中,我们就可以用光线和小格子求交来加速判断光线是否和物体求交

屏幕截图 2023-07-15 134938

划分格子的方法

屏幕截图 2023-07-15 135829

划分KDtree的过程

屏幕截图 2023-07-15 140847

采用如此划分的加速结构,几何形体都在叶子节点上

不用一定要在中间划分

实际情况划分的细很多

如果一个光线和一个节点有交点,我们就判断这个光线是否和它的子节点有交点

如果一个光线和一个节点没有交点,我们就认为这个光线和它的所有子节点都没有交点

KDTree存在许多问题,现在已经被淘汰了

使用BVH加速光线追踪

将一个盒子中的所有三角形组织成两部分,在各个部分上继续划分成两部分

屏幕截图 2023-07-17 160640

关于如何划分:

取中间的三角形,也就是位置是中位数的三角形来划分,目的是让树的两端更平衡

取三角形的重心判断三角形的位置

关于算法:

给你n个数,找它们的中位数,也就是第1/2*n大的数,可以用快速选择算法

关于逻辑:

屏幕截图 2023-07-17 162236

辐射度量学(basic radiometry)

下面介绍一些必要的物理量

Radiant Energy

Q[J=Joule]

Radiant flux(power)

表示单位时间内的能量

![屏幕截图 2023-07-17 163500](C:\Users\hanfe\Pictures\Screenshots\屏幕截图 2023-07-17 163500.png)

光源会辐射各种不同的能量,物体表面也会接收不同的能量,光在传播的过程中能量也会发生变化,我们分别介绍物理量

屏幕截图 2023-07-17 164502

Radiant Intensity

屏幕截图 2023-07-17 164647

立体角

如何定义一个角?弧长除以半径是个好办法

而立体角是弧度制在三围的延伸

屏幕截图 2023-07-17 164922

定义立体角:面积除以半径的平方

微分立体角

屏幕截图 2023-07-17 165236

现在说回Radiant Intensity,如果一个点在所有方向辐射的能量是均匀的,Radiant Intensity表示一个点光源在各个方向上的能量

屏幕截图 2023-07-17 165514

Ray Tracing3

继续介绍物理量

Irradiance

每面积上对应的功率

屏幕截图 2023-07-18 182057

投影到垂直光线方向的面积,才是合法的面积

屏幕截图 2023-07-18 182322

当点光源的能量随传播衰减时,是Irradiance在衰减,而不是Intensity在衰减

屏幕截图 2023-07-18 182721

Radiance

每面积*立体角上的功率

屏幕截图 2023-07-18 182837

所以,Radiance也可以理解为每立体角Irradiance,也可以理解为每面积Intensity

Irradiance和Radiance的关系

Irradiance表示每面积收到的能量,Radiance表示面积在某一个方向上收到的能量

所以Irradiance也表示每面积将所有方向的能量积分起来

屏幕截图 2023-07-18 184320

BRDF(双向反射分布函数)

当光打中了一个物体,会反射, 我们可以如此理解

光改变了一个方向

也可以换一种方式理解

光的能量被吸收了,然后物体又在另一个方向将能量释放了出去

一个小面积如何将光反射出去,就是BRDF的定义

屏幕截图 2023-07-19 142119

一个点可以接收各种不同方向的光,对于这个点反射的某一方向的光,可以将所有方向入射的光对这个反射方向的贡献加和,就得到了该反射方向的光

屏幕截图 2023-07-19 143400

如果这个物体会发光,那这个方程该怎么算?

很简单,把发出的光加上就行

屏幕截图 2023-07-19 143824

以上方程称为渲染方程

理解渲染方程

有一个面光源,我们可以我们将它理解为一个点光源的集合

在计算上我们可以将这个面光源积分

![屏幕截图 2023-07-24 160758](C:\Users\hanfe\Pictures\Screenshots\屏幕截图 2023-07-24 160758.png)

简化写法

屏幕截图 2023-07-24 160846

再简化写法

屏幕截图 2023-07-24 161016

L指所有物体辐射的所有能量,E指所有光源辐射的能量,KL指所有能量被反射出的能量,可以将K理解为反射操作符

我们将渲染方程如此简化,是为了,解渲染方程

屏幕截图 2023-07-24 161600

也就是说,L等于所有光源辐射的能量,加所有光源辐射能量弹射一次的能量,加弹射两次的能量,加……

屏幕截图 2023-07-24 161753

光线不弹射叫直接光照

光线弹射之后的光照叫间接光照

直接光照和间接光照的和叫全局光照

着色做的就是直接光照

光栅化能告诉我们的光照的内容就只有E+KE,后面的部分光栅化比较难做

以下是示例

只有直接光照

屏幕截图 2023-07-24 162300

加上一次间接光照

屏幕截图 2023-07-24 162330

加上两次间接光照

屏幕截图 2023-07-24 162340

概率论回顾

是的,学图形学害得学概率论

Ray Tracing4(Monte Carlo Path Tracing)

蒙特拉罗积分

给出任意一个函数,为了算出它从a到b的定积分,我们会写出函数的解析式

但如果这个函数非常复杂,无法写出解析式,我们可以使用蒙特卡罗积分

屏幕截图 2023-07-25 141515

路径追踪

我们已经学过了Whitted-stylle Ray Tracing,它认为如果一个光线打中了一个透明物品,那么光线就会折射,如果光线打中了一个漫反射的物体,那么光线就会截止,这是不对的

如何解决Whitted-stylle Ray Tracing的问题

首先,我们知道Whitted-stylle Ray Tracing是错的,但我们知道渲染方程是对的

![屏幕截图 2023-07-26 151515](C:\Users\hanfe\Pictures\Screenshots\屏幕截图 2023-07-26 151515.png)

Lecture 17 Materials and Appearances

外观是光线和材质共同作用的结果

材质=BRDF

材质的种类

Glossy material

屏幕截图 2023-07-29 155614

屏幕截图 2023-07-29 155639

Ideal reflective/refractive material

屏幕截图 2023-07-29 155746

屏幕截图 2023-07-29 155806

折射

如何计算折射

折射定律

如果我们定义入射光线和出射光线的角度,那么只要我们定义折射率,也就是这两个角度之间的关系

![屏幕截图 2023-07-29 161619](C:\Users\hanfe\Pictures\Screenshots\屏幕截图 2023-07-29 161619.png)

只有当上图下方的比例大于1,根号就有可能没有意义

菲涅尔项

注意桌子上书的影子,也就是书反射的光

屏幕截图 2023-07-29 162721

如果光线入射的角度和物体表面完全平行,那么可以认为所有的光都被反射,如果光线入射的角度和物体表面垂直,

Lecture 18:Advanced Topics in Rendering

蒙特卡罗估计的期望如果总是我们要的真实值,就是这个方法是无偏的估计,其他情况是有偏的

如果方法是有偏的,当我们估计的样本足够多,结果会收敛到一个近似真实值的值,称为consistent

无偏光线传播方法

Bidirectional path tracing

生成两个不同的半路径,分别从光源和摄像机出发,最后将两个半路径的端点连接

屏幕截图 2023-07-31 120624

屏幕截图 2023-07-31 120828

Metropolis Light Transport

用马尔科夫链帮助采样

马尔科夫链方法是,如果你有一个样本,你可以在周围生成一个新样本

我们用这种方法, 不断在一个路径周围寻找新的路径,就可以找到所有的路径

屏幕截图 2023-07-31 121251

屏幕截图 2023-07-31 121353

Metropolis方法很难在理论上估计收敛的速度,同时所有的操作是局部的,所以可能有的像素收敛的慢,有的像素收敛的快,会使得到的图像很脏

有偏光线传播方法

Photon Mappin光子映射

一种光子映射的实现方法

第一步,从光源出发.光源无时无刻在向外辐射光子,如果光子打中物体,可能反射也可能折射,但当光子打中diffuse surface上,光子就会停止

第二步,从摄像机开始,向外发射路径(sub-path),路径打中物体,也会反射和折射,但当路径打中diffuse surface上,路径就会停止

最后,进行local density estimation,也就是说,对于任何着色点,找到它最近的n个光子,得到所有光子所占的面的面积,然后计算光子的密度(数量/面积)

屏幕截图 2023-07-31 122553

当光子的密度越高,就越接近真实

屏幕截图 2023-07-31 123850

Vertex Connection and Merging

屏幕截图 2023-07-31 124248

Instant Radiosity

我们可以不区分光线是光源发射出来的,还是光反射出来的,我们可以认为只要是光达到的物体,就变成了新的光源

屏幕截图 2023-08-01 171331

散射介质

屏幕截图 2023-08-01 172036

当光线行进的过程中,散射介质中会有晶体将光线向各个方向反射

屏幕截图 2023-08-01 172045

光线在传播的过程中会被吸收,被反射

这个反射,由Phase Function决定

屏幕截图 2023-08-01 172229

Marschner Model

当一个光线打中一个圆柱,有一部分光会被反射,另一部分会穿过去,在圆柱的内壁上再次反射穿出来

屏幕截图 2023-08-01 173124

如果模拟头发,那么光线会在头发间不断的反射,最终弹射出来被摄像机看见,计算量是巨大的

这个办法可以描述人的毛发,但描述动物的毛发会有问题,动物的毛发中有更多的髓质,可以看成散射介质

Double Cylinder Model

将动物的毛发看成是两个圆柱,内部的圆柱是散射介质

屏幕截图 2023-08-01 182812

surface model

Subsurface model

屏幕截图 2023-08-01 183958

屏幕截图 2023-08-01 184517

Cloth

布料是一系列缠绕的纤维,纤维的缠绕有层级

屏幕截图 2023-08-01 185131

所以布料的渲染和纤维的缠绕方法有关

Lecture 19:Cameras,Lenses and Light Fields

Image成像

我们了解到,成像有光栅化成像,光线追踪成像,捕捉成像(比如拍照),还有其他的成像方式

成像需要传感器

传感器上的点记录的是irradiance

Field of View视场

屏幕截图 2023-08-02 150631

所以,增加h,减小f,就可以增大视场

屏幕截图 2023-08-02 151031

Exposure曝光

屏幕截图 2023-08-02 192500

决定曝光的因素,收光曝光时间和光的亮度,也就是光圈的大小,快门的时间和ISOgain感光度

屏幕截图 2023-08-02 192950

屏幕截图 2023-08-02 193059

ISO

简单的放大ISO也会放大噪声

屏幕截图 2023-08-02 194025

F-Number(F-Stop):Exposure Levels

用F数来描述光圈的大小,数越大光圈的直径越小

屏幕截图 2023-08-02 194547

Physical Shutter

Side Effect of Shutter Speed

当相机拍摄高速运动的物体,在快门打开的时间内,物体已经产生了一定的运动,所以照片会出现运动模糊

如果减少快门的时间,会减少运动模糊,但也会减少曝光

对于速度非常快的物体,慢快门会出现Rolling shutter现象

屏幕截图 2023-08-02 195325

高速摄影

用更大的光圈和ISO,很短的曝光时间

屏幕截图 2023-08-02 195707

延迟摄影

用更小的光圈和ISO,很长的曝光时间

屏幕截图 2023-08-02 195834

Thin Lens Approximation

对于一些真正的相机来说,镜头非常复杂

屏幕截图 2023-08-02 195958

我们研究的棱镜是理想的薄棱镜,所有射入的平行光会被汇聚到一个焦点,同时我们假设这个薄棱镜可以更改焦距

屏幕截图 2023-08-02 201930

现代镜头使用的棱镜组类似上述的理想棱镜

定义焦距f,物距zi,像距zo,有以下公式

![屏幕截图 2023-08-02 202103](C:\Users\hanfe\Pictures\Screenshots\屏幕截图 2023-08-02 202103.png)

Defocus Blur

屏幕截图 2023-08-03 155218

Depth of Field景深

大的光圈会得到一些模糊的图,但总归有一些地方是不模糊的,光圈的大小影响的是模糊的范围

景深指CoC足够小的范围,也是成像清晰的一段范围

屏幕截图 2023-08-03 160508

Lecutre 20:Color and Perception

Light Field/Lumigraph光场

我们从我们看到的世界是说起,如果把我们看到的东西画下来,应该是将3D的世界画成2D的图像,现在我们在面前加一个幕布,幕布上画的东西和我们刚才画的东西一样,这就是虚拟现实的原理

The Plenoptic Function全光函数

全光函数是我们能看到的所有东西,也就是在任何位置,任何方向,任何时间,看到的任何波长的光

屏幕截图 2023-08-03 163247

我们能看到的所有东西都可以解释成这个7维的函数

光场就是全光函数的一部分

Ray

定义一个光线,即一个起点和一个方向或两个点

屏幕截图 2023-08-04 104548

定义光场

我们不需要知道物体是什么,我们只需要知道物体的包围和在各个方向发出的光,看到光,我们就能看到物体

这些光就是光场

屏幕截图 2023-08-04 105113

Light Field Camera

对于两个平面uv,st,一个物体在st的右边

屏幕截图 2023-08-04 105701

(a)表示在uv上一个点,看向st的所有方向,相当于uv上的摄像机,(b)表示在uv上所有的点,看向st上的同一点

光场照相机在各个位置记录光场

屏幕截图 2023-08-04 110821

我们某一个方向的光,就可以得到一个照片

屏幕截图 2023-08-04 111316

通过取不同方向的光,我们就可以在拍过照之后”移动”相机的位置

Color

颜色与光有关,或者说与光的光谱有关,图形学关心的是可见光的光谱

屏幕截图 2023-08-04 112000

那么什么是颜色呢

颜色是人的感知

屏幕截图 2023-08-04 112813

人眼上有锥形细胞,用于感受光的强度

屏幕截图 2023-08-04 112826

锥形细胞有三种,S,M,L三种细胞能感受波长不同的光

屏幕截图 2023-08-04 112908

不同的人眼中的三种细胞的分布,非常不一样,以下12张图来自12个人

屏幕截图 2023-08-04 113003

这三个细胞会得到三个数,大脑看到的不是光谱,而是三个数

屏幕截图 2023-08-04 115843

同色异谱现象

有可能会出现光谱不同,但锥形细胞得到的数相同的情况

加色系统

以最常见的RGB为例

屏幕截图 2023-08-04 120146

加色系统允许我们将颜色线性相加

加色系统的所有颜色相加是白色

Color Spaces

sRGB是广泛使用的颜色空间

屏幕截图 2023-08-04 193817

还有别的颜色空间,比如HSV

屏幕截图 2023-08-04 194943

以及CIE

屏幕截图 2023-08-04 195125

Gamut色域

色域是一个颜色空间能表示的所有颜色

屏幕截图 2023-08-04 193948

减色系统

以CMYK系统为例

屏幕截图 2023-08-04 195745

减色系统的所有颜色相加是黑色

Lecture 21:Animation

Keyframe Animation关键帧动画

屏幕截图 2023-08-04 211601

我们有了这些关键帧后,帧与帧之间的部分可以差值补充

屏幕截图 2023-08-04 224702

Physical Simulation物理仿真

如果我们知道物体此时收到的力,或者运动趋势,我们就可以知道物体下一帧的位置和形态

屏幕截图 2023-08-04 225455

Mass Spring System质点弹簧系统

质点弹簧系统是一系列相互连接的弹簧和质点

屏幕截图 2023-08-04 225528

屏幕截图 2023-08-04 225643

理想的弹簧遵守胡克定律且长度为0

屏幕截图 2023-08-04 225747

但弹簧应该有一定的长度

屏幕截图 2023-08-04 230016

如果给理想弹簧施加过一个力,弹簧会一直震动,所以我们需要给弹簧施加”摩擦力”

这个弹簧的作用应该是将弹簧最终恢复为未拉伸的状态

屏幕截图 2023-08-04 230448

Particle System粒子系统

屏幕截图 2023-08-04 232549

Forward Kinematics运动学

我们可以定义三种不同的关节,Pin,Ball,Prismatic joint,用关节来控制物体的运动

屏幕截图 2023-08-04 234219

给定物体移动的角度,我们就可以得到物体的位置

屏幕截图 2023-08-04 234713

为了让艺术家更轻松的使用关节,可以使用逆运动学

Inverse Kinematics逆运动学

给定物体将移动的位置,就可以得到物体在运动中旋转的角度

屏幕截图 2023-08-04 234750

但物体的位置移动很可能出现多解或无解

屏幕截图 2023-08-04 234907

Rigging骨骼绑定

屏幕截图 2023-08-04 235251

屏幕截图 2023-08-04 235506

Blend Shapes

如果已经有了物体的两个形态,可以将两个形态的控制点差值,得到中间的形态

屏幕截图 2023-08-04 235624

Motion Capture动作捕捉

用控制点将真人的动作反映到虚拟的物体上

屏幕截图 2023-08-04 235743

Lecture 22:Animation (cont.)

Single Particle Simulation

我们希望在速度场中模拟粒子的移动

屏幕截图 2023-08-05 151932

使用欧拉方法

屏幕截图 2023-08-05 152316

上一个时刻有一个位置和加速度,下一个时刻位置就可以是上一时刻的位置加上位移

也就是说,我们始终用上一帧的量,推测下一帧的量

但使用欧拉方法会很不稳定

如果我们使用的t太长,就会出现较大的误差,粒子在某些速度场中会出现很大的位置错误

屏幕截图 2023-08-05 154245

Midpoint Method

如果我们有一个位置,也有一个速度,那么我们可以预测一个粒子下一刻的位置

但我们不用这个位置,我们用这两个位置的中点作为中间点,在中间点再用一次欧拉方法,就可以一定程度的避免欧拉方法的问题

屏幕截图 2023-08-05 154825

屏幕截图 2023-08-05 155034

Adaptive Step Size

每次计算位置时,用欧拉方法计算一次位置,再用t/2做两次欧拉方法计算一次位置

如果我们发现两次得到的位置差的不多,就使用后者得到的位置,如果两次得到的位置差的很多,就

继续拆分t,做更多的欧拉方法得到位置

屏幕截图 2023-08-05 155437

Implicit Euler Method

欧拉方法中,我们用这一帧的速度和加速度计算下一帧的位置

在隐式欧拉方法中,我们用下一帧的速度和加速度计算下一帧的位置

屏幕截图 2023-08-05 155807

问题在于我们如何得知下一帧的量

Runge-Kutta Families

Runge-Kutta是一类方法,适合解决ODE(微分方程)问题

屏幕截图 2023-08-05 160844

Rigid Body Simulation

屏幕截图 2023-08-05 161924

Fluid Simulation

一种简单方法

我们可以将水看成是一堆小球,只要我们能计算小球的位置,我们就可以计算水的位置

在这个方法中,要假设流体是不可压缩的,在任何位置,流体的密度是相同的

屏幕截图 2023-08-05 163330

Eulerian和Lagrangian

对于一大堆物体的模拟,拉格朗日方法是模拟每一个物体,欧拉方法将空间切成网格

屏幕截图 2023-08-05 165034

Material Paint Method

MPM方法就是欧拉方法和拉格朗日方法都用

屏幕截图 2023-08-05 165357

屏幕截图 2023-08-05 165448

GAMES101常看常新


2024/4/8,写过shader之后来复习,GAMES101真的常看常新