Unity Learn home
View Tutorial Content
Steps

Writing Your First Shader in Unity

Tutorial
Intermediate
+0 XP
1 Hour
(260)
Summary
In this live training session we will learn the fundamentals of authoring shaders for Unity and you will learn how to write your very first shader. No prior knowledge of authoring shaders is required.
Select your Unity version
Last updated: July 11, 2023
5.x
Language
English

1.Session Introduction

In this live training session we will learn the fundamentals of authoring shaders for Unity and you will learn how to write your very first shader. No prior knowledge of authoring shaders is required. In this first step we will introduce our project and goals.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)


Note: The code below is not C# code. It should go inside a new Shader file.

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

2.Rendering In Unity

In this step we will give a brief overview of the rendering process in Unity.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

3.Anatomy Of An Unlit Shader

In this step we will learn the basic structure of an unlit shader and how it works.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)


Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

4.The Vertex Function

In this step we will review the code in the default unlit shader, starting with the vertex function.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

5.The Fragment Function and Color Tint

In this step we will explain the purpose of the fragment function in an Unlit shader and add a property to tint the color of our object.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

6.Making A Transparent Shader

In this step we will make our shader transparent and look at the purpose of the render queue and blend modes.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

7.Displacing Vertices and Clipping Pixels

In this step we will learn how to discard certain pixels in the vertex function for a cutout effect and move our vertices in the vertex function to create rippling displacement effects.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

8.Questions and Answers

In this step we will explain the purpose of the fragment function in an Unlit shader and add a property to tint the color of our object.
This content is hosted by a third party provider that does not allow video views without acceptance of Targeting Cookies. Please set your cookie preferences for Targeting Cookies to yes if you wish to view videos from these providers.
Type caption for embed (optional)

Hologram Shader Code

Shader "Unlit/SpecialFX/Cool Hologram" { Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,0.5)) = 0.25 _CutoutThresh("Cutout Threshold", Range(0.0,1.0)) = 0.2 _Distance("Distance", Float) = 1 _Amplitude("Amplitude", Float) = 1 _Speed ("Speed", Float) = 1 _Amount("Amount", Range(0.0,1.0)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _CutoutThresh; float _Distance; float _Amplitude; float _Speed; float _Amount; v2f vert (appdata v) { v2f o; v.vertex.x += sin(_Time.y * _Speed + v.vertex.y * _Amplitude) * _Distance * _Amount; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) + _TintColor; col.a = _Transparency; clip(col.r - _CutoutThresh); return col; } ENDCG } } }

Writing Your First Shader in Unity
Writing Your First Shader in Unity
General Tutorial Discussion
0
0
1. Session Introduction
0
0
2. Rendering In Unity
3
1
3. Anatomy Of An Unlit Shader
0
0
4. The Vertex Function
0
0
5. The Fragment Function and Color Tint
0
0
6. Making A Transparent Shader
0
0
7. Displacing Vertices and Clipping Pixels
3
3
8. Questions and Answers
0
1