Unity 6 graphics and rendering guide. Use when working with render pipelines (URP, HDRP, Built-in), shaders, Shader Graph, materials, textures, cameras, post-processing, or rendering optimization. Covers Render Graph, batching, draw call optimization, and GPU instancing. Based on Unity 6.3 LTS documentation.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add IdoCohen560/claude-unity-game-studio --skill unity-graphics --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Unity Graphics?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/idocohen560-unity-graphics-claude-unity-game-studio)More formats (shields.io, HTML) on the badges page.
---
name: unity-graphics
description: >
Unity 6 graphics and rendering guide. Use when working with render pipelines (URP, HDRP, Built-in), shaders, Shader Graph, materials, textures, cameras, post-processing, or rendering optimization. Covers Render Graph, batching, draw call optimization, and GPU instancing. Based on Unity 6.3 LTS documentation.
globs:
- "**/*.shader"
- "**/*.hlsl" - "**/*.shadergraph"
- "**/*.shadersubgraph"
- "**/*.mat"
---
# Unity Graphics and Rendering
## Render Pipeline Selection Guide
A render pipeline performs a series of operations that take the contents of a scene and displays them on a screen. Unity provides three render pipelines:
| Criteria | Built-in Render Pipeline | Universal Render Pipeline (URP) | High Definition Render Pipeline (HDRP) |
|---|---|---|---|
| **Target** | Legacy projects | Mobile to high-end consoles/PCs | AAA, automotive, architectural |
| **Customization** | Limited | Scriptable, extensible via Renderer Features | Scriptable, Custom Passes, Full Frame Settings |
| **Rendering Paths** | Forward, Deferred | Forward, Forward+, Deferred | Forward, Deferred (hybrid tile/cluster) |
| **Shader Authoring** | ShaderLab + Surface Shaders | Shader Graph (recommended), HLSL | Shader Graph (recommended), HLSL |
| **SRP Batcher** | No | Yes | Yes |
| **Ray Tracing** | No | No | Yes (DXR) |
| **Volumetrics** | No | No | Yes (fog, clouds) |
| **Anti-Aliasing** | MSAA | FXAA, SMAA, TAA, MSAA | FXAA, SMAA, TAA, MSAA |
| **Platforms** | All | All (scalable) | High-end (DX11/12, Metal, Vulkan) |
| **GPU Requirement** | Standard | Standard | Compute shader capable |
**Decision flow:**
1. Need ray tracing, volumetric clouds, or physically-based sky? --> HDRP
2. Need to target mobile, WebGL, or widest platform range? --> URP
3. Maintaining a legacy project with no migration budget? --> Built-in
4. Starting a new project? --> URP (most projects) or HDRP (high fidelity)
> **Warning:** Render pipelines are NOT interchangeable. Materials, shaders, and post-processing from one pipeline do not work in another without conversion. Upgrading Built-in materials to URP/HDRP requires the pipeline's material upgrader; objects render bright pink if their shader is incompatible.
Source: [Render Pipelines](https://docs.unity3d.com/6000.3/Documentation/Manual/render-pipelines.html)
## URP (Universal Render Pipeline)
URP is a prebuilt Scriptable Render Pipeline made by Unity for creating optimized graphics across a range of platforms, from mobile to high-end consoles and PCs.
**Key features:**
- Forward, Forward+, and Deferred rendering paths
- Anti-aliasing: FXAA, SMAA, TAA, MSAA
- 2D Renderer for 2D games
- Renderer Features for custom rendering injection
- SRP Batcher for draw call optimization
- Built-in post-processing via Volume system
See: [references/urp-guide.md](references/urp-guide.md)
Source: [URP](https://docs.unity3d.com/6000.3/Documentation/Manual/universal-render-pipeline.html)
## HDRP (High Definition Render Pipeline)
HDRP is a prebuilt Scriptable Render Pipeline targeting AAA-quality games, automotive demos, and architectural visualization on high-end hardware. It requires compute shader-capable GPUs (DirectX 11/12, Metal, Vulkan).
**Key features:**
- Physically-based lighting with Physical Light Units
- Material types: Lit, StackLit, Layered Lit, Hair, Fabric, Eye, AxF, Terrain
- Ray tracing: reflections, GI, shadows, AO, subsurface scattering
- Volumetric fog and volumetric clouds
- Physically Based Sky, HDRI Sky, Gradient Sky
- Path tracing with denoising (Optix, Intel Open Image Denoise)
- Water system with caustics and underwater rendering
- Dynamic resolution with DLSS, FSR 1.0, TAA Upscaling
See: [references/hdrp-guide.md](references/hdrp-guide.md)
Source: [HDRP](https://docs.unity3d.com/6000.3/Documentation/Manual/high-definition-render-pipeline.html)
## Shader Graph
Shader Graph enables building shaders visually by creating and connecting nodes in a graph framework instead of writing code. Changes are reflected with instant feedback.
**Render pipeline compatibility:**
| Pipeline | Supported |
|---|---|
| URP | Yes |
| HDRP | Yes |
| Built-in Render Pipeline | Yes |
| Custom SRP | No |
Shader Graph is included automatically when you install URP or HDRP.
**Custom Function Node** -- Inject custom HLSL code into Shader Graphs:
- **String mode**: Write HLSL directly; use `$precision` token for half/float
- **File mode**: Reference external `.hlsl` files with include guards
```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
```
**Pipeline detection in Custom Function nodes:**
```hlsl
#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
```
**Conditional keywords by pipeline:**
- Built-in: `BUILTIN_PIPELINE_CORE_INCLUDED`
- URP: `UNIVERSAL_PIPELINE_CORE_INCLUDED`
- HDRP: `UNITY_HEADER_HD_INCLUDED`
- Preview window: `SHADERGRAPH_PREVIEW`
See: [references/shader-graph.md](references/shader-graph.md)
Source: [Shader Graph](https://docs.unity3d.com/6000.3/Documentation/Manual/shader-graph.html)
## Shaders
A shader is a program that runs on the GPU. Unity categorizes shaders into three types:
1. **Graphics Pipeline Shaders** -- Most common; work with Shader objects to determine scene appearance
2. **Compute Shaders** -- Perform GPU calculations outside the regular graphics pipeline
3. **Ray Tracing Shaders** -- Handle ray tracing calculations (HDRP only)
**Key terminology:**
- **Shader Object** -- Instance of the `Shader` class wrapping shader programs and GPU instructions
- **ShaderLab** -- Unity's language for defining Shader object structure
- **Shader Graph** -- Visual, code-free shader creation tool
- **Shader Asset** -- A `.shader` file defining a Shader object
- **HLSL** -- High Level Shader Language used inside shader code blocks
**Surface Shaders** (Built-in pipeline ONLY):
- Streamlined way to write lighting-interactive shaders
- Auto-generates vertex/pixel shaders and rendering passes
- NOT supported in URP or HDRP; use Shader Graph instead
**HLSL in ShaderLab:**
- Use `HLSLPROGRAM` directive to add shader code to Pass blocks
- Declare structs connecting shader variables to mesh vertex data
- Use `#pragma` directives to control compilation
- Support 16-bit precision for mobile optimization
Source: [Shaders Introduction](https://docs.unity3d.com/6000.3/Documentation/Manual/shader-introduction.html)
## Materials and Textures
Materials and shaders work together to define the appearance of a scene.
### Materials
**Key workflows:**
- Create material assets and assign them to GameObjects
- Modify material properties at runtime via scripting
- Use Material Variants for managing large material collections
- Upgrade Built-in materials to URP/HDRP to prevent pink rendering
**Material API -- Key properties and methods:**
| Property/Method | Purpose |
|---|---|
| `color` | Main color of the material |
| `mainTexture` | Primary texture |
| `shader` | Assigned shader reference |
| `renderQueue` | Render order override |
| `enableInstancing` | GPU instancing toggle |
| `SetColor(name, color)` | Change a color property |
| `SetFloat(name, value)` | Set a float property |
| `SetTexture(name, texture)` | Assign a texture |
| `SetVector(name, vector)` | Set a vector property |
| `SetMatrix(name, matrix)` | Set a matrix property |
| `HasProperty(name)` | Check if property exists |
| `EnableKeyword(keyword)` | Enable a shader keyword |
| `CopyPropertiesFromMaterial(mat)` | Copy from another material |
| `Lerp(start, end, t)` | Interpolate between materials |
> **Important:** Set your desired shader BEFORE modifying properties. Property assignments have no effect if the current shader does not support them.
### Textures
Textures are bitmap images applied to mesh surfaces. Key concepts:
- **Power-of-two dimensions** recommended: 32, 64, 128, 256, 512, 1024, 2048, 4096
- **LDR** (Low Dynamic Range): PNG, JPG -- values 0.0-1.0
- **HDR** (High Dynamic Range): EXR, HDR -- extended color ranges
- **RGBA**: RGB color plus alpha channel for transparency
- **Bits per pixel (bpp)**: Lower values reduce memory and improve GPU cache
- **Anisotropic filtering**: Improves quality at steep viewing angles
See: [references/materials-textures.md](references/materials-textures.md)
Source: [Materials](https://docs.unity3d.com/6000.3/Documentation/Manual/Materials.html), [Textures](https://docs.unity3d.com/6000.3/Documentation/Manual/Textures.html)
## Cameras
Cameras create an image of a particular viewpoint in a scene, with output displayed on-screen or captured as a texture.
**Projection modes:**
- **Perspective** -- Replicates human vision; distant objects appear smaller (default)
- **Orthographic** -- No perspective; objects render at consistent size regardless of distance; useful for isometric/2D games
**Key details:**
- At least one camera required per scene
- Multiple cameras supported with configurable render order
- Render path set in Player settings; overridable per camera
- URP and HDRP have pipeline-specific camera documentation
- Orthographic cameras render fog uniformly rather than depth-based
**Common camera setups:**
- Puzzle games: static camera for full visibility
- FPS: camera parented to player at eye level
- Racing: camera following the vehicle
Source: [Cameras](https://docs.unity3d.com/6000.3/Documentation/Manual/Cameras.html)
## Post-Processing
Post-processing effects simulate physical camera/film properties or enable stylized visuals.
| Pipeline | Post-Processing Solution |
|---|---|
| URP | Built-in (installed with URP template) |
| HDRP | Built-in (installed with HDRP template) |
| Built-in | Post-Processing Version 2 package (separate) |
> **Warning:** Post-processing solutions are NOT interchangeable across render pipelines. Each pipeline's effects and implementation methods differ.
**HDRP anti-aliasing options:**
- MSAA -- Most resource-intensive
- TAA -- Motion-dependent temporal smoothing
- SMAA -- Pattern-based edge blending
- FXAA -- Per-pixel; least intensive
**HDRP exposure:** Histogram-based with percentile selection, metering modes, and pre-exposure for precision with Physical Light Units.
Source: [Post-Processing](https://docs.unity3d.com/6000.3/Documentation/Manual/PostProcessingOverview.html)
## Render Graph (Unity 6)
The Render Graph system provides a high-level representation of custom SRP render passes, explicitly stating how passes use resources. Both URP and HDRP use Render Graph.
### Core Principles
1. **Handle-based resources** -- Use `TextureHandle`, `BufferHandle`, `RendererListHandle` instead of direct references
2. **Scoped access** -- Actual resources only accessible inside render pass execution code
3. **Explicit declaration** -- Each pass declares reads/writes, enabling dependency tracking
4. **No persistence** -- Resources created within one execution cannot carry to the next
5. **RTHandle dependency** -- Textures use RTHandle system
### Three-Phase Execution (per frame)
1. **Setup** -- Declare all render passes and resource dependencies
2. **Compilation** -- System culls unused passes, calculates resource lifetimes for efficient allocation
3. **Execution** -- Run non-culled passes in declaration order
### Key API Pattern -- AddRenderPass
```csharp
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 Key Methods
| Method | Purpose |
|---|---|
| `ReadTexture` / `WriteTexture` | Declare texture read/write dependency |
| `UseColorBuffer` / `UseDepthBuffer` | Write + auto-bind as render/depth target |
| `CreateTransientTexture` | Temporary texture scoped to pass |
| `ReadComputeBuffer` / `WriteComputeBuffer` | Declare buffer read/write |
| `UseRendererList` | Declare renderer list usage |
| `SetRenderFunc` | Set rendering callback |
| `EnableAsyncCompute` / `AllowPassCulling` | Control pass behavior |
**Resource creation:** `CreateTexture()`, `CreateComputeBuffer()`, `CreateRendererList()`
**Import external:** `ImportTexture()`, `ImportBackbuffer()`, `ImportBuffer()`
Source: [Render Graph](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@17.0/manual/render-graph-system.html)
## Rendering Optimization
### Draw Call Batching
Batching combines meshes using the same material so Unity renders them with fewer render state updates.
**SRP Batcher** (URP/HDRP only):
- Reduces CPU time for draw calls by minimizing render-state changes between calls
- Material data persists in GPU memory
- Uses dedicated per-object GPU constant buffer
- For best results: use as few shader variants as possible
- Compatible with URP, HDRP, and custom SRP; NOT Built-in pipeline
**Static Batching:**
- Merges stationary meshes into unified vertex/index buffers (world-space)
- Each buffer supports up to 64,000 vertices
- Works at build time or runtime
- Only for Mesh Renderers (not Skinned Mesh Renderers)
**Dynamic Batching:**
- Transforms vertices to world space on CPU at runtime
- Useful for procedurally generated geometry (particles, lines, trails)
- Meshes limited to 900 vertex attributes or 300 vertices
- **Not recommended** for most uses: CPU overhead may exceed draw call savings
- Not supported in HDRP
**GPU Instancing:**
- Renders multiple instances of the same mesh in one draw call
- Enable via `Material.enableInstancing`
- Add per-instance properties (color, transform) via HLSL macros
- Requires shader support with instancing macros
### Occlusion Culling
Prevents rendering of GameObjects hidden behind others. Works with frustum culling.
- **Baking phase** (Editor): Divides scene into cells, generates visibility data
- **Runtime**: Loads baked data, performs per-camera visibility queries
- **Best for**: GPU-bound projects with overdraw; small areas separated by solid geometry
- **Limitation**: Dynamic objects can be occluded but cannot occlude others
- URP/HDRP: Can use GPU occlusion culling instead of CPU-based approach
Source: [Draw Call Batching](https://docs.unity3d.com/6000.3/Documentation/Manual/DrawCallBatching.html), [SRP Batcher](https://docs.unity3d.com/6000.3/Documentation/Manual/SRPBatcher.html)
## Common Patterns (C#)
### Material Property Access at Runtime
```csharp
// 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");
```
### Instance vs Shared Material
```csharp
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 (Per-Object Variation Without Material Instances)
```csharp
// 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);
}
```
## Anti-Patterns
| Anti-Pattern | Problem | Solution |
|---|---|---|
| Modifying `renderer.sharedMaterial` at runtime | Changes the material asset; affects ALL objects using it | Use `renderer.material` (creates instance) or `MaterialPropertyBlock` |
| Creating new Material instances every frame | Memory leak; unbounded allocations | Cache material instances; use `MaterialPropertyBlock` for per-object variation |
| Using Surface Shaders in URP/HDRP | Not supported; will fail or render pink | Use Shader Graph or write HLSL shaders |
| Mixing render pipeline assets | Shaders/materials from wrong pipeline render pink | Use pipeline-specific shaders; run material upgrader when switching |
| Non-power-of-two texture dimensions | Compression fails; higher memory usage | Use 32, 64, 128, 256, 512, 1024, 2048, 4096 |
| Enabling dynamic batching by default | CPU overhead often exceeds draw call savings | Prefer SRP Batcher (URP/HDRP) or static batching |
| Too many shader variants | Increased build time, memory, and load time | Strip unused variants; minimize keyword usage |
| Using `Shader.Find()` at runtime | Slow; may fail if shader not included in build | Cache shader references; assign in Inspector |
| Forgetting to call `m_RenderGraph.Cleanup()` | GPU resource leak | Always cleanup in pipeline `Dispose()` |
| Ignoring render queue for transparent objects | Z-fighting, incorrect sort order | Set appropriate `renderQueue`; sort transparent back-to-front |
## Key API Quick Reference
| Class/Struct | Namespace | Purpose |
|---|---|---|
| `Material` | `UnityEngine` | Controls shader properties on a renderer |
| `Shader` | `UnityEngine` | References compiled shader programs |
| `Texture2D` | `UnityEngine` | 2D texture asset |
| `RenderTexture` | `UnityEngine` | GPU-rendered texture target |
| `Camera` | `UnityEngine` | Scene viewpoint and rendering control |
| `Renderer` | `UnityEngine` | Base class for all renderers |
| `MaterialPropertyBlock` | `UnityEngine` | Per-object shader properties without instancing |
| `CommandBuffer` | `UnityEngine.Rendering` | GPU command list |
| `RenderGraph` | `UnityEngine.Rendering.RenderGraphModule` | Frame render pass management |
| `TextureHandle` | `UnityEngine.Rendering.RenderGraphModule` | Render Graph texture reference |
| `BufferHandle` | `UnityEngine.Rendering.RenderGraphModule` | Render Graph buffer reference |
| `RenderGraphBuilder` | `UnityEngine.Rendering.RenderGraphModule` | Configures individual render passes |
| `CoreUtils` | `UnityEngine.Rendering` | Utility methods (DrawFullScreen, etc.) |
| `Volume` | `UnityEngine.Rendering` | Post-processing/environment effect container |
| `VolumeProfile` | `UnityEngine.Rendering` | Collection of volume effect overrides |
## Related Skills
- **unity-lighting-vfx** -- Lighting setup, light types, baking, VFX Graph, particle systems
- **unity-platforms** -- Platform-specific rendering settings, quality tiers, shader stripping
- **unity-2d** -- 2D Renderer (URP), sprite rendering, tilemap rendering
## Additional Resources
- [Render Pipelines Overview](https://docs.unity3d.com/6000.3/Documentation/Manual/render-pipelines.html)
- [URP Documentation](https://docs.unity3d.com/6000.3/Documentation/Manual/universal-render-pipeline.html)
- [HDRP Documentation](https://docs.unity3d.com/6000.3/Documentation/Manual/high-definition-render-pipeline.html)
- [Shader Introduction](https://docs.unity3d.com/6000.3/Documentation/Manual/shader-introduction.html)
- [Shader Graph](https://docs.unity3d.com/6000.3/Documentation/Manual/shader-graph.html)
- [Materials](https://docs.unity3d.com/6000.3/Documentation/Manual/Materials.html)
- [Textures](https://docs.unity3d.com/6000.3/Documentation/Manual/Textures.html)
- [Cameras](https://docs.unity3d.com/6000.3/Documentation/Manual/Cameras.html)
- [Post-Processing](https://docs.unity3d.com/6000.3/Documentation/Manual/PostProcessingOverview.html)
- [Draw Call Batching](https://docs.unity3d.com/6000.3/Documentation/Manual/DrawCallBatching.html)
- [SRP Batcher](https://docs.unity3d.com/6000.3/Documentation/Manual/SRPBatcher.html)
- [Occlusion Culling](https://docs.unity3d.com/6000.3/Documentation/Manual/OcclusionCulling.html)
- [Render Graph API (SRP Core 17.0)](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@17.0/manual/render-graph-system.html)
- [Shader Graph 17.0](https://docs.unity3d.com/Packages/com.unity.shadergraph@17.0/manual/index.html)
- [HDRP Features](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@17.0/manual/HDRP-Features.html)
- [Material Scripting API](https://docs.unity3d.com/6000.3/Documentation/ScriptReference/Material.html)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!