学习目标
你要能够解释什么
能解释 G-buffer 的通道职责、深度线性化和 screen-space 效果的天然缺陷。
Interview evidence
题库练习
把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。
-
SSR 屏幕空间反射
先自己猜:这道题在考什么?
参考答案:SSR 从法线和视线得到反射方向,在屏幕空间有限步进,用深度缓冲判断命中,再采样颜色。它只能看到当前屏幕内的证据;走出屏幕或超过预算要承认 miss,用探针/环境图 fallback。移动端主要控制步数、分辨率、深度读取和带宽。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
Forward 与 Deferred
先自己猜:这道题在考什么?
参考答案:Forward 直接为可见物体计算灯光,透明和材质路径简单,但多灯时片元工作重复;Deferred 先写 G-buffer,再按像素算灯光,适合大量不透明灯,却增加带宽、显存和透明/MSAA 复杂度。具体选择要看场景和平台,不能把“腾讯多采用前向”当成未经验证的内部事实。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
Projection 与 Viewport
先自己猜:这道题在考什么?
参考答案:投影矩阵把 view space 点变成 clip space,除以 w 得 NDC,viewport 再映射到像素。分辨率变化要同步 aspect、render scale、深度范围和质量预算;我会用位置/深度 debug 和真实设备 profile 验证。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
实验循环
按顺序做一次实验
-
Step 1
查看 G-buffer 通道
- 改什么
- View = albedo / normal / depth
- 怎么做
- 逐个切换输出通道。
- 你会看到
- 同一像素在不同通道承载不同类型的证据。
- 它代表
- 延迟渲染把材质输入与光照计算解耦。
Code anchor · screen-space.frag.glsl · gBuffer
-
Step 2
改变深度范围
- 改什么
- Near/Far ratio
- 怎么做
- 拉大 far plane,观察线性深度的分布。
- 你会看到
- 非线性深度在远处压缩,线性化后才适合重建。
- 它代表
- 投影矩阵改变的是深度精度分配,不只是镜头范围。
Code anchor · screen-space.frag.glsl · linearDepth
-
Step 3
制造屏幕边缘缺失
- 改什么
- Camera orbit / off-screen object
- 怎么做
- 让反射或遮挡源离开当前视野。
- 你会看到
- screen-space 结果出现断裂或无法回答。
- 它代表
- 只读当前帧的算法无法访问屏幕之外的几何。
Code anchor · screen-space.frag.glsl · ray march
快速复习
用三分钟找回因果链
这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。
一句话核心
通过位置、法线、深度和材质通道的开关,建立“能从当前帧推断什么”的边界。
- 延迟渲染把材质输入与光照计算解耦。
画面证据:同一像素在不同通道承载不同类型的证据。
- 投影矩阵改变的是深度精度分配,不只是镜头范围。
画面证据:非线性深度在远处压缩,线性化后才适合重建。
- 只读当前帧的算法无法访问屏幕之外的几何。
画面证据:screen-space 结果出现断裂或无法回答。
代码定位
- screen-space.frag.glsl · gBuffer
- screen-space.frag.glsl · linearDepth
- screen-space.frag.glsl · ray march