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
- Convert LAS/LAZ/PLY pointclouds to GLTF (GLB) Point Meshes (standalone converter)
- Detect SRP (URP or HDRP) with Assembly Definition Version Defines
- [LudumDare57] Theme: Depths
- 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
Recent Comments
- on Vector3 maths for dummies!
- on UnityHub 3.6.0: Remove Version Control & Cloud Dashboard columns
- on Using RenderDoc with Unity (graphics debugger)
- on UI Scroll View automatic Content height
- on [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
An article by













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