├── .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)
![alt text](https://github.com/thorkdev/shader-tuts/blob/master/SpriteGreyscale/sprite_greyscale_tutorial.gif "Sprite Greyscale Tutorial") 6 | 7 | --- 8 | 9 | ## Screen Shaders 10 | * [Palette](https://github.com/thorkdev/shader-tuts/tree/master/PaletteScreenShader)
![alt text](https://github.com/thorkdev/shader-tuts/blob/master/PaletteScreenShader/palette_example.png "Pallete Example") 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 --------------------------------------------------------------------------------