GAMES简介
GAMES(graphics and mixed environment symposium)是2016年初计算机学会(CCF)计算机辅助设计与图形学专委会成立的,作为我国的计算机图形学与虚拟现实的研究和交流合作平台。之后扩展到了在线学术交流平台Webinar(Web Seminar)
http://games-cn.org/about-games/
第一次课:图形学概论
图形学不是openGL,图形学包括了光栅化rasteration、曲线与曲面curves and meshes、光线追踪 ray tracing、动画/仿真animation/simulation.
第二次课:线性代数基础知识
向量点乘、叉乘,矩阵相乘
第三次课: Transform
均匀缩放 uniform scale、非均匀缩放 non-uniform scale、反射/对称 reflection、旋转 rotate、切变 shear
这些变换都可以表示成下面的式子 linear map
平移不再是线性变换,只能表示成下面的式子(abcd是单位矩阵)
affine map=linear map + translation
为了统一表示各种Transform,引入齐次坐标 homogeneous coordinate,其实就是多引入了一个维度
三维中(x,y,z,0)表示一个三维向量,(x,y,z,1)表示一个点,(x,y,z,1)和(2x,2y,2z,2)表示的是同一个点。
依次执行n个变换,变换矩阵依次左乘。
拿到变换结果可以分析出变换过程。例如:非原点发生的旋转可以平移到原点做旋转然后平移回去。
补充一下逆时针旋转
θ
\theta
θ,旋转矩阵是
R
θ
=
[
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
]
R_{\theta} = \begin{bmatrix}cos\theta & -sin\theta \\ sin\theta & cos\theta\end{bmatrix}
Rθ=[cosθsinθ−sinθcosθ]
那么顺时针旋转
θ
\theta
θ就是上面的式子角度为
−
θ
-\theta
−θ
R
−
θ
=
[
c
o
s
θ
s
i
n
θ
−
s
i
n
θ
c
o
s
θ
]
=
R
θ
T
R_{-\theta} = \begin{bmatrix}cos\theta & sin\theta \\ -sin\theta & cos\theta\end{bmatrix}=R_{\theta}^{T}
R−θ=[cosθ−sinθsinθcosθ]=RθT
由于顺逆时针旋转
θ
\theta
θ是一种互逆操作,
R
−
θ
=
R
θ
−
R_{-\theta}=R_{\theta}^{-}
R−θ=Rθ−
第四次课 Transformation cont
主要讲了三维的旋转变换(roll滚动、yaw偏航、pitch俯仰倾斜)和Viewing transformation (包括视图变换和投影变换)。
产生一张照片的三步骤MVP
- model 在空间中摆放好物体
- view 选择视角,也就是相机的位置和朝向和向上方向
- projection 正交投影、透视投影
第二步是将相机设置在原点,便于计算,朝向-z方向,向上方向为y方向,通常要经过一些变换。
第三步,正交投影常用于工程制图,而透视投影有一种现象是近大远小,符合人眼视觉习惯。标准正交投影,得到的是一个(-1,1) 3 ^{3} 3的立方体。
透视投影可以看成先压缩远景后正交投影,透视投影矩阵的推导。
公式之后补上。
第五次课 Rasterization
垂直可视角度,就是相机的广角,广角很大就可以拍近处的物体。
定义视锥:垂直可视角度和长宽比。
MVP操作之后得到的是一个标准立方体,然后需要进行屏幕坐标变换,即视口变换。
-
Irrelevant to z
-
Transform in xy plane: [-1, 1]2 to [0, width] x [0, height]
-
Viewport transform matrix M v i e w p o r t = [ w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ] M_{viewport}=\begin{bmatrix}\frac{width}2 & 0 & 0 & \frac{width}2 \\ 0 & \frac{height}2 & 0 & \frac{height}2\\ 0 & 0 & 1 &0\\ 0 & 0 & 0 &1\end{bmatrix} Mviewport=⎣⎢⎢⎡2width00002height0000102width2height01⎦⎥⎥⎤
-
Rasterizing Triangles into Pixels(为什么选择Triangle,如何判断像素中心是否在triangle内部)(抗锯齿、反走样)
-
右边的图,绿色像素更多,为什么。
-
显示设备:CRT、平板显示屏LCD、电子墨水屏
第六次课 反走样
采样频率跟不上信息变化频率就会出现各种问题,例如锯齿、摩尔纹、车轮效应等。
抗锯齿方法:两倍原信号频率;先模糊后采样 filter then sample。MSAA、FXAA、TAA。
超采样
第七次课 深度缓存Z-buffering、着色Illumination and Shading
为了解决把不同远近的Triangle投影到平面上,借用油画的绘画方法就有了画家算法(先画远处的物体,后画近处的物体,有一个覆盖的过程),但是所有的物体需要按照远近排序,并且不同的三角形可能会由于深度交叉而无法排序,如下图。
目前广泛采用的是Z-Buffering算法,记录距离最近的像素的深度。算法设计:frame buffer负责记录每个像素的颜色值;depth buffer负责记录每个像素的深度;遍历每个Triangle更新color和depth。
着色模型Blinn-Phong Reflectance Model。shading需要考虑的三个部分:高光Specular highlights、漫反射Diffuse reflection、环境光照Ambient lighting。(Shading是局部的,所以shading的结果不会产生影子)
(1)Diffuse Reflection 光会反射到各个方向,不论从哪里看都是一样的效果,所以计算公式和view角度无关(Shading independent of view direction)。
L
d
=
k
d
(
I
/
r
2
)
m
a
x
(
0
,
n
⋅
l
)
L_d= k_d(I/r^2) max(0,n · l)
Ld=kd(I/r2)max(0,n⋅l)
k
d
k_d
kd是漫反射系数,
I
I
I是光源的光强度,
r
r
r是光源到着色点的距离,
n
n
n是单位法向量,
l
l
l是光线向量(光源到着色点的单位向量);
I
/
r
2
I/r^2
I/r2表示到达 shading point的能量,
m
a
x
(
0
,
n
⋅
l
)
max(0,n · l)
max(0,n⋅l)(
n
⋅
l
n·l
n⋅l如果是负数那就没有意义)表示被吸收的能量。
(2)Specular Highlights指的是光源经过物体反射进入人眼时,物体上最亮的那个点。
L
s
=
k
s
(
I
/
r
2
)
[
m
a
x
(
0
,
n
⋅
h
)
]
p
L_s= k_s(I/r^2) [max(0,n · h)]^p
Ls=ks(I/r2)[max(0,n⋅h)]p
半程向量
h
=
b
i
s
e
c
t
o
r
(
V
,
l
)
=
V
+
l
∣
∣
V
+
l
∣
∣
h=bisector(V,l)=\frac{V+l}{||V+l||}
h=bisector(V,l)=∣∣V+l∣∣V+l,(注意
V
,
l
,
h
V,l,h
V,l,h都是单位向量);
k
s
k_s
ks表示高光系数,近似认为反射之后的能量
I
/
r
2
I/r^2
I/r2全部吸收了,
n
⋅
h
n · h
n⋅h表示了高光的程度,为了更精确地表示高光使用了指数
p
p
p(
p
p
p越大,高光范围越小)。
(3)Ambient Lisht 环境光和光源方向、视线方向都无关。
L
a
=
k
a
I
a
L_a=k_aI_a
La=kaIa
k
a
k_a
ka是环境光系数,
I
a
I_a
Ia是环境光的强度,近似为一个常数。
(4)Diffuse、Specular、Ambient相加就得到了物体的shading。
L
=
k
d
(
I
/
r
2
)
m
a
x
(
0
,
n
⋅
l
)
+
k
s
(
I
/
r
2
)
[
m
a
x
(
0
,
n
⋅
h
)
]
p
+
k
a
I
a
L=k_d(I/r^2) max(0,n · l)+k_s(I/r^2) [max(0,n · h)]^p+k_aI_a
L=kd(I/r2)max(0,n⋅l)+ks(I/r2)[max(0,n⋅h)]p+kaIa
下一步就是Shading Frequencies
(1)Flat shading 片元着色:对每个Triangle计算
n
n
n,对每个Triangle进行着色。
(2)Gouraud shading 顶点着色:对三角形的每个Vertex计算
n
n
n,对每个Vertex着色,对Triangle进行渐变着色。
(3)Phong shading:对三角形的每个Vertex计算
n
n
n,对每个Pixel计算渐变
n
n
n,然后对每个Pixel进行着色。
从上图可以看出更小的Triangle和更小的Shading unit可以达到类似的效果。
如何计算每个Vertex的
n
n
n?对Vertex所在的每个Triangle计算法向量(Normal Vectors),然后取平均(一般用面积做加权平均)。
Graphics Pipeline (Real-time Rendering)
图形渲染管线,将之前的这些操作搞成一套完整的流程,主要功能是根据给定的虚拟相机、三维物体和光源等,生成(或渲染)一个二维图像。
GLSL(OpenGL Shading Language)是 OpenGL 的着色器语言,使用C语言编写,运行在 GPU上,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。
可以在https://www.shadertoy.com/view/ld3Gz2练习编写shader code。
游戏中真实的三维场景。
Texture Mapping 纹理映射
为什么需要 Texture呢?https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/06%20Textures/
第八次课
第九次课
如果贴图较小,生成FrameBuffer时需要使用插值算法。点查询。利用重心坐标做差值,最邻近插值、双线性差值、三次差值。
如果贴图较大,或者视距较大,就是范围查询,即一个像素对应了贴图中的多个元素。此时会出现摩尔纹现象,因为一个像素对应纹理坐标中的一块更大的区域,解决方法:超采样;使用区域查询mipmap,层与层之间查询的结果不连续,需要做三线性插值使其连续,缺点是只能做近似的正方形查询,远处模糊;各向异性过滤Anisotropic Filtering,可以做轴方向的矩形查询,但是斜着的矩形不可以;EWA filtering ;
问题 (x,y,w) 为什么w不等于0就表示一个点,否则表示一个向量。
采样为什么不直接使用像素点呢?为什么是三角形
每个像素有深度值和颜色值,为什么还需要纹理属性值?