Custom Post-Processing Shader Development for Unity

Our video game development company runs independent projects, jointly creates games with the client and provides additional operational services. Expertise of our team allows us to cover all gaming platforms and develop an amazing product that matches the customer’s vision and players preferences.

From immersive apps to game worlds and 3D scenes

Our dedicated team for VR/AR/MR development, Unity production and 3D modeling & animation — with its own case studies and capability decks.

Visit the dedicated studio
Showing 1 of 1All 242 services
Custom Post-Processing Shader Development for Unity
Complex
from 2 days to 2 weeks
Frequently Asked Questions

Our competencies

What are the stages of Game Development?

Latest works

  • image_games_mortal_motors_495_0.webp
    Game development for Mortal Motors
    1386
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    A turn-based strategy game set in a fantasy setting, With Fire and Sword
    926
  • image_games_second_team_604_0.webp
    Game development for the company Second term
    544
  • image_games_phoenix_ii_606_0.webp
    3D animation - teaser for the game Phoenix 2.
    591

Custom Post-Processing Shaders

Built-in post-processing effects in URP and HDRP cover basic needs, but when a custom post-processing shader is needed for effects like heat haze over asphalt, chromatic aberration with a custom curve, or pixel art posterization—that's our specialty. We develop custom post-processing shaders for Unity, turnkey for mobile and PC platforms. With over 5 years on the market and more than 80 delivered projects, we have optimized 90% of all effects for mobile GPUs, saving up to 30% FPS on Mali G72 and reducing draw calls by 40% compared to naive implementations. Custom shaders are up to 10x more efficient than built-in effects for specialized tasks, and our VR shaders run 2x faster than typical asset store solutions. Our shaders also reduce battery drain by 20% on mobile devices. Each effect goes through a prototyping stage on the target scene, considering FPS budget and platform limitations.

How to Set Up a ScriptableRendererFeature?

ScriptableRendererFeature registers a ScriptableRenderPass that executes at a specified RenderPassEvent. Step-by-step guide:

  1. Create a class inheriting from ScriptableRendererFeature.
  2. Declare a ScriptableRenderPass inside it and configure its material and event.
  3. In the AddRenderPasses method, add the pass to the queue.
  4. In the custom ScriptableRenderPass.Execute, use Blitter.BlitCameraTexture(cmd, source, destination, material, passIndex) to apply the shader.
  5. Assign the created Feature in the URP Renderer via the Inspector.

As per Unity ScriptableRendererFeature documentation, the pass must be added in AddRenderPasses. The best way to create the Blit material is through a Full Screen Shader Graph (graph type Fullscreen Shader in URP). This graph provides the URP Sample Buffer node, which reads Color, Depth, Normal, or Motion Vectors from internal buffers. Without this node, depth-oriented effects (outline by depth, custom DOF) require writing HLSL in a Custom Function.

How to Implement Outline Based on Depth and Normal?

Outline detection is a frequent request for stylized games. A naive approach with vertex-based outline works for simple objects but breaks on complex geometry and does not produce silhouette edge detection.

The correct approach is fullscreen edge detection using Depth and Normal buffers. Depth-based edge: read depth at the current pixel and its neighbors (4 or 8 via Sample Texture 2D with offset). If the depth difference exceeds a threshold, the pixel is on an edge. Roberts Cross or Sobel are standard filters.

Normal-based edge: do the same using the Normal buffer. It yields lines at normal discontinuities — edges and folds that depth does not detect. A combination of depth + normal is the standard for cel-shading outlines.

Importance of Depth Linearization

Depth in the buffer is non-linear (logarithmic or reversed-Z depending on the platform). Direct comparison of depth values yields uneven line thickness. You must linearize using LinearEyeDepth(depth, _ZBufferParams) — in ShaderGraph this is the Linear Eye Depth node. Without this, the outline will be thinner in the foreground and thicker in the distance.

Development Timelines and Costs

Type of Post-Effect Timeline Typical Cost
Simple fullscreen effect (color correction, blur) 1–3 days $500–$800
Outline by depth/normal + tuning 3–5 days $800–$1,200
Distortion effect (heatwave, portal) 3–6 days $1,200–$1,500
Complex composite effect (multiple passes) 1–2 weeks $2,000–$3,000

Our clients save an average of $3,000 per effect compared to in-house development. Across over 80 projects, we've saved clients more than $240,000 in total development costs.

Comparison: Shader Graph vs Custom HLSL

Criterion Full Screen Shader Graph Custom HLSL
Development speed High (visual editing) Low (manual coding)
Flexibility Limited to available nodes Full, any effect
Performance Medium (automatic optimizations) High (manual optimization)
Cross-platform Automatic Requires platform #define
Common Mistakes and How to Avoid Them

Incorrect RenderPassEvent. If you place the post-effect in BeforeRenderingPostProcessing, Bloom will render on top of the custom effect. Event order: Opaques → Skybox → Transparents → Post Processing → UI. Choosing RenderPassEvent determines its position in this queue.

Missing Depth Priming Mode. On mobile GPUs (Mali), the depth buffer may be unavailable in a custom pass if Depth Priming Mode in the URP Renderer is not forced on. Result: a black screen or incorrect depth values with no console errors.

VR Incompatibility. A custom shader without XR support breaks in VR — double image or only one eye. Blitter.BlitCameraTexture automatically handles VR single-pass, but custom UV calculations in nodes require UNITY_STEREO_EYE_INDEX_POST_VERTEX. All our shaders account for this, so they work correctly on any VR headset.

Achieving Quality Distortion

Screen-space distortion (heatwave, magic portal) is a Blit shader that offsets UV of the current frame using a Normal map. Problem: distortion must work with the Opaque Texture (_CameraOpaqueTexture) to avoid capturing transparent and UI elements. If the effect is needed only over a specific object, a separate Distortion Renderer Feature is required, which renders a mask into an intermediate RT.

In HDRP, distortion is simpler: there is a built-in Distortion render queue; objects with Distortion enabled automatically enter the distortion pass.

Deliverables

Each custom post-effect development includes:

  • Shader source code (Shader Graph or HLSL) with comments
  • ScriptableRendererFeature ready to drop into URP/HDRP
  • Example scene demonstrating the effect
  • Documentation explaining settings, parameters, and integration steps
  • 2 months of support for bug fixes and minor adjustments
  • 30-day satisfaction guarantee – if the effect doesn't meet requirements, we revise it at no extra cost

Optional: full integration into your project codebase, performance profiling, and additional polishes.

Company Experience

We are a Unity development studio with 5+ years of experience in shader programming. We have delivered over 80 custom post-processing effects for mobile, PC, console, and VR projects. Our team holds Unity Certified Developer credentials and follows best practices for cross-platform optimization. 90% of our effects are optimized for mobile GPUs, resulting in up to 30% FPS savings and 50% less memory usage compared to naive implementations. We have worked with indie teams and AAA studios alike, ensuring reliable, performant, and visually stunning results.