6
2014
Sprite RGB Split Shader Test
Tried to make RGB Split Shader (by modifying the default sprite shader)
Features:
– No render textures (so it works with unity free/indie)
– Per object instead as post effect
– Offset variables per channel
Problems:
– 3 shader passes
– Red channel is currently not additively blended (because you would lose those black borders..)
Related topic:
Those shaders use render textures: http://forum.unity3d.com/threads/220068-RGB-Split-Shader
Webplayer:
http://unitycoder.com/upload/demos/RGBSplitShader/
Image credit:
http://opengameart.org/
Shader source:
// RGB sprite split shader test unitycoder.com Shader "UnityCoder/RGBSplitTest1" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} // _Color ("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 _RedOffsetX ("RedOffsetX", Float) = 0 _RedOffsetY ("RedOffsetY", Float) = 0 _GreenOffsetX ("GreenOffsetX", Float) = 0 _GreenOffsetY ("GreenOffsetY", Float) = 0 _BlueOffsetX ("BlueOffsetX", Float) = 0 _BlueOffsetY ("BlueOffsetY", Float) = 0 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Cull Off Lighting Off ZWrite Off Fog { Mode Off } // Blend SrcAlpha OneMinusSrcAlpha // Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv // RED Pass { //Blend One One Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv // Blend One One // Additive CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile DUMMY PIXELSNAP_ON #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; half2 texcoord : TEXCOORD0; }; // fixed4 _Color; float _RedOffsetX; float _RedOffsetY; v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex); OUT.texcoord = IN.texcoord; // OUT.color = IN.color * _Color; OUT.color = IN.color * float4(1,0,0,1); OUT.vertex.xy += float2(_RedOffsetX,_RedOffsetY); #ifdef PIXELSNAP_ON OUT.vertex = UnityPixelSnap (OUT.vertex); #endif return OUT; } sampler2D _MainTex; fixed4 frag(v2f IN) : COLOR { return tex2D(_MainTex, IN.texcoord) * IN.color; } ENDCG } // GREEN Pass { //Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv Blend One One // Additive CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile DUMMY PIXELSNAP_ON #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; half2 texcoord : TEXCOORD0; }; //fixed4 _Color; float _GreenOffsetX; float _GreenOffsetY; v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex); OUT.texcoord = IN.texcoord; // OUT.color = IN.color * _Color; OUT.color = IN.color * float4(0,1,0,1); OUT.vertex.xy += float2(_GreenOffsetX,_GreenOffsetY); #ifdef PIXELSNAP_ON OUT.vertex = UnityPixelSnap (OUT.vertex); #endif return OUT; } sampler2D _MainTex; fixed4 frag(v2f IN) : COLOR { return tex2D(_MainTex, IN.texcoord) * IN.color; } ENDCG } // end pass // BLUE Pass { //Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv Blend One One // Additive CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile DUMMY PIXELSNAP_ON #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; half2 texcoord : TEXCOORD0; }; //fixed4 _Color; float _BlueOffsetX; float _BlueOffsetY; v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex); OUT.texcoord = IN.texcoord; // OUT.color = IN.color * _Color; OUT.color = IN.color * float4(0,0,1,1); OUT.vertex.xy += float2(_BlueOffsetX,_BlueOffsetY); #ifdef PIXELSNAP_ON OUT.vertex = UnityPixelSnap (OUT.vertex); #endif return OUT; } sampler2D _MainTex; fixed4 frag(v2f IN) : COLOR { return tex2D(_MainTex, IN.texcoord) * IN.color; } ENDCG } // end pass } }
Related Posts
5 Comments + Add Comment
Leave a comment
Recent posts
- MotionVector Effect: Object “disappears” when paused
- [GreaseMonkey] Unity Forum Fixer
- UnityHub: Make Hub application background Translucent
- Customize SpriteShapeRenderer quality (but has issues)
- Editor tool: Copy selected gameobject’s names into clipboard as rows (for Excel)
- Editor tool: Replace string in selected gameobject’s names
- UnityHub: Enable built-in Login Dialog (no more browser login/logout issues!)
- Use TikTok-TTS in Unity (with WebRequest)
- Create Scene Thumbnail Image using OnSceneSaved & OnPreviewGUI
- webgl+javascript TTS
- Using Moonsharp (LUA) + Unity Webgl
- Using 3D gameobject prefabs with Unity Tilemap + NavMesh Surface
Recent Comments
- [Asset Store] Point Cloud Viewer & Tools on
- [Asset Store] Point Cloud Viewer & Tools on
- Vector3 maths for dummies! on
- UnityHub: Make Hub application background Translucent on
- UnityHub: Make Hub application background Translucent on
- Install Android SDK+JDK+NDK for Unity (without AndroidStudio or Unity Hub) on
- Install Android SDK+JDK+NDK for Unity (without AndroidStudio or Unity Hub) on
- [Asset Store] Point Cloud Viewer & Tools on
This is fantastic! Is this Pro-only and if so, is there a way to achieve something similar in Free?
Cheers~
this works with free, its just 3 pass shader (1 color per pass, with offset)
Oh! Super amazing then! I saw the forum post you linked to which required SystemInfo.supportsImageEffects and called OnRenderImage(). Would you be willing to share part of your source for this? 🙂 Cheers~
palette swap:
http://forum.unity3d.com/threads/212576-Shader-that-swaps-a-texture-s-pixels-colors-%28Color-Palette-swapper%29?p=1428427&viewfull=1#post1428427
Chromatic Aberration shader:
http://forum.unity3d.com/threads/contrast-and-hue-using-cg-in-unity.319748/#post-2079719