跳到主要内容
screen-space · 课程
从引导学习开始

建议顺序 04 · Shader 与材质

Screen Space:屏幕坐标不是世界真相

G-buffer 把一次渲染拆成证据层,也把遮挡信息限制在当前视野。

通过位置、法线、深度和材质通道的开关,建立“能从当前帧推断什么”的边界。

未完成

这一课的入口

按你现在的状态开始

内容只有一份。入口只改变阅读顺序,不会把技术结论拆成“简单版”和“专家版”。

直接看代码

概念理解 · 先比较看得见的差异,再为规律命名并补上适用边界。

  • 看现象
  • 比反例
  • 说差异
  • 命名规律
  • 讲因果

引导学习 · 概念理解

先比较看得见的差异,再为规律命名并补上适用边界。

  1. 01 看现象
  2. 02 比反例
  3. 03 说差异
  4. 04 命名规律
  5. 05 讲因果

学习目标

你要能够解释什么

能解释 G-buffer 的通道职责、深度线性化和 screen-space 效果的天然缺陷。

Interview evidence

题库练习

把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。

  • Q06 shader

    SSR 屏幕空间反射

    先自己猜:这道题在考什么?

    参考答案:SSR 从法线和视线得到反射方向,在屏幕空间有限步进,用深度缓冲判断命中,再采样颜色。它只能看到当前屏幕内的证据;走出屏幕或超过预算要承认 miss,用探针/环境图 fallback。移动端主要控制步数、分辨率、深度读取和带宽。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q15 pipeline

    Forward 与 Deferred

    先自己猜:这道题在考什么?

    参考答案:Forward 直接为可见物体计算灯光,透明和材质路径简单,但多灯时片元工作重复;Deferred 先写 G-buffer,再按像素算灯光,适合大量不透明灯,却增加带宽、显存和透明/MSAA 复杂度。具体选择要看场景和平台,不能把“腾讯多采用前向”当成未经验证的内部事实。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

  • Q32 math

    Projection 与 Viewport

    先自己猜:这道题在考什么?

    参考答案:投影矩阵把 view space 点变成 clip space,除以 w 得 NDC,viewport 再映射到像素。分辨率变化要同步 aspect、render scale、深度范围和质量预算;我会用位置/深度 debug 和真实设备 profile 验证。

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

实验循环

按顺序做一次实验

  1. Step 1

    查看 G-buffer 通道

    改什么
    View = albedo / normal / depth
    怎么做
    逐个切换输出通道。
    你会看到
    同一像素在不同通道承载不同类型的证据。
    它代表
    延迟渲染把材质输入与光照计算解耦。

    Code anchor · screen-space.frag.glsl · gBuffer

  2. Step 2

    改变深度范围

    改什么
    Near/Far ratio
    怎么做
    拉大 far plane,观察线性深度的分布。
    你会看到
    非线性深度在远处压缩,线性化后才适合重建。
    它代表
    投影矩阵改变的是深度精度分配,不只是镜头范围。

    Code anchor · screen-space.frag.glsl · linearDepth

  3. Step 3

    制造屏幕边缘缺失

    改什么
    Camera orbit / off-screen object
    怎么做
    让反射或遮挡源离开当前视野。
    你会看到
    screen-space 结果出现断裂或无法回答。
    它代表
    只读当前帧的算法无法访问屏幕之外的几何。

    Code anchor · screen-space.frag.glsl · ray march

快速复习

用三分钟找回因果链

这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。

一句话核心

通过位置、法线、深度和材质通道的开关,建立“能从当前帧推断什么”的边界。

  1. 延迟渲染把材质输入与光照计算解耦。

    画面证据:同一像素在不同通道承载不同类型的证据。

  2. 投影矩阵改变的是深度精度分配,不只是镜头范围。

    画面证据:非线性深度在远处压缩,线性化后才适合重建。

  3. 只读当前帧的算法无法访问屏幕之外的几何。

    画面证据:screen-space 结果出现断裂或无法回答。

代码定位

  • screen-space.frag.glsl · gBuffer
  • screen-space.frag.glsl · linearDepth
  • screen-space.frag.glsl · ray march
打开代码页