8.Shader概念基础总结
8.1 核心要点速览
渲染管线
概述
渲染管线(流水线)的核心逻辑是 将数据分阶段转化为屏幕图像的过程,其关键要素可拆解为:
- 数据来源:游戏场景中部署的 模型、光源、摄像机 等内容的底层信息;
- 阶段划分:渲染流程的三大核心阶段,按顺序依次为:
应用阶段 ——> 几何阶段 ——> 光栅化阶段
通过上述阶段对数据的逐步处理,最终在屏幕上生成可视化的渲染结果。
应用阶段
应用阶段是渲染管线中 由CPU主导 的核心环节,核心使命是 为后续渲染流程提供基础数据:
- 数据类型:涵盖顶点、法线、切线、纹理坐标、变换矩阵、材质属性等关键信息;
- 开发逻辑:开发者只需 遵循Unity引擎规则 进行场景搭建、逻辑编写等工作,即可驱动该阶段运行;
- 性能优化:当 DrawCall数量过多 时,会引发CPU侧性能瓶颈,可通过 批处理技术(合并绘制指令)优化。
几何阶段
几何阶段是渲染管线中 由GPU主导 的处理环节,核心围绕三维几何数据的加工与筛选展开:
- 核心任务:对模型 顶点数据 进行计算(如位置修正、属性赋值),完成 坐标空间转换(例:模型空间→世界空间→裁剪空间的映射),并执行 图元裁剪(剔除屏幕视野外的无效几何,降低后续渲染压力);
- 开发可干预点:通过 自定义顶点着色器 编写逻辑,修改顶点的位置、颜色等属性,实现顶点动画、风格化形变等独特画面效果。
光栅化阶段
光栅化阶段是渲染管线中 由GPU主导 的核心流程,核心围绕 片元的最终渲染决策 展开:
- 核心任务:通过深度测试、透明度测试等逻辑,判定片元是否最终渲染;同时融合光照、纹理、材质等信息,计算片元的 最终渲染颜色;
- 开发可干预点:通过 自定义片元着色器 编写逻辑,控制片元的色彩、透明度、特效(如卡通渲染、辉光、溶解效果等),实现差异化画面表现。
Shader开发是什么
Shader开发的核心是 通过自定义逻辑处理渲染管线中的数据,以此决定最终渲染效果:
- 本质逻辑:介入渲染管线的几何阶段(如顶点着色)、光栅化阶段(如片元着色),对顶点、片元等数据进行编程改造;
- 实现形式:通过编写Shader代码,控制光照计算、纹理融合、颜色输出等渲染细节,实现卡通风格、辉光、溶解等定制化视觉效果。
如何学习Shader开发
学习Shader开发,需构建三类核心知识体系:
- 数学知识:矩阵运算、向量变换、光照模型等(支撑坐标转换、光影计算的底层逻辑);
- 语法知识:掌握Shader编程语言规则(如HLSL、GLSL,或Unity的ShaderLab语法);
- 着色器开发知识:理解渲染管线阶段的干预逻辑(如顶点/片元着色器的工作流程与编程方法)。
掌握以上内容后,即可 按需求处理渲染数据,最终在屏幕呈现符合设计的图像效果。
Shader开发必备概念
- 渲染管线与图形接口的关系:图形接口程序(如 OpenGL、DX 等)是开发者与硬件交互的中间层,提供对渲染管线的控制与管理功能 。
- Shader与图形接口的关系:Shader 属于 图形接口程序 的组成部分,用于编写渲染管线内的数据处理逻辑 。
- 不同图形接口的影响:开发语言存在差异(如 DX 采用 HLSL 、OpenGL 常用 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