Version: Unity 6 (6000.0)
Language : English
Writing Surface Shaders
Surface Shader output structures in the Built-In Render Pipeline

Introduction to surface shaders in the Built-In Render Pipeline

In the Built-in Render PipelineA series of operations that take the contents of a Scene, and displays them on a screen. Unity lets you choose from pre-built render pipelines, or write your own. More info
See in Glossary
, Surface ShadersA program that runs on the GPU. More info
See in Glossary
are a streamlined way of writing shaders that interact with lighting.

Render pipeline compatibility

Feature name Universal Render Pipeline (URP) High Definition Render Pipeline (HDRP) Custom SRP Built-in Render Pipeline
Surface Shaders No

For a streamlined way of creating Shader objects in URP, see Shader Graph.
No

For a streamlined way of creating Shader objects in HDRP, see Shader Graph.
No Yes

Overview

Writing shaders that interact with lighting is complex. There are different light types, different shadow options, different rendering pathsThe technique that a render pipeline uses to render graphics. Choosing a different rendering path affects how lighting and shading are calculated. Some rendering paths are more suited to different platforms and hardware than others. More info
See in Glossary
(forward and deferred rendering), and the shader should somehow handle all that complexity.

Surface Shaders is a code generation approach that makes it much easier to write lit shaders than using low level vertex/pixel shader programs.

For some examples, take a look at Surface Shader Examples.

How it works

You define a “surface function” that takes any UVs or data you need as input, and fills in output structure SurfaceOutput. SurfaceOutput basically describes properties of the surface (its albedo color, normal, emission, specularity etc.). You write this code in HLSL.

Surface Shader compiler then figures out what inputs are needed, what outputs are filled and so on, and generates actual vertex&pixel shaders, as well as rendering passes to handle forward and deferred rendering.

Surface Shaders and DirectX 11 HLSL syntax

Currently some parts of surface shader compilation pipeline do not understand DirectX 11-specific HLSL syntax, so if you’re using HLSL features like StructuredBuffers, RWTextures and other non-DX9 syntax, you have to wrap it into a DX11-only preprocessor macro.

See Platform Specific Differences and Using HLSL pages for details.

Additional resources

Writing Surface Shaders
Surface Shader output structures in the Built-In Render Pipeline