关于 unity-graphics
面向 Unity 图形开发者的渲染与图形参考技能,涵盖渲染管线、着色器、材质、摄像机和优化。它对比 Built-in、URP 与 HDRP,并说明各自的用途和注意事项。
主要功能
- 01对比 Built-in、URP 与 HDRP
- 02Shader Graph 与 HLSL 指南
- 03材质、纹理和摄像机参考
- 04Render Graph 与渲染优化
适用场景
- 01为新项目选择渲染管线
- 02编写或调试 Unity 着色器
- 03配置后处理与摄像机
- 04优化绘制调用和渲染流程
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nice-wolf-studio/ unity-claude-skills --skill unity-graphics安装后在 Claude Code 中输入/unity-graphics确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/hdrp-guide.mdmaterials-textures.mdshader-graph.mdurp-guide.md详细介绍
Unity 图形与渲染
渲染管线选择指南
渲染管线会执行一系列操作,将场景内容呈现在屏幕上。Unity 提供三种渲染管线:
| 标准 | 内置渲染管线 | 通用渲染管线(URP) | 高清渲染管线(HDRP) |
|---|---|---|---|
| 目标 | 旧版项目 | 从移动平台到高端主机/PC | AAA、汽车、建筑可视化 |
| 自定义 | 有限 | 可编写脚本,通过 Renderer Features 扩展 | 可编写脚本、自定义通道、完整帧设置 |
| 渲染路径 | 前向、延迟 | 前向、Forward+、延迟 | 前向、延迟(混合瓦片/集群) |
| 着色器编写 | ShaderLab + Surface Shaders | Shader Graph(推荐)、HLSL | Shader Graph(推荐)、HLSL |
| SRP Batcher | 否 | 是 | 是 |
| 光线追踪 | 否 | 否 | 是(DXR) |
| 体积效果 | 否 | 否 | 是(雾、云) |
| 抗锯齿 | MSAA | FXAA、SMAA、TAA、MSAA | FXAA、SMAA、TAA、MSAA |
| 平台 | 全部 | 全部(可扩展) | 高端(DX11/12、Metal、Vulkan) |
| GPU 要求 | 标准 | 标准 | 支持计算着色器 |
选择流程:
- 需要光线追踪、体积云或基于物理的天空?--> HDRP
- 需要面向移动平台、WebGL 或尽可能广泛的平台?--> URP
- 正在维护没有迁移预算的旧版项目?--> 内置渲染管线
- 正在启动新项目?--> URP(大多数项目)或 HDRP(高保真)
**警告:**渲染管线不可互换。不同管线中的材质、着色器和后期处理无法直接通用,必须先进行转换。将内置渲染管线的材质升级到 URP/HDRP 时,需要使用该管线的材质升级器;如果对象的着色器不兼容,渲染结果会呈亮粉色。
来源:渲染管线
URP(通用渲染管线)
URP 是 Unity 预先构建的可编写脚本渲染管线,适用于创建可在多种平台上运行的优化图形效果,涵盖从移动平台到高端主机和 PC。
主要功能:
- 前向、Forward+ 和延迟渲染路径
- 抗锯齿:FXAA、SMAA、TAA、MSAA
- 面向 2D 游戏的 2D Renderer
- 用于注入自定义渲染的 Renderer Features
- 用于优化绘制调用的 SRP Batcher
- 通过 Volume 系统内置后期处理
参见:references/urp-guide.md 来源:URP
HDRP(高清渲染管线)
HDRP 是 Unity 预先构建的可编写脚本渲染管线,面向在高端硬件上实现 AAA 级游戏、汽车演示和建筑可视化。它需要支持计算着色器的 GPU(DirectX 11/12、Metal、Vulkan)。
主要功能:
- 基于物理的光照,支持 Physical Light Units
- 材质类型:Lit、StackLit、Layered Lit、Hair、Fabric、Eye、AxF、Terrain
- 光线追踪:反射、GI、阴影、AO、次表面散射
- 体积雾和体积云
- 基于物理的天空、HDRI Sky、Gradient Sky
- 支持降噪的路径追踪(Optix、Intel Open Image Denoise)
- 支持焦散和水下渲染的水体系统
- 动态分辨率,支持 DLSS、FSR 1.0、TAA Upscaling
参见:references/hdrp-guide.md 来源:HDRP
Shader Graph
Shader Graph 可通过在图形框架中创建并连接节点,以可视化方式构建着色器,而无需编写代码。更改会即时反馈。
渲染管线兼容性:
| 管线 | 支持 |
|---|---|
| URP | 是 |
| HDRP | 是 |
| 内置渲染管线 | 是 |
| 自定义 SRP | 否 |
安装 URP 或 HDRP 时会自动包含 Shader Graph。
自定义函数节点 —— 将自定义 HLSL 代码注入 Shader Graph:
- 字符串模式:直接编写 HLSL;使用
$precision标记表示 half/float - 文件模式:引用带有包含保护的外部
.hlsl文件
// File mode example with include guards
//UNITY_SHADER_NO_UPGRADE
#ifndef MYHLSLINCLUDE_INCLUDED
#define MYHLSLINCLUDE_INCLUDED
void MyFunction_float(float3 A, float B, out float3 Out)
{
Out = A + B;
}
#endif //MYHLSLINCLUDE_INCLUDED
自定义函数节点中的管线检测:
#ifdef SHADERGRAPH_PREVIEW
half3 color = half3(0,0,0);
#else
#if defined(UNIVERSAL_PIPELINE_CORE_INCLUDED)
half4 shadowCoord = TransformWorldToShadowCoord(WorldPosition);
Light mainLight = GetMainLight(shadowCoord);
half3 color = mainLight.color;
#else
half3 color = half3(0, 0, 0);
#endif
#endif
各管线的条件关键字:
- Built-in:
BUILTIN_PIPELINE_CORE_INCLUDED - URP:
UNIVERSAL_PIPELINE_CORE_INCLUDED - HDRP:
UNITY_HEADER_HD_INCLUDED - 预览窗口:
SHADERGRAPH_PREVIEW
参见:references/shader-graph.md 来源:Shader Graph
着色器
着色器是在 GPU 上运行的程序。Unity 将着色器分为三种类型:
- 图形管线着色器 —— 最常见;与 Shader 对象配合使用,以确定场景外观
- 计算着色器 —— 在常规图形管线之外执行 GPU 计算
- 光线追踪着色器 —— 处理光线追踪计算(仅限 HDRP)
关键术语:
- Shader 对象 ——
Shader类的实例,封装着色器程序和 GPU 指令 - ShaderLab —— Unity 用于定义 Shader 对象结构的语言
- Shader Graph —— 无需编写代码的可视化着色器创建工具
- Shader 资源 —— 定义 Shader 对象的
.shader文件 - HLSL —— 着色器代码块中使用的高级着色语言
表面着色器(仅限 Built-in 管线):
- 以精简方式编写可与光照交互的着色器
- 自动生成顶点/像素着色器和渲染通道
- URP 或 HDRP 不支持;请改用 Shader Graph
ShaderLab 中的 HLSL:
- 使用
HLSLPROGRAM指令将着色器代码添加到 Pass 块中 - 声明用于连接着色器变量与网格顶点数据的结构体
- 使用
#pragma指令控制编译 - 支持 16 位精度,以优化移动平台性能
材质和纹理
材质与着色器协同工作,共同定义场景外观。
材质
关键工作流:
- 创建材质资源并将其分配给 GameObject
- 通过脚本在运行时修改材质属性
- 使用材质变体管理大型材质集合
- 将 Built-in 材质升级到 URP/HDRP,以避免渲染为粉色
Material API —— 关键属性和方法:
| 属性/方法 | 用途 |
|---|---|
color | 材质的主颜色 |
mainTexture | 主纹理 |
shader | 已分配的着色器引用 |
renderQueue | 覆盖渲染顺序 |
enableInstancing | GPU 实例化开关 |
SetColor(name, color) | 更改颜色属性 |
SetFloat(name, value) | 设置浮点属性 |
SetTexture(name, texture) | 分配纹理 |
SetVector(name, vector) | 设置向量属性 |
SetMatrix(name, matrix) | 设置矩阵属性 |
HasProperty(name) | 检查属性是否存在 |
EnableKeyword(keyword) | 启用着色器关键字 |
CopyPropertiesFromMaterial(mat) | 从其他材质复制属性 |
Lerp(start, end, t) | 在材质之间插值 |
重要: 请先设置所需的着色器,再修改属性。如果当前着色器不支持这些属性,则属性赋值不会生效。
纹理
纹理是应用于网格表面的位图图像。关键概念:
- 推荐使用 2 的幂次尺寸:32、64、128、256、512、1024、2048、4096
- LDR(低动态范围):PNG、JPG —— 数值范围为 0.0-1.0
- HDR(高动态范围):EXR、HDR —— 扩展色彩范围
- RGBA:RGB 颜色加上用于透明度的 Alpha 通道
- 每像素位数(bpp):数值越低,内存占用越少,GPU 缓存效率越高
- 各向异性过滤:改善陡峭视角下的画质
参见:references/materials-textures.md 来源:Materials、Textures
摄像机
摄像机用于创建场景中特定视点的图像,输出可显示在屏幕上,也可捕获为纹理。
投影模式:
- 透视 —— 模拟人类视觉;远处物体看起来更小(默认)
- 正交 —— 无透视效果;无论距离远近,物体渲染尺寸都一致;适用于等距视角或 2D 游戏
关键信息:
- 每个场景至少需要一个摄像机
- 支持多个摄像机,并可配置渲染顺序
- 在 Player 设置中设置渲染路径;也可针对每个摄像机单独覆盖
- URP 和 HDRP 各有对应的摄像机文档
- 正交摄像机均匀地渲染雾效,而非按深度渲染
常见摄像机设置:
- 解谜游戏:使用静态摄像机确保场景完整可见
- FPS:将摄像机设为玩家的子对象,并放置在眼睛高度
- 赛车游戏:让摄像机跟随车辆
来源:Cameras
后期处理
后期处理效果可模拟物理摄像机或胶片的特性,也可实现风格化视觉效果。
| 渲染管线 | 后期处理方案 |
|---|---|
| URP | 内置(随 URP 模板安装) |
| HDRP | 内置(随 HDRP 模板安装) |
| 内置渲染管线 | Post-Processing Version 2 包(单独安装) |
**警告:**不同渲染管线的后期处理方案不可互换。每种管线的效果和实现方法各不相同。
HDRP 抗锯齿选项:
- MSAA —— 资源占用最高
- TAA —— 基于运动的时间平滑处理
- SMAA —— 基于图案的边缘混合
- FXAA —— 按像素处理;资源占用最低
**HDRP 曝光:**基于直方图,支持百分位选择、测光模式和预曝光,以便在使用物理光照单位时提高精度。
渲染图(Unity 6)
渲染图系统为自定义 SRP 渲染通道提供高层级表示,明确说明各通道如何使用资源。URP 和 HDRP 均使用渲染图。
核心原则
- 基于句柄的资源 —— 使用
TextureHandle、BufferHandle、RendererListHandle,而非直接引用 - 限定范围的访问 —— 只能在渲染通道执行代码中访问实际资源
- 显式声明 —— 每个通道都声明读取和写入操作,以便跟踪依赖关系
- 不持久化 —— 在一次执行中创建的资源无法传递到下一次执行
- 依赖 RTHandle —— 纹理使用 RTHandle 系统
三阶段执行(每帧)
- 设置 —— 声明所有渲染通道及资源依赖关系
- 编译 —— 系统剔除未使用的通道,并计算资源生命周期,以实现高效分配
- 执行 —— 按声明顺序运行未剔除的通道
关键 API 模式 —— AddRenderPass
using UnityEngine.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
// 1. Define pass data
class MyPassData { public TextureHandle input, output; public float param; }
// 2. Create and configure pass
using (var builder = renderGraph.AddRenderPass<MyPassData>("MyPass", out var passData))
{
passData.input = builder.ReadTexture(inputTexture);
passData.output = builder.UseColorBuffer(
renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
{ colorFormat = GraphicsFormat.R8G8B8A8_UNorm, name = "Output" }), 0);
passData.param = 2.5f;
builder.SetRenderFunc((MyPassData data, RenderGraphContext ctx) =>
{
var mpb = ctx.renderGraphPool.GetTempMaterialPropertyBlock();
mpb.SetTexture("_MainTexture", data.input);
mpb.SetFloat("_FloatParam", data.param);
CoreUtils.DrawFullScreen(ctx.cmd, material, mpb);
});
}
// 3. Lifecycle: new RenderGraph() -> BeginRecording() -> AddPasses -> EndRecordingAndExecute() -> Cleanup()
RenderGraphBuilder 关键方法
| 方法 | 用途 |
|---|---|
ReadTexture / WriteTexture | 声明纹理读写依赖 |
UseColorBuffer / UseDepthBuffer | 写入并自动绑定为渲染目标/深度目标 |
CreateTransientTexture | 创建作用域限定于通道的临时纹理 |
ReadComputeBuffer / WriteComputeBuffer | 声明缓冲区读写 |
UseRendererList | 声明渲染器列表用法 |
SetRenderFunc | 设置渲染回调 |
EnableAsyncCompute / AllowPassCulling | 控制通道行为 |
创建资源: CreateTexture()、CreateComputeBuffer()、CreateRendererList()
导入外部资源: ImportTexture()、ImportBackbuffer()、ImportBuffer()
来源:Render Graph
渲染优化
绘制调用批处理
批处理会合并使用相同材质的网格,让 Unity 减少渲染状态更新次数。
SRP Batcher(仅适用于 URP/HDRP):
- 通过最大限度减少调用之间的渲染状态更改,降低绘制调用的 CPU 耗时
- 材质数据会保留在 GPU 内存中
- 使用专用的逐对象 GPU 常量缓冲区
- 为获得最佳效果,请尽量减少着色器变体数量
- 兼容 URP、HDRP 和自定义 SRP;不兼容 Built-in 渲染管线
静态批处理:
- 将静止网格合并到统一的顶点/索引缓冲区中(世界空间)
- 每个缓冲区最多支持 64,000 个顶点
- 可在构建时或运行时执行
- 仅适用于 Mesh Renderer(不适用于 Skinned Mesh Renderer)
动态批处理:
- 在运行时由 CPU 将顶点变换到世界空间
- 适用于程序化生成的几何体(粒子、线条、轨迹)
- 网格限制为 900 个顶点属性或 300 个顶点
- 不推荐用于大多数场景:CPU 开销可能超过节省的绘制调用开销
- HDRP 不支持
GPU 实例化:
- 在一次绘制调用中渲染同一网格的多个实例
- 通过
Material.enableInstancing启用 - 通过 HLSL 宏添加逐实例属性(颜色、变换)
- 需要着色器支持实例化宏
遮挡剔除
阻止渲染被其他物体遮挡的 GameObject。可与视锥体剔除配合使用。
- 烘焙阶段(Editor):将场景划分为多个单元格,并生成可见性数据
- 运行时:加载烘焙数据,并针对每个摄像机执行可见性查询
- 适用场景:受 GPU 限制且存在过度绘制的项目;由实体几何体隔开的较小区域
- 限制:动态物体可以被遮挡,但无法遮挡其他物体
- URP/HDRP:可使用 GPU 遮挡剔除替代基于 CPU 的方案
来源:Draw Call Batching、SRP Batcher
常见模式(C#)
运行时访问材质属性
// Set shader before modifying properties
material.SetColor("_BaseColor", Color.red);
material.SetFloat("_Smoothness", 0.8f);
material.SetTexture("_BaseMap", myTexture);
if (material.HasProperty("_Metallic"))
material.SetFloat("_Metallic", 1.0f);
material.EnableKeyword("_EMISSION");
实例材质与共享材质
Renderer rend = GetComponent<Renderer>();
rend.material.color = Color.blue; // SAFE: creates per-object instance
// rend.sharedMaterial.color = Color.blue; // DANGEROUS: modifies asset for ALL objects
MaterialPropertyBlock(无需创建材质实例即可实现逐对象变化)
// WARNING: MaterialPropertyBlock BREAKS SRP Batcher compatibility.
// Use only when SRP Batcher is not critical (e.g., Built-in pipeline, few unique objects).
// For SRP Batcher-compatible per-object variation, use GPU Instancing with instance properties
// or create material instances via renderer.material.
private static readonly int BaseColorID = Shader.PropertyToID("_BaseColor");
private MaterialPropertyBlock _propBlock = new MaterialPropertyBlock();
void SetColor(Color color)
{
Renderer rend = GetComponent<Renderer>();
rend.GetPropertyBlock(_propBlock);
_propBlock.SetColor(BaseColorID, color);
rend.SetPropertyBlock(_propBlock);
}
反模式
| 反模式 | 问题 | 解决方案 |
|---|---|---|
在运行时修改 renderer.sharedMaterial | 会更改材质资源,影响使用该资源的所有对象 | 使用 renderer.material(会创建实例)或 MaterialPropertyBlock |
| 每帧创建新的 Material 实例 | 会导致内存泄漏和无限制的内存分配 | 缓存 Material 实例;使用 MaterialPropertyBlock 实现对象级差异 |
| 在 URP/HDRP 中使用 Surface Shader | 不受支持;会失败或渲染为粉色 | 使用 Shader Graph 或编写 HLSL 着色器 |
| 混用渲染管线资源 | 来自错误管线的着色器/材质会渲染为粉色 | 使用特定管线的着色器;切换管线时运行材质升级工具 |
| 纹理尺寸不是 2 的幂 | 压缩会失败;内存占用更高 | 使用 32、64、128、256、512、1024、2048、4096 |
| 默认启用动态批处理 | CPU 开销通常超过节省的绘制调用开销 | 优先使用 SRP Batcher(URP/HDRP)或静态批处理 |
| 着色器变体过多 | 增加构建时间、内存占用和加载时间 | 剔除未使用的变体;尽量减少关键字用量 |
在运行时使用 Shader.Find() | 速度慢;如果着色器未包含在构建中,可能会失败 | 缓存着色器引用;在 Inspector 中指定 |
忘记调用 m_RenderGraph.Cleanup() | 会导致 GPU 资源泄漏 | 始终在管线的 Dispose() 中进行清理 |
| 忽略透明对象的渲染队列 | 会产生 Z 冲突,排序不正确 | 设置合适的 renderQueue;将透明对象按从后到前的顺序排序 |
关键 API 速查
| 类/结构体 | 命名空间 | 用途 |
|---|---|---|
Material | UnityEngine | 控制渲染器上的着色器属性 |
Shader | UnityEngine | 引用已编译的着色器程序 |
Texture2D | UnityEngine | 二维纹理资源 |
RenderTexture | UnityEngine | GPU 渲染的纹理目标 |
Camera | UnityEngine | 场景视点和渲染控制 |
Renderer | UnityEngine | 所有渲染器的基类 |
MaterialPropertyBlock | UnityEngine | 在不实例化的情况下设置对象级着色器属性 |
CommandBuffer | UnityEngine.Rendering | GPU 命令列表 |
RenderGraph | UnityEngine.Rendering.RenderGraphModule | 管理帧渲染通道 |
TextureHandle | UnityEngine.Rendering.RenderGraphModule | Render Graph 纹理引用 |
BufferHandle | UnityEngine.Rendering.RenderGraphModule | Render Graph 缓冲区引用 |
RenderGraphBuilder | UnityEngine.Rendering.RenderGraphModule | 配置单个渲染通道 |
CoreUtils | UnityEngine.Rendering | 实用方法(DrawFullScreen 等) |
Volume | UnityEngine.Rendering | 后处理/环境效果容器 |
VolumeProfile | UnityEngine.Rendering | Volume 效果覆盖项集合 |
相关技能
- unity-lighting-vfx -- 灯光设置、灯光类型、烘焙、VFX Graph、粒子系统
- unity-platforms -- 平台特定的渲染设置、质量级别、着色器剔除
- unity-2d -- 2D Renderer(URP)、精灵渲染、Tilemap 渲染