ShaderLab语法基础

ShaderLab语法基础 音标ˈʃeɪdər læbShader → 筛–der接近 “筛得儿”“莱布”Unity内置渲染管线如果你是初学 ShaderLab、想实现常规材质 / 特效直接按这个优先级选✅Unlit Shader入门首选无光照、代码最简单适合学基础 / 做 2D/UI/ 自发光效果✅Standard Surface Shader有光照需求时选内置管线专用快速做带漫反射 / 高光的 3D 材质❌ 其余 3 个Image Effect/Compute/Ray Tracing新手暂时不用碰仅特定场景才需要。模板名称核心用途适用场景新手适配度Unlit Shader无光照的基础材质只输出颜色 / 纹理不计算任何光照2D 精灵、UI、自发光特效、纯色模型、新手练手⭐⭐⭐⭐⭐首选Standard Surface Shader带光照的 3D 材质内置管线专用Unity 自动封装光照 / 阴影 / 多光源逻辑3D 模型的漫反射 / 高光材质、常规 3D 物体渲染⭐⭐⭐⭐次选Image Effect Shader内置管线的全屏后处理读取屏幕纹理做模糊 / 调色 / 描边等屏幕特效屏幕滤镜、画面调色、边缘检测⭐⭐进阶Compute ShaderGPU 并行计算不是渲染材质用 GPU 做物理模拟 / 粒子 / 纹理生成等计算任务大规模数据计算、性能优化如 10 万粒子模拟⭐高级Ray Tracing Shader实时光线追踪实现真实反射 / 折射 / 全局光照依赖硬件支持次世代画质、光线追踪特效⭐超高级详细解释通俗版无专业术语1. Unlit Shader无光照着色器人话解释“只画颜色 / 贴图不管灯光” 的材质。比如你想给 UI 贴张图、给 2D 精灵上色、做个发光的特效用它就对了。代码特点结构最简单只有 “定义参数→顶点变换→输出颜色” 三步是学习 ShaderLab 基础Properties/SubShader/Pass的最佳入口。新手必用比如改一行代码就能让模型变成红色改两行就能贴上纹理成就感拉满。2. Standard Surface Shader标准表面着色器人话解释“自带灯光效果” 的 3D 材质。比如你想做一个有光影的木头箱子、金属小球不用自己写光照公式Unity 帮你封装好了。适用前提仅在Unity 内置渲染管线中能用URP/HDRP 已淘汰这个模板。核心优势几行代码就能实现带多光源、阴影的 3D 材质不用手动写多个 Pass 处理光照。3. Image Effect Shader图像效果着色器人话解释“给整个屏幕加滤镜” 的工具。比如让画面变黑白、加模糊、做鱼眼效果本质是读取屏幕的像素处理后再画回去。注意内置管线专用URP/HDRP 里改用 “SRP Blit Shader” 实现同款功能新手先不用学。4. Compute Shader计算着色器人话解释“让 GPU 帮忙算数据”和 “渲染画面” 无关。比如你有 10 万个粒子要计算位置用 CPU 算卡用 GPU 并行算就快这时候才用它。关键提醒它不是 ShaderLab 材质语法和常规 Shader 完全不同新手阶段 99% 用不到。5. Ray Tracing Shader光线追踪着色器人话解释“模拟真实光线反射” 的高端工具。比如让玻璃球反射周围环境、水面折射水底需要显卡支持光线追踪RTX 显卡。新手避坑不仅需要硬件还需要懂光线追踪原理入门阶段完全不用碰。HDRP项目中的每个名词是啥1. SRPBlit Shader大白话专门用来“拷贝 / 处理纹理” 的极简 ShaderBlit 拷贝是 SRP可编程渲染管线的标配。原神例子把游戏画面从一个渲染缓冲区拷贝到另一个比如给画面加简单的亮度调整、全屏模糊。核心作用做 “纹理搬运 简单像素处理”比普通 Shader 轻量专门适配 SRPURP/HDRP2. Compute Shader大白话不是用来画画面的 Shader是跑在 GPU 上的 “通用计算程序”和渲染流水线无关。原神例子计算上千个史莱姆的位置 / 运动GPU 并行算比 CPU 快 10 倍处理大世界的草 / 树的风场模拟计算水体的波纹效果。核心作用把复杂的 “非渲染计算” 丢给 GPU利用 GPU 的并行算力提速和 “画像素” 没关系。3. Ray Tracing Shader大白话专门做“光线追踪” 的 Shader模拟真实光线反射 / 折射是 RTX 显卡的核心特性。原神例子如果原神开了光线追踪这个 Shader 会计算 “阳光照在雷电将军的刀上反射到地面的光斑形状”“水面反射周围的建筑”。核心作用实现电影级的真实光影传统光栅化做不到但算力消耗极大需要 RTX 显卡。4. Custom Render Texture大白话“自定义渲染纹理”——不是普通的贴图文件是用 Shader 实时渲染出来的纹理。原神例子雷电将军的雷元素护盾特效实时渲染成一张纹理贴在护盾模型上水面的动态波纹每帧用 Shader 重新渲染成纹理再贴到水面上。核心作用实现 “动态贴图”替代静态贴图做出更真实的动态效果。5. Shader Variant Collection大白话“Shader 变体集合”——把 Shader 的所有可能版本变体打包管理避免游戏运行时动态编译 Shader 导致卡顿。原神例子原神的角色 Shader 支持 “开启 / 关闭光影、开启 / 关闭特效、不同平台” 等几十种组合每种组合对应一个 Shader 变体用这个集合提前打包好游戏加载时直接用不卡顿。核心作用解决 Shader 动态编译卡顿问题管理海量 Shader 变体。6. HDRP Custom FullScreen Pass大白话HDRP高清渲染管线里的 “自定义全屏处理阶段”——在渲染完整个画面后对全屏像素做自定义处理。原神例子如果原神用 HDRP开 “全屏泛光特效”“画面锐化”“暗角效果”就是在这个阶段用 Shader 处理全屏像素。核心作用给 HDRP 加自定义的全屏后处理效果。7. HDRP Custom RenderersPass大白话HDRP 里的 “自定义渲染器阶段”——在渲染物体的过程中插入自定义的渲染步骤比如给特定物体加特殊光影。原神例子给雷电将军的雷元素特效单独加一层光照只在这个阶段处理她的模型不影响其他物体。核心作用精细控制 HDRP 的渲染流程给特定物体加自定义效果。8. HDRP Post Process大白话HDRP 的“后处理”——渲染完画面后对最终图像做美化比如调色、抗锯齿、景深、bloom。原神例子游戏里的 “画面风格调整”比如璃月港的暖色调、稻妻的冷色调、战斗时的 “血雾滤镜”都是这个功能做的。核心作用快速给整个画面加视觉效果不用改每个物体的 Shader。为啥要整这么多东西分工明确 效率更高比如 Compute Shader 负责 “算数据”不画画面Ray Tracing Shader 负责 “算光影”Post Process 负责 “调画面风格”—— 把复杂需求拆成小模块开发 / 优化都方便避免一个 “万能 Shader” 又臃肿又慢不同场景用不同工具GPU 算力不浪费。这些都是 ShaderLab 吗名词是否是 ShaderLab核心说明SRPBlit Shader是外壳用 ShaderLab 写结构Properties/SubShader/Pass里面包裹 HLSL 代码Compute Shader否单独的文件格式.compute语法类似 HLSL和 ShaderLab 无关也不在渲染流水线里Ray Tracing Shader否基于 HLSL 的光线追踪代码在 HDRP 里通过 C#/ 配置调用不是 ShaderLabCustom Render Texture否是 “纹理资源”但可以绑定一个 Shader这个 Shader 是 ShaderLab 写的Shader Variant Collection否是 “资源文件”.shadervariants用来管理 Shader 变体本身不是 ShaderHDRP Custom FullScreen Pass否是 HDRP 的 “渲染阶段”可以绑定一个 Shader这个 Shader 是 ShaderLab 写的HDRP Custom RenderersPass否同上是渲染阶段不是 ShaderLab只是能关联 ShaderLab 写的 ShaderHDRP Post Process否是 HDRP 的 “后处理系统”效果由 Shader 实现Shader 是 ShaderLab 写的核心总结只有 “XX Shader”如 SRPBlit Shader的主体是 ShaderLab用 ShaderLab 写结构内部是 HLSL其他如 Compute Shader、Post Process、Custom Render Texture 等是 “工具 / 系统 / 资源”不是 ShaderLab但可以和 ShaderLab 写的 Shader 配合使用。在Unity中所有的Shader程序都是使用名为“ShaderLab”的声明性语言进行编写的。在Shader文件中ShaderLab通过嵌套花括号的方式声明着色器的各部分内容。ShaderLab语法不区分大小写。而真正意义上的Shader代码则是在CGPROGRAM代码块中编写的。如果你现在要写普通的 Unity ShaderLab 材质比如给模型贴贴图、做颜色 / 发光效果、学习基础 Shader在你这张图的选项里先看你用的是什么渲染管线你当前用的管线推荐选哪个 Shader 模板核心用途内置管线 (Built-in)选Unlit Shader或Standard Surface Shader写无光照 / 带光照的常规材质URP (通用渲染管线)找Unlit Shader如果有或用SRP Blit Shader做后处理写基础材质 / 全屏后处理HDRP (高清渲染管线)找Unlit Shader或用HDRP Custom FullScreen Pass做后处理HDRP 专用材质 / 后处理正文开始目录Shader的组织结构为什么表面着色器会自动生成多个 Pass为什么还需要有表面着色器这个东西它起到了什么作用Shader的名称Properties1.数值类属性关键注意事项1. 类型匹配新手最易出错2. Range 类型的优势3. Vector 的灵活用法4. 数值的初始默认值规则2.纹理贴图类属性3.所有类型属性汇总SubShader1.SubShader的标签1渲染队列Queue2渲染类型RenderType3其他标签2.Pass的渲染状态FallbackShader的组织结构无论选择何种语言编写Shader无论编写的Shader是何种类型Unity Shader 总是通过ShaderLab语言进行包装并组织结构Shader的大致结构Shader “Name”{Properties{//开放到材质面板的属性}SubShader{//顶点-片段着色器//或者表面着色器//或者固定函数着色器}SubShader{//更加精简的版本//为了在旧的图形设备上运行}……Fallback “Name”}Shader中可以编写多个子着色器但至少需要一个。在程序运行过程中GPU会先检测第一个子着色器能否正常运行如果不能正常运行就会再检测第二个以此类推。如果编写的是顶点-片元着色器每个子着色器中还会包含一个甚至多个Pass。在运行的过程中如果某个子着色器能够在当前GPU上运行那么该子着色器内的所有Pass会依次执行每个Pass的输出的结果会以指定的方式与上一步的结果进行混合最终输出。如果编写的是表面着色器着色器的代码也是包含在子着色器中但是与顶点-片元着色器不同的是表面着色器不会再嵌套Pass。系统在编译表面着色器的时候会自动生成多个对应的Pass,最终编译出来的Shader本质上就是顶点-片元着色器。如何理解上述呢表面着色器的本质你写的是 “面向效果” 的简洁代码Unity 帮你自动翻译成 “面向硬件” 的顶点 / 片元着色器包含多个 Pass。顶点 / 片元着色器手动写 Pass你必须显式地写Pass块每个 Pass 对应一次 GPU 渲染调用特点你完全掌控 Pass 的数量、顺序、混合方式缺点要手动处理多光源、阴影、光照模型比如兰伯特、Phong代码量大且复杂。表面着色器不写 PassUnity 自动生成你只需要写表面着色器的核心逻辑比如定义光照模型、表面属性不用写 Pass特点代码极简只关注 “表面属性”颜色、高光、法线等不用管 Pass为什么表面着色器会自动生成多个 PassGPU 处理光照的逻辑决定了 “多光源需要多 Pass”主光源ForwardBase第一个 Pass 处理平行光太阳、环境光、自发光、阴影输出基础颜色附加光源ForwardAdd每个点光源 / 聚光灯对应一个 Pass通过 “混合Blend” 叠加到基础颜色上阴影投射ShadowCaster额外的 Pass 处理物体投射阴影的逻辑你写表面着色器时Unity 会根据你指定的光照模式比如Lambert/BlinnPhong自动生成这些 Pass 的代码 —— 相当于 Unity 帮你封装了 “多光源渲染” 的通用逻辑让你不用重复写这些底层代码。为什么还需要有表面着色器这个东西它起到了什么作用表面着色器是 Unity 为了 “降低着色器开发门槛” 和 “提升开发效率” 而做的高层封装它把开发者从繁琐的底层渲染细节中解放出来让开发者能聚焦在 “想要什么效果”而不是 “怎么实现这个效果”。GPU 只能执行 “顶点 / 片元着色器” 这种底层指令但手动实现带光照、阴影、多光源的顶点 / 片元着色器需要处理大量繁琐且易出错的细节。表面着色器的核心作用就是把 “光照模型、多光源处理、阴影计算、坐标变换” 等通用且复杂的底层逻辑封装起来让开发者只用几行代码就能实现原本需要几十上百行顶点 / 片元代码才能实现的效果。表面着色器的 “定位”不是替代而是补充—— 简单光照效果用表面着色器提效特殊效果 / 高性能需求用顶点 / 片元着色器控细节。场景推荐用表面着色器推荐用顶点 / 片元着色器需求常规光照效果漫反射、高光、PBR自定义特殊效果透明、描边、后处理开发效率高几行代码实现核心效果低需要手动处理所有细节性能控制弱Unity 自动生成 Pass可能有冗余强可精准控制 Pass 数量和逻辑适用平台PC / 主机性能冗余可接受移动端需要极致性能优化Shader的名称Shader程序的第一行代码用来声明该Shader的名称以及所在路径路径指Shader在材质面板上Shader下拉列表里的保存路径。Properties音标/prəˈpɜːrtiz/“普若泼儿替兹”重音在 “泼儿” 上unity Shader的属性主要分为三大类数值、颜色和向量、纹理贴图1.数值类属性Properties中的数值型属性主要有 4 种核心类型语法格式统一为属性名 (面板显示名称, 类型) 默认值属性类型语法示例作用Inspector 表现Float单精度浮点数_Speed (移动速度, Float) 1.0单个数值无范围限制输入框可直接输数字Int整数_Count (粒子数量, Int) 10单个整数Shader 中会转成 Float 使用输入框仅能输整数Range范围值_Gloss (光泽度, Range(0, 1)) 0.5限定范围的数值更安全滑动条只能在指定范围调整Vector四维向量_Offset (位置偏移, Vector) (1, 2, 3, 4)包含 4 个数值x/y/z/w 或 r/g/b/a4 个输入框分别对应 x/y/z/w数值型属性的核心是在Properties中定义后必须在 CGPROGRAM 块中重新声明才能被着色器代码使用。关键注意事项1. 类型匹配新手最易出错Float/Int/Range在 CG 代码中都声明为floatGPU 中无专门的 int 类型会自动转换Vector在 CG 代码中必须声明为float4对应 x/y/z/w 四个分量属性名必须完全一致比如_Speed不能写成_speed大小写敏感。2. Range 类型的优势Range 是 Float 的 “增强版”虽然本质也是浮点数但在 Inspector 中表现为滑动条能避免手动输入超出合理范围的数值比如透明度设为 2 导致错误推荐优先使用。3. Vector 的灵活用法Vector 虽为四维但可按需使用其中的分量存位置偏移_Offset.xx 轴、_Offset.yy 轴存颜色替代 Color 类型_Color.r红、_Color.g绿存缩放系数_Scale.xyz三维缩放。Vector 四维向量为什么能 “按需使用分量”Vector是四维向量包含 x/y/z/w 四个分量也可以用 r/g/b/a 表示含义完全一样但你不用每次都把四个分量都用完场景 1存位置偏移只用 x/y 分量比如想让模型在 X 轴和 Y 轴上偏移Z 轴不动// 定义Vector属性默认值 (X偏移, Y偏移, Z偏移, 备用)_Offset (位置偏移, Vector) (1.0, 2.0, 0.0, 1.0)// 在CG代码中使用只取x/y分量z保持0不动v.vertex.x _Offset.x; // X轴偏移1.0v.vertex.y _Offset.y; // Y轴偏移2.0// v.vertex.z 不处理保持原来的位置场景 2存颜色用 r/g/b/a 分量替代 Color 类型Color 类型本质也是四维红 / 绿 / 蓝 / 透明和 Vector 完全等价只是 Inspector 面板显示形式不同// Vector属性存颜色默认值 (红, 绿, 蓝, 透明)_ColorVec (颜色, Vector) (1.0, 0.5, 0.0, 1.0)// 在CG代码中使用r红g绿b蓝a透明fixed4 col fixed4(_ColorVec.r, _ColorVec.g, _ColorVec.b, _ColorVec.a);场景 3存缩放系数只用 x/y/z 分量想让模型在 X/Y/Z 三个轴上分别缩放不同比例// Vector属性存缩放默认值 (X缩放, Y缩放, Z缩放, 备用)_Scale (缩放系数, Vector) (1.0, 2.0, 1.0, 1.0)// 在CG代码中使用xyz分量对应三维缩放w不用v.vertex.xyz * _Scale.xyz;// 等价于// v.vertex.x * _Scale.x; // X轴1倍不变// v.vertex.y * _Scale.y; // Y轴2倍放大// v.vertex.z * _Scale.z; // Z轴1倍不变4. 数值的初始默认值规则Float/Int默认值写单个数字如1.0、10Range默认值必须在声明的范围之内如Range(0,1)的默认值不能是 2Vector默认值是四个数字用括号包裹如(1,2,3,4)缺少的分量会补 0。区别仅在于Int 在 Inspector 面板中只能输入整数比如 10、20Float 可以输入小数比如 2.5、3.14但默认值写法都是 “单个数字”。2.纹理贴图类属性属性名 (面板显示名称, 类型) 默认值 {}属性类型语法示例作用Inspector 表现2D2D 纹理_MainTex (主纹理, 2D) white {}最常用用于普通贴图漫反射、法线、高光等纹理拖拽框 Tiling/Offset 调节UV 缩放 / 偏移Cube立方体贴图_CubeTex (立方体贴图, Cube) white {}用于天空盒、环境映射、反射效果立方体贴图拖拽框3D3D 纹理_3DTex (3D纹理, 3D) white {}用于体积纹理如体积雾、3D 噪声3D 纹理拖拽框关键说明默认值含义white默认白色纹理RGB1,1,1black默认黑色纹理RGB0,0,0gray默认灰色纹理RGB0.5,0.5,0.5bump默认法线纹理RGB0.5,0.5,12D 纹理的 Tiling/OffsetInspector 中自动显示Tiling控制 UV 缩放重复次数Offset控制 UV 偏移平移。3.所有类型属性汇总SubShader/ˈsʌb ʃeɪdər/SubShader的大致结构SubShader{//标签Tags{RenderType Opaque // 渲染类型不透明/透明Queue Geometry // 渲染队列}// 渲染状态可选Cull Back // 剔除背面……Pass{//第一个Pass}Pass{//第一个Pass}……}每个SubShader都可以设置一个或者多个标签Tags和渲染状态States,然后定义至少一个PassSubShader中每定义一个Pass都会使这个物体执行一次渲染1.SubShader的标签SubShader通过标签来确定什么时候以及如何对物体进行渲染标签通过键值对的形式进行声明并且没有数量的限制。1渲染队列Queue使用Queue队列标签确定物体的渲染顺序unity预先定义了五种渲染队列数字越小渲染越早数字越大渲染越晚队列名称数值描述适用物体 / 场景Background1000最先执行天空盒、远景背景、底层环境Geometry2000非透明的几何体使用这个队列unity默认使用默认不透明实心物体地面、墙壁、角色、石头AlphaTest2450Alpha测试的几何体使用这个队列之所以从Geometry队列单独拆分出来是因为当所有实体都绘制完之后再绘制Alpha测试会更高效硬边镂空物体树叶、栅栏、铁丝网、镂空贴图Transparent3000在这个队列的几何体按由远及近的顺序进行绘制所有进行Alpha混合的几何体都应该使用这个队列半透明物体玻璃、水、水晶、半透明特效、窗口Overlay4000用来叠加渲染的效果顶层覆盖物UI、镜头光晕、HUD、特效叠加层除了使用Unity预定义的渲染队列也可以自己指定一个队列例如Tags{Queue Geometry1}这个队列的队列号其实就是2001表示再所有的非透明几何体绘制完成之后再进行绘制。使用自定义的渲染队列在某些情况下非常有用例如透明的水应该在所有不透明几何体之后透明几何体之前被绘制所以透明水的渲染队列一般会使用“Queue”Transparent-1除了在Subshader中指定渲染队列也可以在材质面板中进行设置。2渲染类型RenderTypeRenderType(渲染类型)标签可以将Shader划分不同的类型用于后期进行Shader替换或者产生摄像机的深度纹理RenderType是 Shader 中SubShader Tags的核心标签不影响正常渲染顺序主要用于摄像机深度纹理 / 法线纹理渲染Shader 替换Shader Replacement特效、后处理、阴影识别材质类型核心作用告诉引擎这个材质是什么 “类型”用于摄像机深度纹理渲染深度图时分类处理用于Shader 替换批量替换某类物体 shader用于后处理、阴影、特效识别RenderType 类型适用物体核心作用Opaque不透明物体地面、墙壁、角色、石头用于普通shader最常用默认不透明材质标识Transparent半透明物体玻璃、水、特效、窗口用于半透明shader识别透明物体参与透明深度 / 后处理TransparentCutout镂空物体树叶、栅栏、头发、铁丝网用于透明测试shaderAlpha 测试镂空专用区分硬边透明Background天空盒、远景背景用于Skybox Shader标记背景材质OverlayUI、光晕、顶层覆盖用于GUI纹理HaloFlare Shader标记覆盖层材质TreeOpaque树木树干SpeedTree用于地形系统中的树干引擎识别树木渲染专用TreeTransparentCutout树木树叶用于地形系统中的树叶识别树叶镂空TreeBillboard广告牌树木用于地形系统中的Billboarded树程序化树木标识Grass草地用于地形系统中的草引擎草地渲染标识GrassBillboard广告牌草地用于地形系统中的Billboarded草程序化草地标识Queue 与 RenderType 标准配对表材质类型Queue 渲染队列RenderType 渲染类型说明 适用物体不透明物体GeometryOpaque地面、墙壁、角色、石头、金属默认标准镂空 / Alpha 测试AlphaTestTransparentCutout树叶、栅栏、头发、铁丝网、硬边透明贴图半透明物体TransparentTransparent玻璃、水、水晶、塑料、半透明特效背景 / 天空盒BackgroundBackground天空盒、远景背景板3其他标签标签名称官方说明常用取值Queue指定物体使用的渲染队列决定渲染顺序BackgroundGeometryAlphaTestTransparentOverlayRenderType对材质进行分类用于深度纹理、Shader 替换、后处理OpaqueTransparentTransparentCutoutBackgroundOverlayTreeOpaqueTreeTransparentCutoutTreeBillboardGrassGrassBillboardIgnoreProjector是否忽略Projector投影器True / FalseForceNoShadowCasting是否不投射阴影True / FalseCanUseSpriteAtlas2D Sprite 专用是否允许使用图集True / FalsePreviewType材质面板预览的形状Plane / SkyboxDisableBatching是否禁用批处理True / False / WhenLODFade2.Pass的渲染状态Pass 渲染状态用来设置显卡的渲染模式决定物体如何绘制是否双面、是否透明混合、是否写入深度等。写在Pass { ... }内部写在CGPROGRAM代码块外部渲染状态常用命令官方作用必背场景Cull 剔除Cull Back剔除背面默认节省性能Cull Front剔除正面渲染双面 / 内部Cull Off关闭剔除双面渲染树叶、纸片、透明物体ZWrite 深度写入ZWrite On开启深度写入默认不透明物体ZWrite Off关闭深度写入半透明物体必开ZTest 深度测试ZTest LEqual深度测试默认正常遮挡ZTest Always永远通过测试最上层显示Blend 混合Blend SrcAlpha OneMinusSrcAlpha标准透明混合半透明玻璃、特效Blend One One加法混合强光、火焰、光晕Blend Zero SrcColor乘法混合阴影、暗部AlphaTest 测试AlphaTest Greater [fixed]Alpha 裁剪镂空物体已弃用用 clip ()ColorMask 颜色遮罩ColorMask 0不输出颜色只写入深度ColorMask RGB只输出 RGB特殊效果Offset 偏移Offset 0,0深度偏移解决 z-fighting 闪烁如果想某些Pass的渲染状态不影响到其他的Pass可以在该Pass中单独设置渲染状态注意在SubShader中使用会影响到该SubShader中的所有Pass ————什么意思核心概念解释首先明确两个关键层级SubShader是 Shader 中一个 “渲染方案”包含多个Pass渲染通道同一SubShader下的Pass会共享该SubShader层级设置的渲染状态。Pass是一次完整的渲染过程比如渲染物体的漫反射、高光每个Pass可以单独设置自己的渲染状态。这句话的核心意思是如果你希望某个Pass的渲染状态比如是否开启深度测试、混合模式、双面渲染等只作用于自己不影响其他Pass就直接在这个Pass内部设置渲染状态如果你把渲染状态写在SubShader层级而非某个Pass里这个状态会作用于该SubShader下的所有 Pass所有 Pass 都会继承这个状态可能导致你不想要的渲染结果。优先级Pass层级的渲染状态会覆盖SubShader层级的同名状态比如 SubShader 开了混合某个 Pass 写了Blend Off则该 Pass 会关闭混合。FallbackFallback在所有SubShader之后进行定义。当所有的SubShader都不能在当前显卡上运行的时候就会运行Fallback定义的Shader基础语法Fallback写在 Shader 根层级和SubShader同级格式有两种// 格式1指定备用 Shader 的名称Shader 面板中的路径Fallback Shader路径/Shader名称// 格式2禁用回退即使当前 Shader 失效也不使用任何备用 ShaderFallback Off作用范围Fallback是针对整个 Shader的而非单个SubShader优先级当前 Shader 的SubShader优先级 Fallback 指定的 Shader性能影响Fallback 仅在 “当前 Shader 失效” 时触发正常情况下不会增加性能开销。内置常用 Fallback 选项Unity 内置了一些通用 Shader 适合作为 Fallback比如Fallback Diffuse回退到内置的漫反射 Shader最基础的不透明渲染Fallback VertexLit回退到顶点光照 Shader性能极低兼容性拉满Fallback Transparent/Diffuse回退到内置透明漫反射 ShaderFallback Unlit/Color回退到无光照纯色 Shader最低配方案