mcpField
U
unity-graphics

unity-graphics

github.com/nice-wolf-studio开发4041 次安装6 周前更新
代码仓库

关于 unity-graphics

面向 Unity 图形开发者的渲染与图形参考技能,涵盖渲染管线、着色器、材质、摄像机和优化。它对比 Built-in、URP 与 HDRP,并说明各自的用途和注意事项。

主要功能

  1. 01对比 Built-in、URP 与 HDRP
  2. 02Shader Graph 与 HLSL 指南
  3. 03材质、纹理和摄像机参考
  4. 04Render Graph 与渲染优化

适用场景

  1. 01为新项目选择渲染管线
  2. 02编写或调试 Unity 着色器
  3. 03配置后处理与摄像机
  4. 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.md
materials-textures.md
shader-graph.md
urp-guide.md

详细介绍

Unity 图形与渲染

渲染管线选择指南

渲染管线会执行一系列操作,将场景内容呈现在屏幕上。Unity 提供三种渲染管线:

标准内置渲染管线通用渲染管线(URP)高清渲染管线(HDRP)
目标旧版项目从移动平台到高端主机/PCAAA、汽车、建筑可视化
自定义有限可编写脚本,通过 Renderer Features 扩展可编写脚本、自定义通道、完整帧设置
渲染路径前向、延迟前向、Forward+、延迟前向、延迟(混合瓦片/集群)
着色器编写ShaderLab + Surface ShadersShader Graph(推荐)、HLSLShader Graph(推荐)、HLSL
SRP Batcher否是是
光线追踪否否是(DXR)
体积效果否否是(雾、云)
抗锯齿MSAAFXAA、SMAA、TAA、MSAAFXAA、SMAA、TAA、MSAA
平台全部全部(可扩展)高端(DX11/12、Metal、Vulkan)
GPU 要求标准标准支持计算着色器

选择流程:

  1. 需要光线追踪、体积云或基于物理的天空?--> HDRP
  2. 需要面向移动平台、WebGL 或尽可能广泛的平台?--> URP
  3. 正在维护没有迁移预算的旧版项目?--> 内置渲染管线
  4. 正在启动新项目?--> 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 将着色器分为三种类型:

  1. 图形管线着色器 —— 最常见;与 Shader 对象配合使用,以确定场景外观
  2. 计算着色器 —— 在常规图形管线之外执行 GPU 计算
  3. 光线追踪着色器 —— 处理光线追踪计算(仅限 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 位精度,以优化移动平台性能

来源:Shaders Introduction

材质和纹理

材质与着色器协同工作,共同定义场景外观。

材质

关键工作流:

  • 创建材质资源并将其分配给 GameObject
  • 通过脚本在运行时修改材质属性
  • 使用材质变体管理大型材质集合
  • 将 Built-in 材质升级到 URP/HDRP,以避免渲染为粉色

Material API —— 关键属性和方法:

属性/方法用途
color材质的主颜色
mainTexture主纹理
shader已分配的着色器引用
renderQueue覆盖渲染顺序
enableInstancingGPU 实例化开关
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 曝光:**基于直方图,支持百分位选择、测光模式和预曝光,以便在使用物理光照单位时提高精度。

来源:Post-Processing

渲染图(Unity 6)

渲染图系统为自定义 SRP 渲染通道提供高层级表示,明确说明各通道如何使用资源。URP 和 HDRP 均使用渲染图。

核心原则
  1. 基于句柄的资源 —— 使用 TextureHandle、BufferHandle、RendererListHandle,而非直接引用
  2. 限定范围的访问 —— 只能在渲染通道执行代码中访问实际资源
  3. 显式声明 —— 每个通道都声明读取和写入操作,以便跟踪依赖关系
  4. 不持久化 —— 在一次执行中创建的资源无法传递到下一次执行
  5. 依赖 RTHandle —— 纹理使用 RTHandle 系统
三阶段执行(每帧)
  1. 设置 —— 声明所有渲染通道及资源依赖关系
  2. 编译 —— 系统剔除未使用的通道,并计算资源生命周期,以实现高效分配
  3. 执行 —— 按声明顺序运行未剔除的通道
关键 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 速查

类/结构体命名空间用途
MaterialUnityEngine控制渲染器上的着色器属性
ShaderUnityEngine引用已编译的着色器程序
Texture2DUnityEngine二维纹理资源
RenderTextureUnityEngineGPU 渲染的纹理目标
CameraUnityEngine场景视点和渲染控制
RendererUnityEngine所有渲染器的基类
MaterialPropertyBlockUnityEngine在不实例化的情况下设置对象级着色器属性
CommandBufferUnityEngine.RenderingGPU 命令列表
RenderGraphUnityEngine.Rendering.RenderGraphModule管理帧渲染通道
TextureHandleUnityEngine.Rendering.RenderGraphModuleRender Graph 纹理引用
BufferHandleUnityEngine.Rendering.RenderGraphModuleRender Graph 缓冲区引用
RenderGraphBuilderUnityEngine.Rendering.RenderGraphModule配置单个渲染通道
CoreUtilsUnityEngine.Rendering实用方法(DrawFullScreen 等)
VolumeUnityEngine.Rendering后处理/环境效果容器
VolumeProfileUnityEngine.RenderingVolume 效果覆盖项集合

相关技能

  • unity-lighting-vfx -- 灯光设置、灯光类型、烘焙、VFX Graph、粒子系统
  • unity-platforms -- 平台特定的渲染设置、质量级别、着色器剔除
  • unity-2d -- 2D Renderer(URP)、精灵渲染、Tilemap 渲染

Additional Resources

评论

支持 Markdown