计算机图形学
文章目录
Transformation
Rotate旋转
R θ = [ cos θ − sin θ sin θ cos θ ] R_\theta = \left[ \begin{matrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{matrix} \right] Rθ=[cosθsinθ−sinθcosθ]
R − θ = [ cos θ sin θ − sin θ cos θ ] = R θ T R_{-\theta} = \left[ \begin{matrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{matrix} \right] = R_\theta^T R−θ=[cosθ−sinθsinθcosθ]=RθT
由定义可知
R
−
θ
=
R
θ
−
1
R_{-\theta} = R_\theta^{-1}
R−θ=Rθ−1
性质:旋转的逆等于旋转矩阵的转置。
由于平移需要无法用单一的矩阵表示,所以引入了齐次坐标(Homogenous Coordinates)
齐次坐标(Homegenous Coordinates)
定义
2D point =
(
x
,
y
,
1
)
T
(x, y, 1)^T
(x,y,1)T
2D vector =
(
x
,
y
,
0
)
T
(x, y, 0)^T
(x,y,0)T
其中,1表示点,0表示向量。
原本的仿射变换(Affine Transformations)为
A
f
f
i
n
e
m
a
p
=
l
i
n
e
a
r
m
a
p
+
t
r
a
n
s
l
a
t
i
o
n
[
x
‘
y
‘
]
=
[
a
b
c
d
]
[
x
y
]
+
[
t
x
t
y
]
Affinemap = linear map + translation\\ \left[\begin{matrix} x^‘ \\ y^‘ \end{matrix}\right] = \left[\begin{matrix} a & b \\ c & d \end{matrix}\right]\left[\begin{matrix} x \\ y \end{matrix}\right] + \left[\begin{matrix} t_x \\ t_y \end{matrix}\right]
Affinemap=linearmap+translation[x‘y‘]=[acbd][xy]+[txty]
使用齐次坐标之后
[
x
‘
y
‘
w
‘
]
=
[
1
0
t
x
0
1
t
y
0
0
1
]
[
x
y
1
]
=
[
x
+
t
x
y
+
t
y
1
]
\left[\begin{matrix} x^‘\\ y^‘ \\ w^‘ \end{matrix}\right] = \left[\begin{matrix} 1 & 0 & t_x \\0 & 1 & t_y \\ 0 & 0 & 1\end{matrix} \right]\left[\begin{matrix} x \\ y \\ 1 \end{matrix}\right] = \left[\begin{matrix} x + t_x \\ y + t_y \\ 1 \end{matrix}\right]
⎣⎡x‘y‘w‘⎦⎤=⎣⎡100010txty1⎦⎤⎣⎡xy1⎦⎤=⎣⎡x+txy+ty1⎦⎤
由于
[
x
y
w
]
=
[
x
/
w
y
/
w
1
]
\left[\begin{matrix} x \\ y \\ w \end{matrix}\right] = \left[\begin{matrix} x / w \\ y /w \\ 1 \end{matrix}\right]
⎣⎡xyw⎦⎤=⎣⎡x/wy/w1⎦⎤
所以point + point 表示两个点的中点,并且point和vector的运算仍满足定义。
并且齐次坐标可以将很多种表示成同样的形式,包括缩放(scale)、旋转(Rotation)、平移(Translation)
组合变换(Composing Transforms)
惯例:先旋转再平移
从矩阵角度来说就是一连串的左乘矩阵
并且一系列复杂的操作都可以转换为,先移动到原点,然后进行变换,再移动回原始位置
3D Transformations三维空间变换类比于2D Transformations二维变换
Shading
Shading
Blinn-Phong reflectance model
Illumination光照
-
漫反射 Diffuse reflection
-
高光Specular highlights
高光是由观察方向和镜面反射方向足够接近时观察到的。
观察到高光时,半程向量和法向量应该是比较接近的。
-
使用半程向量的好处:
- 相比于知道入射角和法向量,求出射角,使用半程向量的计算量更小。
- p的引入,可以减小看见高光的夹角范围,更符合真实情况。
-
环境光照Ambient lighting
- 假设环境光获得光照强度为一个常数;
- 作用:
- 保证没有地方是黑的,所有光照加起来,提升一个亮度。
-
效果
Specular and ambient terms
Shading Frequencies
Shade each triangle(flat shading)
Shade each vertex(Gouraud shading)
-
顶点的法向量求法
相邻三角形法向量的加权平均
Shade each pixel (Phong shading)
利用顶点法向量和重心坐标,插值出像素的法向量
Graphic Pipeline (Real-time rendering)
但大部分功能都由显卡帮我们做了,所以实时渲染主要工作是编程控制顶点和像素的着色,即可编程渲染管线。
Shadertoy
Texture Mapping(纹理映射)
作用
在着色时,定义具体位置点的基本属性。
知道三角形顶点的纹理之后,需要
Interpolation across triangles:三角形插值
目的
在得到三角形顶点值后,希望内部能做平滑过渡
哪些插值
- 颜色
- uv
- 法线
工具:Barycentric coordinates
介绍
其中,三个系数可以通过内部三角形面积比得到
重心把大三角形均匀分为3分,其3个系数均为1/3
使用
问题
在投影变换下,不能保证重心坐标不变。
所以在三维空间投影插值时,需要先做插值,然后再做投影
纹理查询
纹理的应用
比如在颜色插值后,得到对应的颜色,对于Blinn-Phong模型,颜色就是其中的kd。
纹理放大
用在纹理不够大的场景,但是不想直接四舍五入的方式处理中间像素点,可以使用如下方法
Bilinear interpolation
双线性插值
一个点考虑其周围四个点的颜色,做双线性插值,就可以达到平滑颜色的效果
Bicubic interpolation
使用周围16个像素点来进行插值
也就是说,好的质量一般都会伴随计算的开销,在达到好的质量之后,再考虑如何保持质量,降低计算开销。
纹理缩小
处理纹理太大的场景。
解决方法为放弃采样,直接获取一个区域内的平均值,使用Mipmap
Mipmap
allow (fast,approx,Square) range quary
可以在渲染之前,生成mipmap
三线性插值
Anisotropic Filtering 各项异性过滤
相比于Mipmap,将右上和左下的正方形替换为很多的矩形,用于处理图形中,一个像素覆盖矩形的范围查询。
EWA Filtering
在各项异性过滤的基础上,将很多不规则的图形拆分成为多个不同的椭圆形,就可以处理各种长条形区域。