Unity Shaders and Rendering
Overview
Reference for Unity's rendering systems, shader development, lighting configuration, and visual effects. Covers all three render pipelines, Shader Graph, hand-written shaders, and VFX Graph.
Render Pipeline Comparison
| Feature |
Built-in RP |
URP |
HDRP |
| Target |
Legacy projects |
Mobile, VR, wide range |
High-end PC/console |
| Shader language |
Surface shaders + HLSL |
HLSL (no surface shaders) |
HLSL |
| Shader Graph |
Yes |
Yes |
Yes |
| SRP Batcher |
No |
Yes |
Yes |
| Render Features |
No |
Yes (ScriptableRendererFeature) |
Custom Pass |
| Post-processing |
Post Processing Stack v2 |
Volume system (built-in) |
Volume system (built-in) |
| Ray tracing |
No |
No (probe-based) |
Yes (DXR) |
| Performance |
Moderate |
Optimized for scale |
Highest fidelity |
Recommendation: Use URP for new projects unless targeting high-end visuals exclusively (HDRP). Built-in RP is legacy -- migrate when possible.
Shader Graph
Getting Started
- Right-click in Project: Create > Shader Graph > URP > Lit Shader Graph
- Double-click to open Shader Graph editor
- Build node network connecting to Master Stack outputs
- Create a Material using the shader, assign to renderers
Master Stack Outputs (URP Lit)
| Output |
Type |
Purpose |
| Base Color |
Color (RGB) |
Albedo/diffuse color |
| Normal |
Vector3 |
Tangent-space normal map |
| Metallic |
Float (0-1) |
Metal vs. dielectric |
| Smoothness |
Float (0-1) |
Roughness inverse |
| Emission |
Color (RGB) |
Self-illumination |
| Alpha |
Float (0-1) |
Transparency |
| Alpha Clip Threshold |
Float |
Cutoff for alpha testing |
Common Node Patterns
| Effect |
Key Nodes |
| Dissolve |
Noise > Step > Alpha Clip + Edge emission |
| Scrolling UV |
Time > Multiply > Add to UV |
| Fresnel glow |
Fresnel Effect > Multiply color > Emission |
| Triplanar mapping |
Triplanar node (avoids UV stretching) |
| Color shift |
Lerp between colors using parameter or time |
| Vertex displacement |
Noise > Multiply > Add to Position |
| Outline |
Two-pass: inverted hull in custom render feature |
Shader Graph Sub Graphs
Extract reusable node groups into Sub Graphs (Create > Shader Graph > Sub Graph). Use for shared noise functions, UV transformations, or custom lighting models.
Hand-Written Shaders (ShaderLab + HLSL)
URP Shader Structure
Shader "Custom/SimpleUnlit"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
float2 uv : TEXCOORD0;
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
CBUFFER_START(UnityPerMaterial)
float4 _MainTex_ST;
half4 _Color;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
half4 tex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
return tex * _Color;
}
ENDHLSL
}
}
}
Key differences from Built-in shaders:
- Use
HLSLPROGRAM/ENDHLSL (not CGPROGRAM/ENDCG)
- Include URP shader library, not UnityCG.cginc
- Use
TEXTURE2D/SAMPLER macros (not sampler2D)
- Wrap properties in
CBUFFER_START(UnityPerMaterial) for SRP Batcher compatibility
Lighting
Light Types
| Type |
Use For |
Shadow Cost |
| Directional |
Sun, global illumination |
Low (cascaded shadow maps) |
| Point |
Torches, lamps |
Medium |
| Spot |
Flashlights, stage lights |
Medium |
| Area (baked only) |
Soft window light, panels |
High (bake only) |
Lighting Modes
| Mode |
Description |
Best For |
| Realtime |
Computed every frame |
Dynamic objects, few lights |
| Baked |
Pre-computed into lightmaps |
Static environments |
| Mixed |
Baked indirect + realtime direct |
Best balance |
Lightmap Baking Tips
- Set lightmap resolution based on scene scale (10-40 texels/unit for indoor)
- Use Light Probes for dynamic objects in baked scenes
- Use Reflection Probes for metallic/reflective surfaces
- Enable GPU Lightmapper for faster bake times
- Mark objects as Contribute GI in the Static flags
Post-Processing (Volume System)
Setup:
1. Add a Volume (Global or Local) to the scene
2. Create a Volume Profile asset
3. Add overrides: Bloom, Color Adjustments, Tonemapping, etc.
4. Camera must have Post Processing enabled (URP Camera settings)
| Effect |
Performance |
Notes |
| Bloom |
Low |
Use threshold to control intensity |
| Color Adjustments |
Very Low |
Saturation, contrast, color filter |
| Tonemapping |
Very Low |
ACES for cinematic look |
| Vignette |
Very Low |
Frame darkening |
| Ambient Occlusion (SSAO) |
Medium |
Disable on mobile |
| Depth of Field |
High |
Use Bokeh only for cinematics |
| Motion Blur |
Medium |
Can cause motion sickness in VR |
VFX Graph vs Particle System
| Feature |
Particle System (Shuriken) |
VFX Graph |
| Execution |
CPU |
GPU (compute shader) |
| Particle count |
Thousands |
Millions |
| Complexity |
Component-based, simple |
Node-based, complex |
| Platform |
All |
Compute shader capable only |
| Integration |
Physics, collision |
Limited physics |
Use Particle System for gameplay-integrated effects (physics collisions, small counts). Use VFX Graph for visual spectacles (rain, fire, magic, ambient particles).
URP Render Features
Extend URP rendering with custom ScriptableRendererFeatures:
public class OutlineFeature : ScriptableRendererFeature
{
OutlinePass _pass;
public override void Create()
{
_pass = new OutlinePass();
_pass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData data)
{
renderer.EnqueuePass(_pass);
}
}
Common uses: custom outlines, screen-space effects, render texture generation, stencil-based effects.
Additional Resources
Reference Files
references/shader-recipes.md -- Complete shader implementations: toon/cel shading, water, dissolve, hologram, force field, procedural skybox, stencil portal, vertex animation, custom lighting models
references/lighting-vfx-detail.md -- Advanced lighting setups, GI troubleshooting, VFX Graph cookbook (fire, smoke, electricity, portals), Scriptable Render Pipeline customization, custom render passes
1---2name: unity-shaders-rendering3description: Unity shaders, materials, and rendering pipelines (URP/HDRP/Built-in). PROACTIVELY activate for: (1) writing shaders in Shader Graph, HLSL, or ShaderLab, (2) URP and HDRP shader authoring, (3) custom render pipeline work (SRP), (4) lighting setup (baked vs realtime, lightmaps, Global Illumination), (5) post-processing stacks, (6) reflection probes and light probes, (7) custom render features and full-screen passes, (8) shader stripping and variant management, (9) compute shaders, (10) ray tracing in HDRP. Provides: Shader Graph templates, HLSL snippets, URP/HDRP differences, lighting setup recipes, render-feature examples, and shader-variant guidance.4---5
6# Unity Shaders and Rendering
7
8## Overview
9
10Reference for Unity's rendering systems, shader development, lighting configuration, and visual effects. Covers all three render pipelines, Shader Graph, hand-written shaders, and VFX Graph.
11
12## Render Pipeline Comparison
13
14| Feature | Built-in RP | URP | HDRP |
15|---------|------------|-----|------|
16| Target | Legacy projects | Mobile, VR, wide range | High-end PC/console |
17| Shader language | Surface shaders + HLSL | HLSL (no surface shaders) | HLSL |
18| Shader Graph | Yes | Yes | Yes |
19| SRP Batcher | No | Yes | Yes |
20| Render Features | No | Yes (ScriptableRendererFeature) | Custom Pass |
21| Post-processing | Post Processing Stack v2 | Volume system (built-in) | Volume system (built-in) |
22| Ray tracing | No | No (probe-based) | Yes (DXR) |
23| Performance | Moderate | Optimized for scale | Highest fidelity |
24
25**Recommendation:** Use URP for new projects unless targeting high-end visuals exclusively (HDRP). Built-in RP is legacy -- migrate when possible.
26
27## Shader Graph
28
29### Getting Started
30
311. Right-click in Project: Create > Shader Graph > URP > Lit Shader Graph
322. Double-click to open Shader Graph editor
333. Build node network connecting to Master Stack outputs
344. Create a Material using the shader, assign to renderers
35
36### Master Stack Outputs (URP Lit)
37
38| Output | Type | Purpose |
39|--------|------|---------|
40| Base Color | Color (RGB) | Albedo/diffuse color |
41| Normal | Vector3 | Tangent-space normal map |
42| Metallic | Float (0-1) | Metal vs. dielectric |
43| Smoothness | Float (0-1) | Roughness inverse |
44| Emission | Color (RGB) | Self-illumination |
45| Alpha | Float (0-1) | Transparency |
46| Alpha Clip Threshold | Float | Cutoff for alpha testing |
47
48### Common Node Patterns
49
50| Effect | Key Nodes |
51|--------|-----------|
52| **Dissolve** | Noise > Step > Alpha Clip + Edge emission |
53| **Scrolling UV** | Time > Multiply > Add to UV |
54| **Fresnel glow** | Fresnel Effect > Multiply color > Emission |
55| **Triplanar mapping** | Triplanar node (avoids UV stretching) |
56| **Color shift** | Lerp between colors using parameter or time |
57| **Vertex displacement** | Noise > Multiply > Add to Position |
58| **Outline** | Two-pass: inverted hull in custom render feature |
59
60### Shader Graph Sub Graphs
61
62Extract reusable node groups into Sub Graphs (Create > Shader Graph > Sub Graph). Use for shared noise functions, UV transformations, or custom lighting models.
63
64## Hand-Written Shaders (ShaderLab + HLSL)
65
66### URP Shader Structure
67
68```hlsl
69Shader "Custom/SimpleUnlit"
70{
71 Properties
72 {
73 _MainTex ("Texture", 2D) = "white" {}
74 _Color ("Color", Color) = (1,1,1,1)
75 }
76
77 SubShader
78 {
79 Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
80
81 Pass
82 {
83 HLSLPROGRAM
84 #pragma vertex vert
85 #pragma fragment frag
86
87 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
88
89 struct Attributes
90 {
91 float4 positionOS : POSITION;
92 float2 uv : TEXCOORD0;
93 };
94
95 struct Varyings
96 {
97 float4 positionHCS : SV_POSITION;
98 float2 uv : TEXCOORD0;
99 };
100
101 TEXTURE2D(_MainTex);
102 SAMPLER(sampler_MainTex);
103
104 CBUFFER_START(UnityPerMaterial)
105 float4 _MainTex_ST;
106 half4 _Color;
107 CBUFFER_END
108
109 Varyings vert(Attributes IN)
110 {
111 Varyings OUT;
112 OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
113 OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
114 return OUT;
115 }
116
117 half4 frag(Varyings IN) : SV_Target
118 {
119 half4 tex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
120 return tex * _Color;
121 }
122 ENDHLSL
123 }
124 }
125}
126```
127
128**Key differences from Built-in shaders:**
129- Use `HLSLPROGRAM`/`ENDHLSL` (not `CGPROGRAM`/`ENDCG`)
130- Include URP shader library, not UnityCG.cginc
131- Use `TEXTURE2D`/`SAMPLER` macros (not `sampler2D`)
132- Wrap properties in `CBUFFER_START(UnityPerMaterial)` for SRP Batcher compatibility
133
134## Lighting
135
136### Light Types
137
138| Type | Use For | Shadow Cost |
139|------|---------|-------------|
140| Directional | Sun, global illumination | Low (cascaded shadow maps) |
141| Point | Torches, lamps | Medium |
142| Spot | Flashlights, stage lights | Medium |
143| Area (baked only) | Soft window light, panels | High (bake only) |
144
145### Lighting Modes
146
147| Mode | Description | Best For |
148|------|-------------|----------|
149| Realtime | Computed every frame | Dynamic objects, few lights |
150| Baked | Pre-computed into lightmaps | Static environments |
151| Mixed | Baked indirect + realtime direct | Best balance |
152
153### Lightmap Baking Tips
154
155- Set lightmap resolution based on scene scale (10-40 texels/unit for indoor)
156- Use Light Probes for dynamic objects in baked scenes
157- Use Reflection Probes for metallic/reflective surfaces
158- Enable GPU Lightmapper for faster bake times
159- Mark objects as Contribute GI in the Static flags
160
161## Post-Processing (Volume System)
162
163```text
164Setup:
1651. Add a Volume (Global or Local) to the scene
1662. Create a Volume Profile asset
1673. Add overrides: Bloom, Color Adjustments, Tonemapping, etc.
1684. Camera must have Post Processing enabled (URP Camera settings)
169```
170
171| Effect | Performance | Notes |
172|--------|-------------|-------|
173| Bloom | Low | Use threshold to control intensity |
174| Color Adjustments | Very Low | Saturation, contrast, color filter |
175| Tonemapping | Very Low | ACES for cinematic look |
176| Vignette | Very Low | Frame darkening |
177| Ambient Occlusion (SSAO) | Medium | Disable on mobile |
178| Depth of Field | High | Use Bokeh only for cinematics |
179| Motion Blur | Medium | Can cause motion sickness in VR |
180
181## VFX Graph vs Particle System
182
183| Feature | Particle System (Shuriken) | VFX Graph |
184|---------|---------------------------|-----------|
185| Execution | CPU | GPU (compute shader) |
186| Particle count | Thousands | Millions |
187| Complexity | Component-based, simple | Node-based, complex |
188| Platform | All | Compute shader capable only |
189| Integration | Physics, collision | Limited physics |
190
191Use Particle System for gameplay-integrated effects (physics collisions, small counts). Use VFX Graph for visual spectacles (rain, fire, magic, ambient particles).
192
193## URP Render Features
194
195Extend URP rendering with custom ScriptableRendererFeatures:
196
197```csharp
198public class OutlineFeature : ScriptableRendererFeature
199{
200 OutlinePass _pass;
201
202 public override void Create()
203 {
204 _pass = new OutlinePass();
205 _pass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
206 }
207
208 public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData data)
209 {
210 renderer.EnqueuePass(_pass);
211 }
212}
213```
214
215Common uses: custom outlines, screen-space effects, render texture generation, stencil-based effects.
216
217## Additional Resources
218
219### Reference Files
220- **`references/shader-recipes.md`** -- Complete shader implementations: toon/cel shading, water, dissolve, hologram, force field, procedural skybox, stencil portal, vertex animation, custom lighting models
221- **`references/lighting-vfx-detail.md`** -- Advanced lighting setups, GI troubleshooting, VFX Graph cookbook (fire, smoke, electricity, portals), Scriptable Render Pipeline customization, custom render passes