├── .gitignore
├── PaletteScreenShader
├── PaletteScreenShader.shader
├── PaletteScreenShader.shader.meta
├── ScreenPaletteEffect.cs
├── ScreenPaletteEffect.cs.meta
└── palette_example.png
├── README.md
└── SpriteGreyscale
├── GreyscaleShader.shader
└── sprite_greyscale_tutorial.gif
/.gitignore:
--------------------------------------------------------------------------------
1 | # This .gitignore file should be placed at the root of your Unity project directory
2 | #
3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
4 | #
5 | /[Ll]ibrary/
6 | /[Tt]emp/
7 | /[Oo]bj/
8 | /[Bb]uild/
9 | /[Bb]uilds/
10 | /[Ll]ogs/
11 | /[Mm]emoryCaptures/
12 |
13 | # Asset meta data should only be ignored when the corresponding asset is also ignored
14 | !/[Aa]ssets/**/*.meta
15 |
16 | # Uncomment this line if you wish to ignore the asset store tools plugin
17 | # /[Aa]ssets/AssetStoreTools*
18 |
19 | # Autogenerated Jetbrains Rider plugin
20 | [Aa]ssets/Plugins/Editor/JetBrains*
21 |
22 | # Visual Studio cache directory
23 | .vs/
24 |
25 | # Gradle cache directory
26 | .gradle/
27 |
28 | # Autogenerated VS/MD/Consulo solution and project files
29 | ExportedObj/
30 | .consulo/
31 | *.csproj
32 | *.unityproj
33 | *.sln
34 | *.suo
35 | *.tmp
36 | *.user
37 | *.userprefs
38 | *.pidb
39 | *.booproj
40 | *.svd
41 | *.pdb
42 | *.mdb
43 | *.opendb
44 | *.VC.db
45 |
46 | # Unity3D generated meta files
47 | *.pidb.meta
48 | *.pdb.meta
49 | *.mdb.meta
50 |
51 | # Unity3D generated file on crash reports
52 | sysinfo.txt
53 |
54 | # Builds
55 | *.apk
56 | *.unitypackage
57 |
58 | # Crashlytics generated file
59 | crashlytics-build.properties
60 |
61 |
--------------------------------------------------------------------------------
/PaletteScreenShader/PaletteScreenShader.shader:
--------------------------------------------------------------------------------
1 | Shader "Hidden/PaletteScreenShader"
2 | {
3 | Properties
4 | {
5 | [PerRendererData] _MainTex("Base (RGB)", 2D) = "white" {}
6 |
7 | _ColorCount("Color Count", Int) = 4
8 |
9 | _Intensity("Intensity", Range(0, 1)) = 1
10 | _Threshold("Threshold", Range(0, 1)) = 0.2
11 | }
12 |
13 | SubShader
14 | {
15 | Pass
16 | {
17 | CGPROGRAM
18 |
19 | #pragma exclude_renderers flash
20 | #pragma vertex vert_img
21 | #pragma fragment frag
22 | #pragma fragmentoption ARB_precision_hint_fastest
23 |
24 | #include "UnityCG.cginc"
25 |
26 | uniform sampler2D _MainTex;
27 |
28 | uniform int _ColorCount;
29 | uniform fixed4 _Colors[256];
30 | uniform half _Intensity;
31 | uniform float _Threshold;
32 |
33 | fixed4 frag(v2f_img i) : COLOR
34 | {
35 | fixed4 c = tex2D(_MainTex, i.uv);
36 |
37 | fixed ct = c.rgb;
38 |
39 | for (int i = 0; i < _ColorCount; i++)
40 | {
41 | fixed cc = distance(c, _Colors[i]);
42 |
43 | c.rgb = lerp(c.rgb, (ct > cc - _Threshold && ct < cc + _Threshold) ? _Colors[i].rgb : c.rgb, _Intensity);
44 | }
45 |
46 | return c;
47 | }
48 |
49 | ENDCG
50 |
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/PaletteScreenShader/PaletteScreenShader.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 0cb98eed4f497314a91f48ede5440c61
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/PaletteScreenShader/ScreenPaletteEffect.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 |
3 | [ExecuteInEditMode]
4 | public class ScreenPaletteEffect : MonoBehaviour
5 | {
6 | public Color[] colors = new Color[4]
7 | {
8 | Color.white,
9 | Color.white,
10 | Color.white,
11 | Color.white
12 | };
13 |
14 | [Range(0f, 1f)]
15 | public float intensity = 1f;
16 |
17 | [Range(0f, 1f)]
18 | public float threshold = 0.15f;
19 |
20 | private Material material;
21 |
22 | private void Awake()
23 | {
24 | material = new Material(Shader.Find("Hidden/PaletteScreenShader"));
25 | }
26 |
27 | private void OnRenderImage(RenderTexture source, RenderTexture destination)
28 | {
29 | if (!material)
30 | {
31 | return;
32 | }
33 |
34 | material.SetFloat("_ColorCount", colors.Length);
35 | material.SetColorArray("_Colors", colors);
36 | material.SetFloat("_Intensity", intensity);
37 | material.SetFloat("_Threshold", threshold);
38 |
39 | Graphics.Blit(source, destination, material);
40 | }
41 | }
--------------------------------------------------------------------------------
/PaletteScreenShader/ScreenPaletteEffect.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c21335b3bffc0a34d8cf57b0f66c5108
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/PaletteScreenShader/palette_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thorkdev/shader-tuts/cefd722ded4b402dc749bbabac0983dac71e445a/PaletteScreenShader/palette_example.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # shader-tuts
2 | A collection of shader tutorials for Unity!
3 |
4 | ## Sprite Shaders
5 | * [Greyscale](https://github.com/thorkdev/shader-tuts/tree/master/SpriteGreyscale)

6 |
7 | ---
8 |
9 | ## Screen Shaders
10 | * [Palette](https://github.com/thorkdev/shader-tuts/tree/master/PaletteScreenShader)

11 |
12 | ---
13 |
--------------------------------------------------------------------------------
/SpriteGreyscale/GreyscaleShader.shader:
--------------------------------------------------------------------------------
1 | Shader "Thor/Sprites/GreyscaleShader"
2 | {
3 | Properties
4 | {
5 | [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
6 | _Color("Tint", Color) = (1, 1,1 , 1)
7 |
8 | _Greyscale("Greyscale", Range(0, 1)) = 1
9 |
10 | [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)
11 | [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1)
12 | [PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {}
13 | [PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0
14 | }
15 |
16 | SubShader
17 | {
18 | Tags
19 | {
20 | "Queue" = "Transparent"
21 | "IgnoreProjector" = "True"
22 | "RenderType" = "Transparent"
23 | "PreviewType" = "Plane"
24 | "CanUseSpriteAtlas" = "True"
25 | }
26 |
27 | Cull Off
28 | Lighting Off
29 | ZWrite Off
30 | Blend SrcAlpha OneMinusSrcAlpha
31 |
32 | Pass
33 | {
34 | CGPROGRAM
35 |
36 | #pragma vertex SpriteVert
37 | #pragma fragment frag
38 | #pragma target 2.0
39 | #pragma multi_compile_instancing
40 | #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
41 |
42 | #include "UnitySprites.cginc"
43 |
44 | half _Greyscale;
45 |
46 | fixed4 frag(v2f IN) : SV_Target
47 | {
48 | fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
49 |
50 | c.rgb = lerp(c.rgb, dot(c.rgb, float3(0.3, 0.59, 0.11)), _Greyscale);
51 |
52 | c.rgb *= c.a;
53 |
54 | return c;
55 | }
56 |
57 | ENDCG
58 |
59 | }
60 | }
61 |
62 | Fallback "Sprites/Default"
63 | }
--------------------------------------------------------------------------------
/SpriteGreyscale/sprite_greyscale_tutorial.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thorkdev/shader-tuts/cefd722ded4b402dc749bbabac0983dac71e445a/SpriteGreyscale/sprite_greyscale_tutorial.gif
--------------------------------------------------------------------------------