8.Shader概念基础总结

  1. 8.Shader概念基础总结
    1. 8.1 核心要点速览
      1. 渲染管线
        1. 概述
        2. 应用阶段
        3. 几何阶段
        4. 光栅化阶段
      2. Shader开发是什么
      3. 如何学习Shader开发
      4. Shader开发必备概念
    2. 8.2 面试题精选
      1. 基础题
        1. 1. 渲染管线三大阶段是什么?执行顺序怎么记?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        2. 2. 为什么说应用阶段常常是 CPU 瓶颈、DrawCall 多要小心?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        3. 3. 几何阶段顶点着色器一般能改什么?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        4. 4. 光栅化阶段片元着色器主要负责什么?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        5. 5. 「Shader 开发」在渲染管线里通常指改哪两段?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        6. 6. 学 Shader 开发常说要补哪三类知识?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
      2. 进阶题
        1. 1. 模型空间 → 世界空间 → 裁剪空间,这类变换在面试里怎么表述更稳?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        2. 2. 图元裁剪和片元阶段的深度测试,直觉上差在哪一层?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        3. 3. 图形 API、渲染管线、Shader 三者关系一句话怎么说清?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        4. 4. 同样写着色器,HLSL 和 GLSL 面试常问的差异有哪些?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
      3. 深度题
        1. 1. 跨图形 API 或跨引擎时,「坐标系差异」具体会坑在什么计算上?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        2. 2. 「片元」和「像素」为什么面试里喜欢区分?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章
        3. 3. 如何判断卡顿更像 CPU(应用阶段)还是 GPU(几何/光栅化)?
          1. 题目
          2. 深入解析
          3. 答题示例
          4. 参考文章

8.Shader概念基础总结


8.1 核心要点速览

渲染管线

概述

渲染管线(流水线)的核心逻辑是 将数据分阶段转化为屏幕图像的过程,其关键要素可拆解为:

  • 数据来源:游戏场景中部署的 模型、光源、摄像机 等内容的底层信息;
  • 阶段划分:渲染流程的三大核心阶段,按顺序依次为:
    应用阶段 ——> 几何阶段 ——> 光栅化阶段

通过上述阶段对数据的逐步处理,最终在屏幕上生成可视化的渲染结果。

应用阶段

应用阶段是渲染管线中 由CPU主导 的核心环节,核心使命是 为后续渲染流程提供基础数据

  • 数据类型:涵盖顶点、法线、切线、纹理坐标、变换矩阵、材质属性等关键信息;
  • 开发逻辑:开发者只需 遵循Unity引擎规则 进行场景搭建、逻辑编写等工作,即可驱动该阶段运行;
  • 性能优化:当 DrawCall数量过多 时,会引发CPU侧性能瓶颈,可通过 批处理技术(合并绘制指令)优化。

几何阶段

几何阶段是渲染管线中 由GPU主导 的处理环节,核心围绕三维几何数据的加工与筛选展开:

  • 核心任务:对模型 顶点数据 进行计算(如位置修正、属性赋值),完成 坐标空间转换(例:模型空间→世界空间→裁剪空间的映射),并执行 图元裁剪(剔除屏幕视野外的无效几何,降低后续渲染压力);
  • 开发可干预点:通过 自定义顶点着色器 编写逻辑,修改顶点的位置、颜色等属性,实现顶点动画、风格化形变等独特画面效果。

光栅化阶段

光栅化阶段是渲染管线中 由GPU主导 的核心流程,核心围绕 片元的最终渲染决策 展开:

  • 核心任务:通过深度测试、透明度测试等逻辑,判定片元是否最终渲染;同时融合光照、纹理、材质等信息,计算片元的 最终渲染颜色
  • 开发可干预点:通过 自定义片元着色器 编写逻辑,控制片元的色彩、透明度、特效(如卡通渲染、辉光、溶解效果等),实现差异化画面表现。

Shader开发是什么

Shader开发的核心是 通过自定义逻辑处理渲染管线中的数据,以此决定最终渲染效果:

  • 本质逻辑:介入渲染管线的几何阶段(如顶点着色)、光栅化阶段(如片元着色),对顶点、片元等数据进行编程改造;
  • 实现形式:通过编写Shader代码,控制光照计算、纹理融合、颜色输出等渲染细节,实现卡通风格、辉光、溶解等定制化视觉效果。

如何学习Shader开发

学习Shader开发,需构建三类核心知识体系:

  • 数学知识:矩阵运算、向量变换、光照模型等(支撑坐标转换、光影计算的底层逻辑);
  • 语法知识:掌握Shader编程语言规则(如HLSL、GLSL,或Unity的ShaderLab语法);
  • 着色器开发知识:理解渲染管线阶段的干预逻辑(如顶点/片元着色器的工作流程与编程方法)。

掌握以上内容后,即可 按需求处理渲染数据,最终在屏幕呈现符合设计的图像效果。

Shader开发必备概念

  • 渲染管线与图形接口的关系:图形接口程序(如 OpenGLDX 等)是开发者与硬件交互的中间层,提供对渲染管线的控制与管理功能 。
  • Shader与图形接口的关系:Shader 属于 图形接口程序 的组成部分,用于编写渲染管线内的数据处理逻辑 。
  • 不同图形接口的影响:开发语言存在差异(如 DX 采用 HLSLOpenGL 常用 GLSL ),且坐标系规则不同(原点位置、轴向定义有别,需调整坐标计算逻辑) 。

8.2 面试题精选

基础题

1. 渲染管线三大阶段是什么?执行顺序怎么记?

题目

应用阶段、几何阶段、光栅化阶段各自在干什么?谁先谁后?

深入解析
  • 应用阶段(CPU):准备场景与绘制所需数据(网格、材质、变换、相机等),发出绘制指令。
  • 几何阶段(GPU):处理顶点、做空间变换与裁剪相关准备,顶点着色器在此介入。
  • 光栅化阶段(GPU):光栅化生成片元,深度/模板/透明度等测试与着色,片元/像素着色器在此介入。
  • 顺序固定为 应用 → 几何 → 光栅化,输出最终写入帧缓冲的颜色(再经显示等链路)。
答题示例

先 CPU 准备数据和 DrawCall,再 GPU 做顶点侧几何处理,最后光栅化成片元并着色;顶点着色在几何阶段,片元着色在光栅化阶段。

参考文章
  • 1.渲染管线-概述

2. 为什么说应用阶段常常是 CPU 瓶颈、DrawCall 多要小心?

题目

批处理大致在优化什么?

深入解析
  • 应用阶段负责 场景遍历、提交绘制、资源绑定与状态切换;DrawCall 过多会导致 CPU 忙于发令与状态变更,GPU 反而等数据。
  • 批处理通过合并网格、合批、实例化等方式 减少绘制提交次数或合并绘制,降低 CPU 侧开销(具体手段依引擎与管线而定)。
答题示例

DrawCall 多主要是 CPU 提交和状态切换忙不过来;批处理就是想办法少提交、少切状态,让 CPU 轻一点。

参考文章
  • 2.渲染管线-应用阶段

3. 几何阶段顶点着色器一般能改什么?

题目

坐标空间变换常发生在哪里?

深入解析
  • 顶点着色器按顶点执行,可改 位置、颜色、UV 等 per-vertex 输出,常见用途包括 模型空间→齐次裁剪空间 的路径上的变换与自定义位移(如顶点动画)。
  • 裁剪作为管线概念在几何阶段相关流程中处理视野外图元;实现细节随 API/硬件演进略有差异,面试答「顶点侧准备、图元级剔除逻辑」即可。
答题示例

顶点着色器按顶点跑,主要动位置和各种顶点属性,空间变换大都在几何阶段这条链上完成,再做裁剪减轻后面压力。

参考文章
  • 3.渲染管线-几何阶段

4. 光栅化阶段片元着色器主要负责什么?

题目

和顶点着色器的输出有什么关系?

深入解析
  • 光栅化把图元离散为 片元(可理解为「候选像素」及其插值属性);片元着色器计算 颜色、透明度 等,并可参与后续测试与混合。
  • 顶点着色器的输出经 插值 成为片元着色器输入;最终是否显示还受 深度测试、透明度测试、混合 等影响。
答题示例

光栅化出片元,片元着色器算每个候选像素的颜色;顶点那边算好的量会插值进来,最后能不能画上屏还要看深度、透明、混合这些测试。

参考文章
  • 4.渲染管线-光栅化阶段

5. 「Shader 开发」在渲染管线里通常指改哪两段?

题目

和固定管线时代对比,直觉差异是什么?

深入解析
  • 现代管线中,开发者主要通过 可编程着色器 介入 顶点阶段(顶点着色器)光栅化后的片元阶段(片元/像素着色器)
  • 本质是用代码定义 如何变换顶点、如何给片元赋色,从而控制光照、纹理、风格化等最终观感。
答题示例

就是写顶点和片元着色器:顶点管几何和每顶点数据,片元管颜色和材质效果,合起来决定画面长什么样。

参考文章
  • 5.Shader开发是什么

6. 学 Shader 开发常说要补哪三类知识?

题目

它们分别解决什么问题?

深入解析
  • 数学:矩阵、向量、光照模型等,支撑 坐标变换与光照计算
  • 语法:HLSL/GLSL/ShaderLab 等,支撑 把想法写成可执行着色器代码
  • 着色器与管线知识:各阶段数据流与可编程入口,支撑 知道在哪改、改什么才有效
答题示例

数学算变换和光;语法把逻辑写进 GPU;再加上管线里顶点片元各自干什么,才知道怎么下手写效果。

参考文章
  • 6.如何学习Shader开发

进阶题

1. 模型空间 → 世界空间 → 裁剪空间,这类变换在面试里怎么表述更稳?

题目

为什么要分多空间,不直接在一种空间里算?

深入解析
  • 模型空间:建模局部坐标,方便美术与骨骼动画。
  • 世界空间:场景统一坐标,方便光照、物理与多物体关系。
  • 裁剪/齐次空间:方便 投影、裁剪与透视除法,为光栅化做准备。
  • 分空间是为了 职责清晰、公式标准、与管线阶段对齐;顶点着色器常承担 串联多种变换 的职责(具体矩阵乘积顺序以实现为准)。
答题示例

模型空间方便建模,世界空间统一场景,再到裁剪空间做投影和裁剪;顶点着色器里常把这些矩阵串起来,把顶点送到正确位置给光栅化。

参考文章
  • 3.渲染管线-几何阶段
  • 1.渲染管线-概述

2. 图元裁剪和片元阶段的深度测试,直觉上差在哪一层?

题目

谁更偏「几何块」,谁更偏「像素竞争」?

深入解析
  • 图元裁剪:面向 三角形等图元,去掉视野外或无效图元,减少后续光栅化量。
  • 深度测试:面向 片元/像素,在 framebuffer 上解决 前后遮挡,决定保留哪个片元的颜色。
  • 二者粒度不同:前者减几何工作量,后者解决可见性竞争
答题示例

裁剪是对三角形这种大块几何动手,深度测试是片元级别谁离相机近谁留下,解决的问题一个是少算,一个是遮挡。

参考文章
  • 3.渲染管线-几何阶段
  • 4.渲染管线-光栅化阶段

3. 图形 API、渲染管线、Shader 三者关系一句话怎么说清?

题目

Shader 算不算「API 之外」的独立程序?

深入解析
  • 图形 API(OpenGL、DirectX、Vulkan、Metal 等)是 CPU 侧调用 GPU 的接口与驱动模型,负责资源、状态与绘制提交。
  • 渲染管线GPU 上数据变为像素的阶段化流程(概念模型与具体实现随 API/硬件演进)。
  • Shader 是跑在 GPU 上的 可编程阶段程序,由 API/引擎编译与绑定,属于图形栈的一部分,不是脱离 API 单独存在的黑盒。
答题示例

API 在 CPU 上指挥 GPU;管线是 GPU 里走的一连串阶段;Shader 是其中可编程的几段程序,由 API 和引擎编译绑定上去跑。

参考文章
  • 7.Shader开发必备概念

4. 同样写着色器,HLSL 和 GLSL 面试常问的差异有哪些?

题目

Unity ShaderLab 里的 CG/HLSL 大致站在哪一侧?

深入解析
  • 语言与生态:HLSL 偏 DirectX / 主机与 Windows 系;GLSL 偏 OpenGL / 部分跨平台栈(现代还会遇到 SPIR-V 等中间表示,依项目而定)。
  • 语法细节:入口、语义、内置变量名、纹理采样函数名等 各不相同,移植要改接口层。
  • Unity:内置管线时代常见 ShaderLab + HLSL/CG 系;与纯 GLSL 移动端/自研引擎路径不同,面试要说清 目标平台与管线
答题示例

主要是语法和内置库不一样,HLSL 跟 DX 系一条线,GLSL 跟 GL 一条线;Unity 里常用 ShaderLab 包 HLSL,和原生 GLSL 工程不是同一套写法,跨平台要按目标 API 对齐。

参考文章
  • 7.Shader开发必备概念
  • 6.如何学习Shader开发

深度题

1. 跨图形 API 或跨引擎时,「坐标系差异」具体会坑在什么计算上?

题目

举两个需要复查的地方。

深入解析
  • 手系与轴向:左右手、Y-up / Z-up、前向轴定义不同会导致 法线、叉乘、相机前向、立方体贴图采样方向 等符号反了。
  • 深度与范围:NDC 深度范围、0~1 与 −1~1、反向 Z 等策略因 API/管线而异,影响 深度测试与线性深度重建
  • 纹理 V 方向:部分 API/图像空间 V 轴翻转 不一致,影响 法线贴图、后处理采样
答题示例

手系和哪个轴朝上不统一,法线和叉乘容易反;深度在 NDC 里范围和方向各 API 不一样,做深度相关效果要核对;有的还要管纹理 V 是否翻转。

参考文章
  • 7.Shader开发必备概念

2. 「片元」和「像素」为什么面试里喜欢区分?

题目

一个片元一定会变成屏幕上的一个像素吗?

深入解析
  • 片元是光栅化产生的 候选着色单位,携带插值属性;要经过 深度、模板、裁剪窗口、混合 等后才可能更新 framebuffer。
  • 像素更偏 输出图像上的离散格子;MSAA、子采样、丢弃片元等情况都会导致 片元数与最终像素覆盖关系不是简单一一对应
  • 答「片元是候选,像素是结果」即可体现理解深度。
答题示例

片元是管线里待测试待混合的候选,像素更多是最终图像上的点;可能被丢弃、被遮挡或参与 MSAA,所以不一定一一对应。

参考文章
  • 4.渲染管线-光栅化阶段

3. 如何判断卡顿更像 CPU(应用阶段)还是 GPU(几何/光栅化)?

题目

和 DrawCall、分辨率、overdraw 各自什么关系?

深入解析
  • CPU 侧:Profiler 里 主线程忙、提交多、状态切换频繁,DrawCall/批次数暴涨时常指向应用阶段。
  • GPU 侧顶点过多、片元过重、带宽大、复杂后处理,或 过高分辨率与严重 overdraw,帧时间卡在 GPU 时间轴上。
  • 实际项目要用 引擎 Profiler、GPU 捕获工具 交叉验证,避免凭感觉归因。
答题示例

看分析器:CPU 忙在提交和场景逻辑就多从 DrawCall、批处理查;GPU 时间长就从顶点数、片元开销、分辨率和 overdraw 查,最好 GPU 抓帧确认。

参考文章
  • 2.渲染管线-应用阶段
  • 4.渲染管线-光栅化阶段


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏