1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
- Shader "Outlined/Post Outline"
- {
- Properties
- {
- _MainTex("Main Texture",2D) = "black"{}
- _SceneTex("Scene Texture",2D) = "black"{}
- }
- SubShader
- {
- Pass
- {
- CGPROGRAM
- sampler2D _MainTex;
- //_TexelSize is a float2 that says how much screen space a texel occupies.
- float2 _MainTex_TexelSize;
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct v2f
- {
- float4 pos : SV_POSITION;
- float2 uvs : TEXCOORD0;
- };
- v2f vert(appdata_base v)
- {
- v2f o;
- //Despite the fact that we are only drawing a quad to the screen, Unity requires us to multiply vertices by our MVP matrix, presumably to keep things working when inexperienced people try copying code from other shaders.
- o.pos = UnityObjectToClipPos(v.vertex);
- //Also, we need to fix the UVs to match our screen space coordinates. There is a Unity define for this that should normally be used.
- o.uvs = o.pos.xy / 2 + 0.5;
- return o;
- }
- half frag(v2f i) : COLOR
- {
- //arbitrary number of iterations for now
- int NumberOfIterations = 20;
- //split texel size into smaller words
- float TX_x = _MainTex_TexelSize.x;
- //and a final intensity that increments based on surrounding intensities.
- float ColorIntensityInRadius;
- //for every iteration we need to do horizontally
- for (int k = 0; k0)
- {
- return tex2D(_SceneTex,float2(i.uvs.x,1 - i.uvs.y));
- }
- //for every iteration we need to do vertically
- for (int j = 0; j < NumberOfIterations; j += 1)
- {
- //increase our output color by the pixels in the area
- ColorIntensityInRadius += tex2D(
- _GrabTexture,
- float2(i.uvs.x,1 - i.uvs.y) + float2
- (
- 0,
- (j - NumberOfIterations / 2) * TX_y
- )
- ).r / NumberOfIterations;
- }
- //this is alpha blending, but we can't use HW blending unless we make a third pass, so this is probably cheaper.
- half4 outcolor = ColorIntensityInRadius * half4(0,1,1,1) * 2 + (1 - ColorIntensityInRadius) * tex2D(_SceneTex,float2(i.uvs.x,1 - i.uvs.y));
- return outcolor;
- }
- ENDCG
- }
- //end pass
- }
- //end subshader
- }
|