Split-Sum IBL

整理 PBR IBL 中 Irradiance Map、Prefiltered Environment Map 与 BRDF LUT 的拆分思路和运行时组合方式。

June 20, 2026 · 2 min · 榎aaaa

PBR 材质模型

对比 PBR 中 Metallic-Roughness 与 Specular-Glossiness 两种材质工作流的贴图结构、能量守恒约束和显存开销。

June 18, 2026 · 1 min · 榎aaaa

GAMES104:大气与云的渲染

记录高度场地形、三角形与四叉树细分的基本思路,以及地形 LOD 和层级管理问题。

June 14, 2026 · 1 min · 榎aaaa

GAMES104:渲染实践

整理 GPU 执行架构、渲染资源组织、可见性裁剪、纹理压缩与 Cluster/Nanite 模型管线。

June 9, 2026 · 1 min · 榎aaaa

Pathtracer 梳理

按路径追踪、几何与 BVH、材质接口、PBR 和 IBL/MIS 梳理个人渲染器的代码职责与工程优化。

June 2, 2026 · 3 min · 榎aaaa

CPU 路径追踪器项目细节

整理个人 CPU 路径追踪器的模块分工、PBR 与 IBL、MIS 采样及 BVH 和多线程性能优化。

May 26, 2026 · 4 min · 榎aaaa

Whitted-style 光线追踪与 Monte Carlo 路径追踪的主要区别

一:Whitted-style 光线追踪 流程: 从相机发出主光线 命中物体之后根据材质种类继续发射: 反射光线 折射光线 阴影光线 最后通过递归计算所有光线对像素的贡献值 主要用于模拟直接光照与理想情况下的反射、折射现象,对于真实世界的漫反射、全局光照、颜色渗透等并不擅长,因为它的路径通常是确定的:遇到镜面就反射,遇到玻璃就折射。 二:Monte Carlo 路径追踪 流程: 从相机发出射线 命中物体后根据 BRDF 随机选择次级射线发射方向 漫反射方向 高光方向 透射方向 …… 经过多次采样之后求得平均值 因为光线传播方向的多样性,路径追踪可以很好地模拟诸如漫反射间接光、软阴影、全局光照等现象。 三:简单对比 项目 递归式光线追踪 路径追踪 代表算法 Whitted Ray Tracing Monte Carlo Path Tracing 光线传播 反射、折射递归分支 随机采样一条或多条路径 主要效果 镜面、玻璃、阴影 全局光照、软阴影、间接光 漫反射间接光 通常不自然支持 天然支持 结果 比较干净 有噪声,需要采样收敛 成本 相对低 通常更高 物理真实性 有限 更接近物理真实

May 14, 2026 · 1 min · 榎aaaa

如何混合法线贴图

一: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} $$可以得知要想混合两个法线,需要对它们在切空间中对应的表面梯度进行线性累加,然后将合成后的梯度重新投影回法线空间 ...

May 10, 2026 · 1 min · 榎aaaa

GAMES101 作业 5:基础光线追踪

整理从像素坐标生成相机光线的空间变换流程,以及三角形求交的基础实现。

March 26, 2026 · 3 min · 榎aaaa

GAMES104:如何构建游戏世界

整理 Game Object 与组件化、Tick 更新、事件交互和场景空间管理的基本思路。

March 26, 2026 · 1 min · 榎aaaa