Split-Sum IBL
整理 PBR IBL 中 Irradiance Map、Prefiltered Environment Map 与 BRDF LUT 的拆分思路和运行时组合方式。
整理 PBR IBL 中 Irradiance Map、Prefiltered Environment Map 与 BRDF LUT 的拆分思路和运行时组合方式。
对比 PBR 中 Metallic-Roughness 与 Specular-Glossiness 两种材质工作流的贴图结构、能量守恒约束和显存开销。
记录高度场地形、三角形与四叉树细分的基本思路,以及地形 LOD 和层级管理问题。
整理 GPU 执行架构、渲染资源组织、可见性裁剪、纹理压缩与 Cluster/Nanite 模型管线。
按路径追踪、几何与 BVH、材质接口、PBR 和 IBL/MIS 梳理个人渲染器的代码职责与工程优化。
整理个人 CPU 路径追踪器的模块分工、PBR 与 IBL、MIS 采样及 BVH 和多线程性能优化。
一:Whitted-style 光线追踪 流程: 从相机发出主光线 命中物体之后根据材质种类继续发射: 反射光线 折射光线 阴影光线 最后通过递归计算所有光线对像素的贡献值 主要用于模拟直接光照与理想情况下的反射、折射现象,对于真实世界的漫反射、全局光照、颜色渗透等并不擅长,因为它的路径通常是确定的:遇到镜面就反射,遇到玻璃就折射。 二:Monte Carlo 路径追踪 流程: 从相机发出射线 命中物体后根据 BRDF 随机选择次级射线发射方向 漫反射方向 高光方向 透射方向 …… 经过多次采样之后求得平均值 因为光线传播方向的多样性,路径追踪可以很好地模拟诸如漫反射间接光、软阴影、全局光照等现象。 三:简单对比 项目 递归式光线追踪 路径追踪 代表算法 Whitted Ray Tracing Monte Carlo Path Tracing 光线传播 反射、折射递归分支 随机采样一条或多条路径 主要效果 镜面、玻璃、阴影 全局光照、软阴影、间接光 漫反射间接光 通常不自然支持 天然支持 结果 比较干净 有噪声,需要采样收敛 成本 相对低 通常更高 物理真实性 有限 更接近物理真实
一:Linear Blending 代码实现: 1 2float3 normal_1 = tex2D(normal_tex1, uv).xyz * 2.0f - 1.0f; 3 4float3 normal_2 = tex2D(normal_tex2, uv).xyz * 2.0f - 1.0f; 5 6float3 n = normalize(normal_1 + normal_2); 这是一种非常暴力的方法,实现起来也是最简单的(相加后再归一化即可);虽然最终可以实现混合法线贴图的效果,但是会导致混合后的法线变平,细节也就会更加模糊 产生这种结果的原因有两个,可以分别从几何维度与物理维度的方向来分析: 1.几何维度: 法线本质上是定义在球面上的向量,当我们使用线性的公式对两个法线向量进行混合时,计算的路径实际上是沿着“弦”而非“弧”进行的;这会导致两个法线向量相加得到的中间向量的模始终小于 1,虽然可以通过normalize 将模长拉回至 1,但这又会使得“** 角速度非均匀** ”,表现在混合后的法线上就是:混合结果在中间部分的变化比两端更慢,并且高频的法线会在这种非线性的映射中被抹平,产生“细节模糊”;细节模糊的另一个原因是——当两个法线的方向差异过大(接近180度,也就是反向)时,这样的线性混合得到的结果会趋近于垂直向上,丢失了原有的细节 2.物理维度: 法线贴图存储的并不是颜色,而是物体表面的偏导数(斜率),如果使用处理颜色的办法去混合两个法线,只会导致数据的平均,而不是细节的叠加 e.g. 有两张法线贴图,一张代表“砖块的粗糙纹理”,另一张代表“划痕”,线性混合的行为逻辑是:“我有 50% 像砖块,50% 像划痕”, 但真实的逻辑应该是:“在砖块的斜率基础上,叠加划痕的斜率” 代码实现: 1 2float3 normal_1 = tex2D(normal_tex1, uv).xyz * 2.0f - 1.0f; 3 4float3 normal_2 = tex2D(normal_tex2, uv).xyz * 2.0f - 1.0f; 5 6float3 n = normal_1 < 0.5 ? 2 * normal_1 * normal_2 : 1 – 2 * (1 - normal_1) * (1 - normal_2); 7 8n = normalize(n * 2 - 1); 相比于线性混合,Overlay Blending 是对两张法线贴图进行了类似 PS 中“正片叠底”的处理,虽然 overlay 对于增强二维图像的对比度又很好的效果,但是法线贴图本身并不应该被当作颜色贴图进行处理;overlay 并不理解法线贴图存储的是斜率信息,因此他会对x、y、z分量无差别地进行非线性缩放,这会导致严重的数学错误与视觉伪影 三:Partical Derivative Blending 代码实现: 1 2float3 normal_1 = tex2D(texBase, uv).xyz*2 - 1; 3 4float3 normal_2 = tex2D(texDetail, uv).xyz*2 - 1; 5 6float2 pd = normal_1.xy/normal_1.z + normal_2.xy/normal_2.z; //Add the PDs 7 8float3 n = normalize(float3(pd, 1)); 根据导数的线性性质: $$ \frac{\partial F_{total}}{\partial x} = \frac{\partial f_1}{\partial x} + \frac{\partial f_2}{\partial x} $$可以得知要想混合两个法线,需要对它们在切空间中对应的表面梯度进行线性累加,然后将合成后的梯度重新投影回法线空间 ...
整理从像素坐标生成相机光线的空间变换流程,以及三角形求交的基础实现。
整理 Game Object 与组件化、Tick 更新、事件交互和场景空间管理的基本思路。