This example shows a basic URP-compatible shader. This shader fills the meshThe main graphics primitive of Unity. Meshes make up a large part of your 3D worlds. Unity supports triangulated or Quadrangulated polygon meshes. Nurbs, Nurms, Subdiv surfaces must be converted to polygons. More info
See in Glossary shape with a color predefined in the shader code.
To try the shader for yourself, copy and paste the following ShaderLab code into the Shader asset.
// This shader fills the mesh shape with a color predefined in the code. Shader "Example/URPUnlitShaderBasic" { // The properties block of the Unity shader. In this example this block is empty // because the output color is predefined in the fragment shader code. Properties { } // The SubShader block containing the Shader code. SubShader { // SubShader Tags define when and under which conditions a SubShader block or // a pass is executed. Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" } Pass { // The HLSL code block. Unity SRP uses the HLSL language. HLSLPROGRAM // This line defines the name of the vertex shader. #pragma vertex vert // This line defines the name of the fragment shader. #pragma fragment frag // The Core.hlsl file contains definitions of frequently used HLSL // macros and functions, and also contains #include references to other // HLSL files (for example, Common.hlsl, SpaceTransforms.hlsl, etc.). #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" // The structure definition defines which variables it contains. // This example uses the Attributes structure as an input structure in // the vertex shader. struct Attributes { // The positionOS variable contains the vertex positions in object // space. float4 positionOS : POSITION; }; struct Varyings { // The positions in this struct must have the SV_POSITION semantic. float4 positionHCS : SV_POSITION; }; // The vertex shader definition with properties defined in the Varyings // structure. The type of the vert function must match the type (struct) // that it returns. Varyings vert(Attributes IN) { // Declaring the output object (OUT) with the Varyings struct. Varyings OUT; // The TransformObjectToHClip function transforms vertex positions // from object space to homogenous clip space. OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz); // Returning the output. return OUT; } // The fragment shader definition. half4 frag() : SV_Target { // Defining the color variable and returning it. half4 customColor = half4(0.5, 0, 0, 1); return customColor; } ENDHLSL } } }
The fragment shader colors the GameObjectThe fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it. More info
See in Glossary dark red (RGB value (0.5, 0, 0)).
The following section introduces you to the structure of this basic Unity shader.
Unity shaders are written in a Unity-specific language called ShaderLabUnity’s language for defining the structure of Shader objects. More info
See in Glossary.
The Unity shader in this example has the following blocks:
ShaderLab code starts with the Shader
declaration.
Shader "Example/URPUnlitShaderBasic"
The path in this declaration determines the display name and location of the Unity shader in the Shader menu on a Material. The method Shader.Find also uses this path.
The Properties block contains the declarations of properties that users can set in the InspectorA Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
See in Glossary window on a Material.
In this example, the Properties block is empty, because this Unity shader does not expose any Material properties that a user can define.
A Unity shader source file contains one or more SubShader blocks. When rendering a mesh, Unity selects the first SubShader that is compatible with the GPU on the target device.
A SubShader block can optionally contain a SubShader Tags block. Use the Tags
keyword to declare a SubShader Tags block.
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
A SubShader Tag with a name of RenderPipeline
tells Unity which render pipelinesA 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 to use this SubShader with, and the value of UniversalPipeline
indicates that Unity should use this SubShader with URP.
To execute the same shader in different render pipelines, create multiple SubShader blocks with different RenderPipeline
tag values. To execute a SubShader block in HDRP, set the RenderPipeline
tag to HDRenderPipeline
, to execute it in the Built-in Render Pipeline, set RenderPipeline
to an empty value.
For more information on SubShader Tags, refer to ShaderLab: SubShader Tags.
In this example, there is one Pass block that contains the HLSL program code. For more information on Pass blocks, refer to ShaderLab: Pass.
A Pass block can optionally contain a Pass tags block. For more information, refer to URP ShaderLab Pass tags.
This block contains the HLSL program code.
Note: HLSL language is the preferred language for URP shaders.
Note: URP supports the CG language. If you add the CGPROGRAM/ENDCGPROGRAM block in a shader, Unity includes shaders from the Built-in Render Pipeline library automatically. If you include shaders from the SRP shader library, some SRP shader macros and functions might conflict with the Built-in Render Pipeline shader functions. Shaders with the CGPROGRAM block are not SRP Batcher compatible.
This block contains the #include
declaration with the reference to the Core.hlsl
file.
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
The Core.hlsl
file contains definitions of frequently used HLSL macros and functions, and also contains #include references to other HLSL files (for example, Common.hlsl
and SpaceTransforms.hlsl
).
For example, the vertex shaderA program that runs on each vertex of a 3D model when the model is being rendered. More info
See in Glossary in the HLSL code uses the TransformObjectToHClip
function from the SpaceTransforms.hlsl
file. The function transforms vertex positions from object space to homogenous space:
Varyings vert(Attributes IN) { Varyings OUT; OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz); return OUT; }
The fragment shader in this basic HLSL code outputs the single color predefined in the code:
half4 frag() : SV_Target { half4 customColor; customColor = half4(0.5, 0, 0, 1); return customColor; }
Section URP unlit shader with color input shows how to add the editable color property in the Inspector window on the Material.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.
When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and change our default settings. However, blocking some types of cookies may impact your experience of the site and the services we are able to offer.
More information
These cookies enable the website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly.
These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us to know which pages are the most and least popular and see how visitors move around the site. All information these cookies collect is aggregated and therefore anonymous. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance.
These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. They do not store directly personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising. Some 3rd party video providers do not allow video views without targeting cookies. If you are experiencing difficulty viewing a video, you will need to set your cookie preferences for targeting to yes if you wish to view videos from these providers. Unity does not control this.
These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms. You can set your browser to block or alert you about these cookies, but some parts of the site will not then work. These cookies do not store any personally identifiable information.