快速跳转:
1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)
2、光栅化(反走样、傅里叶变换、卷积)
3、着色计算(深度缓存、着色模型、着色频率)
4、纹理映射(重心坐标插值、透视投影矫正、双线性插值MipMap、环境光遮蔽AO)
5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)
6、阴影映射(Shadow Mapping)
7、光线追踪原理(线面求交、预处理光追加速)
8、辐射度量学与光线追踪
9、蒙特卡洛路径追踪(Path Tracing)(光源采样)
10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
11、渲染前沿技术介绍(双向路径追踪BDPT、MLT、光子映射、实时辐射度、外观建模)
12、相机(视场、曝光、光圈(F-Stop)、薄棱镜近似、CoC、景深)
13、光场、颜色与感知
14、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)
阴影映射(Shadow Mapping)
之前计算着色的时候,并没有考虑遮挡,即有可能着色点跟光源之间会有别的物体或者是自身的某个部位遮挡住光线,这种情况下应该有阴影产生
ShadowMapping特点
- 图像空间中计算的,即生成阴影时不需要场景的几何信息
- 会产生走样现象
- 只能生成点光源的阴影(硬阴影)
阴影映射的思想
- 不在阴影里:能被光源和摄像机同时看道
- 在阴影里:能被相机看到,但不能被光源看到
生成过程
- Step1:在光源处做光栅化,得到光栅图像(不重要)和深度图(二维数组,每个像素存放深度)
- Step2:从摄像机做光栅化,得到光栅图像和深度图(不重要)
- Step3: 把摄像机得到的图像中的每个像素所对应的世界空间中物体的点投影回光源处,得到该点在光源处的处存放的 深度值 ,将此数值跟该 点到光源的距离 做比较(注意用的是世界空间中的坐标,即透视投影之前的,通过在VS中把MV变换之后的顶点坐标存起来,直接传给PS取得)
- if (计算距离 ==深度缓存) 则该点不在阴影里
- if (计算距离 != 深度缓存) 则该点在阴影里**
- 比如下图,相机处的图像结果里面能看见那个点,用这个点的坐标减去光源的坐标取模得到距离d不等于该点对光源做投影得到的像素位置所存放的深度值z,所以这个点必然在阴影之中
遍历所有像素后得到的光栅化阴影计算结果
光源处光栅化场景的结果图:(只要深度图,不要光栅图像)
相机处光栅化结果:(只要光栅图像,不要深度图)
但由于浮点数精度问题,基本不太可能相等,所以会有各种瑕疵。以及老生常谈的采样频率了(阴影贴图分辨率),每个像素做一次or多次采样? 采样率低有锯齿,采样率高耗性能。
硬阴影、软阴影概念
软阴影的必要条件是光源有一定的大小