计算机图形学学习整理
计算机图形学学习整理
这篇笔记按 GAMES101 的思路来写,目标很简单:先弄清楚图形学在干什么,再把几条最核心的公式串起来。
图形学本质上是在做一件事:把三维空间里的物体,经过一系列变换和计算,变成屏幕上的二维像素。
1. 图形学流水线 Vulkan Direct3D 12 Metal OpenGL
一个典型的渲染流程可以拆成几步:
- 模型空间中的顶点进入管线
- 经过模型、观察、投影变换
- 进入光栅化阶段,变成片元
- 片元经过插值、深度测试和着色
- 写入帧缓冲,显示到屏幕
最常见的坐标变化链路可以写成:
这里:
- 是模型坐标系下的点
- 是模型变换
- 是观察变换
- 是投影变换
- 是裁剪空间坐标
2. 齐次坐标和矩阵变换 OpenGL Vulkan
为了把平移、旋转、缩放统一到一个框架里,图形学里通常用齐次坐标:
这样,平移也能写成矩阵乘法。对一个点做仿射变换时,统一用 矩阵表示会更方便。
常见变换
- 平移:改变物体位置
- 缩放:改变物体大小
- 旋转:改变物体朝向
如果把变换写成矩阵,组合多个操作时只要连乘即可。注意矩阵乘法不满足交换律,所以顺序不能乱。
3. 观察与投影 OpenGL Vulkan
观察变换的作用,是把世界坐标转到相机坐标。可以理解成把相机放在原点,统一看场景。
投影分两类:
- 正交投影:平行线保持平行
- 透视投影:远处物体看起来更小,更符合真实视觉
透视投影的关键是透视除法:
这里的 很重要,它决定了“近大远小”的效果。
4. 光栅化 Mesh Shader Deferred Rendering Forward+
光栅化就是把三角形覆盖到哪些像素上这件事算出来。三角形是图形学里最常用的基本图元,因为它稳定、简单,也方便插值。
判断一个像素是否在三角形内,常见方法是用重心坐标。对三角形顶点 ,任一点 可以表示为:
并且满足:
如果 都在 内,点通常就在三角形内部。
属性插值
光栅化不只是判断覆盖,还要把顶点属性插到片元上,比如颜色、法线、纹理坐标。
线性插值可以写成:
如果考虑透视校正,常用的是:
然后再对属性做除法修正。这个步骤很关键,不然纹理会拉伸得不对。
5. 深度测试 Shadow Mapping
屏幕上一个像素可能被多个三角形覆盖,这时要决定谁在前面。最常见的方法是 Z-Buffer。
思路很直接:记录每个像素当前最小的深度值,只保留更靠近相机的片元。
深度值越小,通常表示越靠近相机。这样就能解决遮挡关系。
6. 着色 PBR Compute Shader
着色关心的是“这个点应该显示成什么颜色”。GAMES101 里最重要的一个起点,是局部光照模型。
Phong 光照模型
经典的 Phong 模型通常写成:
其中:
- 是环境光
- 是入射光强
- 分别是环境、漫反射和高光系数
- 是法线
- 是光照方向
- 是反射方向
- 是视线方向
- 控制高光大小
漫反射
漫反射和入射角有关,常见写法是:
这个公式可以直接理解成:角度越正,对表面的照亮越强。
插值着色
- Flat Shading:一个三角形一个颜色,最快,但比较硬
- Gouraud Shading:在顶点算光照,再插值颜色
- Phong Shading:插值法线,再逐像素算光照,效果最好
7. 纹理映射 glTF 2.0 PBR
纹理映射的作用,是把二维图片贴到三维物体表面上。每个顶点除了位置,还会带一个纹理坐标 。
取样时,常见做法是:
其中 是纹理图。真正工程里,最近邻、双线性过滤都会影响最终效果。
8. 抗锯齿 TAA Super Resolution Temporal Reconstruction
锯齿本质上是采样不足。屏幕是离散像素,但几何图元是连续的,所以边缘容易出现不平滑。
解决思路通常是超采样:
也就是对一个像素内多个采样点求平均。样本越多,边缘越平滑,但成本也越高。
9. 光线追踪 Hardware Ray Tracing / DXR Hybrid Rendering Denoising
光栅化擅长实时渲染,光线追踪更擅长模拟真实光照。
一条光线通常写成:
其中 是起点, 是方向,。
球体求交
如果球心是 ,半径是 ,则满足:
展开后会得到一个二次方程,解出最小的正根,就是最近交点。
光线追踪的优点是反射、折射、阴影都更自然;缺点是计算量大,所以真实项目里通常要配合加速结构。
10. 加速结构 BLAS / TLAS
如果场景里有很多三角形,逐个求交太慢。常见做法是加 BVH 这类空间划分结构,先快速排除不可能命中的区域,再做精确求交。
这样可以把“先扫一遍全部物体”变成“先找候选,再精算”,性能会好很多。
11. 目前主流技术
如果把 GAMES101 里的内容放到今天的工程里看,主流技术大致可以这样对照。下面每一项都放了一个可直接打开的学习入口。
12. 小结
GAMES101 最重要的不是把每个公式背下来,而是把整条管线串起来。
- 变换负责把点送到正确的位置
- 光栅化负责把三角形变成像素
- 着色负责决定像素的颜色
- 光线追踪负责更真实地模拟光
把这几步理解清楚,后面学 OpenGL、Vulkan、PBR、Ray Tracing,都会顺很多。
部分内容可能已过时
WindHolm