GAMES101-现代计算机图形学入门
GAMES101: 现代计算机图形学入门
https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
课程介绍
本课程将全面而系统地介绍现代计算机图形学的四大组成部分:(1)光栅化成像,(2)几何表示,(3)光的传播理论,以及(4)动画与模拟。每个方面都会从基础原理出发讲解到实际应用,并介绍前沿的理论研究。通过本课程,你可以学习到计算机图形学背后的数学和物理知识,并锻炼实际的编程能力。
顾名思义,作为入门,本课程会尽可能的覆盖图形学的方方面面,把每一部分的基本概念都尽可能说清楚,让大家对计算机图形学有一个完整的、自上而下的全局把握。全局的理解很重要,学完本课程后,你会了解到图形学不等于 OpenGL,不等于光线追踪,而是一套生成整个虚拟世界的方法。从本课程的标题,大家还可以看到“现代”二字,也就是说,这门课所要给大家介绍的都是现代化的知识,也都是现代图形学工业界需要的图形学基础。
本课程与其它图形学教程还有一个重要的区别,那就是本课程不会讲授 OpenGL,甚至不会提及这个概念。本课程所讲授的内容是图形学背后的原理,而不是如何使用一个特定的图形学 API。在学习完这门课的时候,你一定有能力自己使用 OpenGL 写实时渲染的程序。另外,本课程并不涉及计算机视觉、图像视频处理、深度学习,也不会介绍游戏引擎与三维建模软件的使用。
计算机图形学概述
课程包括四个部分:
- 光栅化:OpenGL,shader是如何运作的
- 曲线和曲面
- 光线追踪
- 动画/模拟
虚拟现实VR,看到的东西都是虚拟的
增强现实AR,在现实世界中增加一些虚拟的东西
计算机视觉VS计算机图形学
模型->图像:特指渲染:把这些模型综合在一起考虑,把它给变成一幅图
模型->模型:模拟
变换(二维与三维)
本节内容
- Transformation!
- Today
- Why study transformation
- 2D transformations: rotation, scale, shear
- Homogeneous coordinates
- Composing transforms
- 3D transformations
Why study transformation
Modeling:模型变换
Viewing:视图变换
2D transformations
Scale
Reflection Matrix
Homogeneous coordinates
为什么要引入齐次坐标:不希望将平移当成一个特殊的变换。引入齐次坐标的目的,将所有的变换给写成一个矩阵乘以一个向量的形式。
齐次矩阵对应的仿射变换的顺序:先进行变换,再进行平移
3D Transformation
右手坐标系与左手坐标系
右手螺旋定则:X叉乘Z,四指伸直指向x,弯曲到z轴(正向)上,这时大拇指的方向即为y轴的正向方向
右手系中,Z叉乘X得到Y轴的方向
变换(模型、视图、投影)
Viewing (观测) transformation
View (视图) / Camera transformation
Projection (投影) transformation
- Orthographic (正交) projection
- Perspective (透视) projection
View (视图) / Camera transformation
视图变换也称为模型视图变换(ModelView Transformation)。
视图变换的具体步骤为,先将相机移动到原点位置,然后再做旋转。
Projection (投影) transformation
投影:将某一范围深度之间的内容显示到近处的平面上。
投影主要分为正交投影与透视投影。透视投影,有近大远小的性质。
Perspective Projection(透视投影)
- Most common in Computer Graphics, art, visual system
- Further objects are smaller
- Parallel lines not parallel; converge to single poin
具体步骤
- 将视锥体挤压成长方体(n -> n, f -> f,注意深度不变)
- 再做正交投影,将长方体变换成立方体([-1,1]^3^)
光栅化(三角形的离散化)
- Finishing up Viewing
- Viewport transformation
- Rasterization
- Different raster displays
- Rasterizing a triangle
- Occlusions and Visibility
Perspective Projection
定义视锥需要的两个概念:field-of-view (fovY,垂直可视角度) 和 aspect ratio(长宽比)。
l,r,b,t:分别是近平面的左右上下坐标
Rasterization
什么是屏幕:屏幕是一个二维的数组,数组中的一个元素就代表一个像素。
什么是分辨率:数组的大小。例如1920*1080,其分辨率为1080p,表示像素的多少
光栅成像设备,光栅,是德语中的一个词,意思就是屏幕
光栅化,rastrize,一个动词,是指把东西画在屏幕上
定义屏幕左下角为原点,一个像素覆盖1个单位,像素的起点是它的index,它的中心点坐标表示该像素。那么整个屏幕覆盖的范围是【0,0】到 [ width, height ] 。
暂时不管z轴,将立方体的xy缩放成屏幕大小,Transform in xy plane: [-1, 1]^2^ to [0, width] x [0, height]
Triangles - Fundamental Shape Primitives
四边面方便细分,实际计算的时候还是按三角形进行渲染的
四边形面片可以动态拆分以期获得更好的显示效果,但是显卡只能处理三角面片
三角形内部一定是平面的,三角形内外定义是清晰的,像多边形,如果它里面有”洞“怎么办,如果不是凸多边形怎么办。可以利用向量的叉积来判断一个点是否在三角形内。
知道三角形三个顶点的属性,可以通过插值的方法知道其内部任意一个点的属性,
Why triangles?
- Most basic polygon
- Break up other polygons
- Unique properties
- Guaranteed to be planar
- Well-defined interior
- Well-defined method for interpolating values at vertices over triangle (barycentric interpolation)
如果一个像素在两个三角形共同边上怎么办?
要么不处理,要么特殊处理。自己可以定义一个标准,比如像素只要在边上,就在三角形内,下图在两个三角形内。比如在边界上不算,也没有关系。边上的点画不画其实并不太影响整个图形的最终效果。
着色(光照与基本着色模型)
Visibility / occlusion
- Z-buffering
Shading
- Illumination & Shading
- Graphics Pipeline
Visibility / occlusion
画家算法
先把远处的东西画好(画在屏幕上),由远到近依次做光栅化,这样就可以得到正确遮挡的结果。
近的东西覆盖掉远处已经画好的东西。时间复杂度为nlogn,因为需要排序(由远及近)。
缺点:
- Requires sorting in depth (O(n log n) for n triangles)
- Can have unresolvable depth order
画家算法无法解决同深度问题,比如画一个立方体,如果按右,上,左,下的顺序渲染面,然后再渲染最前面的一面,最后的结果是多出了两条线。
Z-buffering
- 每个像素记录所有物体相互叠落之后的最浅深度
- Needs an additional buffer for depth values。同步生成两个图像
- 一个是最终的结果图,存在frame buffer中
- 一个是深度图或深度缓存,这个图像只存任何一个像素它所看到的几何物体的最浅的深度的信息,存在depth buffer中
这两幅图是同步生成的
利用深度缓存,来维护遮挡信息
深度缓存的一个特点:和顺序无关。不管是先画哪个三角形,只要维护正确的深度值,最后的结果是一致的。(假设这些三角形不在同一深度)。Z-Buffer算法并没有排序的过程,是在找最小值,它的时间复杂度为N
Shading
定义:
In Merriam-Webster Dictionary:shad·ing, [ˈʃeɪdɪŋ], noun
The darkening or coloring of an illustration or diagram with parallel lines or a block of color.In this course:
The process of applying a material to an object.
Blinn-Phong模型
- 高光:特别亮的一块
- 漫反射:相对没有那么剧烈,
- 环境光:并不是直接光照,而是间接光照,通过别的物体反射接收到的光照。很复杂,环境光简化掉用一个常数表示
高光是镜反射,三大面才是漫反射。漫反射和材质颜色相关最大。
Shading is Local
着色是局部性的,着色某个点,不考虑其它物体的存在,只考虑对于这个点,光线来的方向,不考虑这个点是否被别的东西挡住了。大家能看到明暗变换,但看不到阴影
Compute light reflected toward camera at a specific shading point
Inputs:
- Viewer direction, v
- Surface normal, n
- Light direction, l (for each of many lights)
- Surface parameters (color, shininess, …)
漫反射
光线会被均匀的反射不同的方向。从不同的角度看向某个“点”,其颜色(明暗)都是一样的。
一个表面接收到了多少能量?同一个表面,相对于光方向的不同角度,明暗不同,为什么?
假设光线有一定的能量,考虑某个点周围的单位面积(不然面积的大小影响光的接收大小),第二幅图,旋转后单位面积大小不变。接收到的能量和 【光照方向和法线方向的夹角的余弦】成正比。
有多少能量到达?
在任意一个时刻,点光源辐射出来的光源,能量一定集中在一个球壳上。能量守恒:球壳((考虑三维空 间))之间的能量相同,离中心越远,球壳上的单位面积上的能量越少,成半径平方的反倍。如果我们知道点光源,和shading point,我们就知道有多少的光传播到点光源的附近,我们又知道有多少光在这个点上被吸收
影响明暗的因素:光到达时的能量(离光源的远近),吸收的能量(与光线的夹角),反射了多少光(整体上明亮程度)
漫反射和观察的方向没有关系,这正是因为漫反射从四面八方反射的特点导致的
着色(着色频率、图形管线、纹理映射)
- Shading 2
- Blinn-Phong reflectance model
- Specular and ambient terms
- Shading frequencies
- Graphics pipeline
- Texture mapping
- Barycentric coordinates
- Blinn-Phong reflectance model
高光-Specular Term(Blinn-Phong)
比较光滑的物体,它的反射都有一定的特性,发射的方向接近镜面反射。当观察的方向和镜面反射方向接近时,能够看到高光。
余弦可以体现两个方向是不是足够接近,但是它容忍度太高了。高光应该是非常亮,集中在一个很小的区域,当它们离得非常近,才认为在高光里。公式中p一般值在100-200
环境光-Ambient Term
Shading that does not depend on anything
- Add constant color to account for disregarded
illumination and fill in black shadows - This is approximate / fake!
Shading frequencies
- Flat shading (Shade each triangle)
- Gouraud shading:Shade each vertex
- Phong shading:Shade each pixel
纹理映射-Texture Mapping
纹理映射:定义物体上任何一个点上的属性,
三维物体的表面是一个二维的,一个三维物体表面可以和一张图有一一对应的关系。
纹理就是一张图,蒙在三维物体上的表面。三维上的点和纹理上的点的关系。
纹理上坐标,通常用uv。uv范围认为都在0到1范围内(不管长宽比方向)
怎么把一个空间上的三角形映射到纹理,我们不管,已经有了这么一个映射关系
映射纹理的两种方法:手动(美术)和自动(参数化,一个非常重要的方向,几何上一个非常厉害的研究)
着色(插值、高级纹理映射)
- Shading 3
- Barycentric coordinates
- Texture queries
- Applications of textures
- Shadow mapping
Interpolation Across Triangles: Barycentric Coordinates (重心坐标)
Why do we want to interpolate?
- Specify values at vertices
- Obtain smoothly varying values across triangles
What do we want to interpolate?
- Texture coordinates, colors, normal vectors, …
How do we interpolate?
- Barycentric coordinates
三角形的重心:把大三角形分成等面的三个小三角形
缺点:在投影下,并不能保证重心坐标不改变。在投影下不变。所以三角形内部的点的属性是在投影之前做的。对于深度测试,光栅化时,找到像素中心点对应的三角形上的点,使用的是它的三维空间下的深度(逆变换,从二维到三维)。在三维空间中做插值,再对应到二维空间的结果上去,根本原因是重心坐标在投影下会发生变化。
Applying Textures
Texture Magnification:What if the texture is too small?
纹理本身太小,比如高分辨率的墙其纹理却很低清。对应的在纹理上的点不是整数。
A pixel on a texture — a texel(纹理元素、纹素)
Bilinear-双线性插值(水平和竖直做两遍插值)
Bicubic
取周围临近的16的点,每次用4个做三次的插值,不是用线性的插值
Texture Magnification:What if the texture is too large?
几何(基本表示方法)
- Applications of textures
- Introduction to geometry (2nd part of this course!)
- Examples of geometry
- Various representations of geometry
Applications of Textures
纹理可以理解成一块数据,可以做不同类型的查询,没有必要完全限制在一个 “图像”上
In modern GPUs, texture = memory + range query (filtering)
- General method to bring data to fragment calculations
Many applications
- Environment lighting
- Store microgeometry
- Procedural textures
- Solid modeling
- Volume rendering
- …
Environment Map
环境光照(假设光源无限远,没有实际的深度意义,只保留方向)
可以用纹理表示周围环境光长什么样,可以用这个环境光去渲染其它的物体
Textures can affect shading
Bump Mapping
应用:凹凸贴图。定义一个任意一个点的相对高度,沿着法线的方向上下移动。表面凹凸不是用三角形表示,通过应用一个复杂的纹理,应用之后法线发生了变化,进而shading发生了变化,从而显示出。
凹凸贴图的原理:人为的做出一个假的法线,通过纹理映射,通过这个假的法线进行shading,可以让人觉得有凹凸不平的结果,但是实际上并没有改变几何。
凹凸贴图和法线贴图是一回事,这取决于贴图定义的是什么,比如左边的图,白色的是0,黑色的是1,定义了点沿着法线虚拟移动的距离。
改变任意一个点的法线
Introduction to geometry
Many Ways to Represent Geometry
隐式与显示:用不同的方式来表示不同的几何
Implicit Representations
隐式几何方法:为了表示一个面,不会告诉这些点具体在哪,只告诉这些点满足的关系。满足某种关系的这些点都在这个表面上。把这些点作为一个归类。
隐式表示缺点:不够直观(都有哪些点)
优点:容易判断一个点是否在平面上
Pros:
- compact description (e.g., a function)
- certain queries easy (inside object, distance to surface)
- good for ray-to-surface intersection (more later)
- for simple shapes, exact description / no sampling error
- easy to handle changes in topology (e.g., fluid)
Cons:
- difficult to model complex shapes
Explicit Representations
显式: 直接给出 或者通过参数映射的方式给出:比如通过遍历UV,然后得到几何图
缺点:难判断一个点在几何的表面与内外。
光线追踪(基本原理)
Why Ray Tracing?
Rasterization couldn’t handle global effects well
- (Soft) shadows
- And especially when the light bounces more than once
Rasterization is fast, but quality is relatively low,Ray tracing is accurate, but is very slow
- Rasterization: real-time, ray tracing: offline
- ~10K CPU core hours to render one frame in production
ray tracing,离线的应用,比如电影
生成一帧,需要1万个CPU运行一个小时
Light Rays
Three ideas about light rays
- Light travels in straight lines (though this is wrong,光线有波)
- 两个光线不会发生碰撞(though this is still wrong)
- Light rays travel from the light sources to the eye (but the physics is invariant under path reversal - reciprocity,reciprocity,光线的可逆性,假设眼睛反过来,发出光通过反射到达光源).
Ray Casting - Generating Eye Rays
光线从眼睛(现假设一个点)穿过像素到达物体的某个点,然后再从这个点向光源连接。如果有遮挡,说明这个点在阴影中,如果没有,则知道光源方向和视角方向,可以着色了,比如blinn phong模型.
Recursive (Whitted-Style) Ray Tracing
Whitted-sytle的光线追踪(本身是一个递归),考虑光线弹射多次,比如透明球,就是反生了两次折射,到达眼睛
Whitted-sytle的光线追踪:就是在模拟光线不断弹射的过程。到达一个点之后可以继续传播这条光线,每个弹射点都去和光源做连线,是否被照亮。如果光源可以照亮任何一个弹射的点,这些弹射点都加到同一个像素点上去。会考虑折射(反射)后的能量损失。
Shadow rays:向光源连的,用来判断可见性的
对于透明球,也会到达光源,就可以看到透明球下面的阴影也会浅一些
动画与模拟(基本概念、质点弹簧系统、运动学)
Introduction to Computer Animation
- Keyframe animation
- Physical simulation
- Kinematics
- Rigging
Keyframe Animation
关键帧动画是一个插值的技术
Physical simulation
物理模拟:根据正确的物体之间的力,自然就可以模拟正确的效果
Mass Spring System
质点弹簧系统:是一系列相互连接的质点和弹簧。基本单元:一个弹簧,左右连接着两个质点
一个理想化的弹簧:没有长度,拉开多长就会产生多大的力
胡克定律:指固體材料受力後,应力与应变成线性关系,满足此定律的材料称为线弹性或虎克型材料。
Particle Systems
粒子系统:一堆很小很小的东西
挑战性:粒子与粒子之间的力,引力,碰撞
Model dynamical systems as collections of large numbers of particles
Each particle’s motion is defined by a set of physical (or non-physical) forces
Popular technique in graphics and games
- Easy to understand, implement
- Scalable: fewer particles for speed, more
for higher complexity
Challenges
- May need many particles (e.g. fluids)
- May need acceleration structures (e.g. to
find nearest particles for interactions)
Kinematics
Forward Kinematics
给出长度与角度,通过数学计算,得出某个关节点的位置
Strengths
- Direct control is convenient
- Implementation is straightforward
Weaknesses
- Animation may be inconsistent with physics
- Time consuming for artists
Inverse Kinematics
为了更容易操作。
如可以控制尖端随机移动到某一位置,机器会自动计算相应的变换
反向运动的存在的问题:
- 移动某个点到某位置可能会有多个解,解不唯一
- Solutions may not always exist
优化方法:通过优化方法去解,而不是真的去解角度
Numerical solution to general N-link IK problem
- Choose an initial configuration
- Define an error metric (e.g. square of distance between goal and current position)
- Compute gradient of error as function of configuration
- Apply gradient descent (or Newton’s method, or other optimization procedure)
rigging:绑定
Rigging is a set of higher level controls on a character that allow more rapid & intuitive modification of pose, deformations, expression, etc.
The Production Pipeline
fX:effect 特效