Unity graphics
Skill IdoCohen560/claude-unity-game-studio/examples/my-first-game/.claude/skills/unity-graphics
AI-powered Unity game development studio for Claude Code - 49 agents, 120+ skills, and a full studio hierarchy that turns a single AI session into a coordinated game dev team. View more about me in my portfolio.
npx -y skills add IdoCohen560/claude-unity-game-studio --skill unity-graphicsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
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.
SKILL.md
21.1 KB, as published. Nobody here has run it
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:
- Need ray tracing, volumetric clouds, or physically-based sky? --> HDRP
- Need to target mobile, WebGL, or widest platform range? --> URP
- Maintaining a legacy project with no migration budget? --> Built-in
- 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
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 Source: URP
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 Source: HDRP
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
$precisiontoken for half/float - File mode: Reference external
.hlslfiles with include guards
// 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:
#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 Source: Shader Graph
Shaders
A shader is a program that runs on the GPU. Unity categorizes shaders into three types:
- Graphics Pipeline Shaders -- Most common; work with Shader objects to determine scene appearance
- Compute Shaders -- Perform GPU calculations outside the regular graphics pipeline
- Ray Tracing Shaders -- Handle ray tracing calculations (HDRP only)
Key terminology:
- Shader Object -- Instance of the
Shaderclass 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
.shaderfile 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
HLSLPROGRAMdirective to add shader code to Pass blocks - Declare structs connecting shader variables to mesh vertex data
- Use
#pragmadirectives to control compilation - Support 16-bit precision for mobile optimization
Source: Shaders Introduction
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 Source: Materials, Textures
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
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
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
- Handle-based resources -- Use
TextureHandle,BufferHandle,RendererListHandleinstead of direct references - Scoped access -- Actual resources only accessible inside render pass execution code
- Explicit declaration -- Each pass declares reads/writes, enabling dependency tracking
- No persistence -- Resources created within one execution cannot carry to the next
- RTHandle dependency -- Textures use RTHandle system
Three-Phase Execution (per frame)
- Setup -- Declare all render passes and resource dependencies
- Compilation -- System culls unused passes, calculates resource lifetimes for efficient allocation
- Execution -- Run non-culled passes in declaration order
Key API Pattern -- 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 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
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, SRP Batcher
Common Patterns (C#)
Material Property Access at Runtime
// 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
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)
// 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