I am trying to make a convolution Shader where the current pixel and the surrounding ones (a total of 9) are multiplied by a kernel matrix. This is my shader, all I am getting is pink…
Shader "Test/Convolution"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 because it uses wrong array syntax (type[size] name)
#pragma exclude_renderers d3d11
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
//gets all pixels around current pixel
float3[9] GetMatrix(sampler2D tex, float2 uv, float4 size)
{
float3[9] c = float3(
tex2D(tex, uv + float2(-size.x, -size.y)).rgb,
tex2D(tex, uv + float2(0, -size.y)).rgb,
tex2D(tex, uv + float2(size.x, -size.y)).rgb,
tex2D(tex, uv + float2(-size.x, 0)).rgb,
tex2D(tex, uv + float2(0, 0)).rgb,
tex2D(tex, uv + float2(size.x, 0)).rgb,
tex2D(tex, uv + float2(-size.x, size.y)).rgb,
tex2D(tex, uv + float2(0, size.y)).rgb,
tex2D(tex, uv + float2(size.x, size.y)).rgb
);
return c;
}
fixed4 Covolution(float3[9] c, float kernal)
{
fixed4 r;
r.r = c[0].r * kernal[8];
r.r += c[1].r * kernal[7];
r.r += c[2].r * kernal[6];
r.r += c[3].r * kernal[5];
r.r += c[4].r * kernal[4];
r.r += c[5].r * kernal[3];
r.r += c[6].r * kernal[2];
r.r += c[7].r * kernal[1];
r.r += c[9].r * kernal[0];
r.g = c[0].g * kernal[8];
r.g += c[1].g * kernal[7];
r.g += c[2].g * kernal[6];
r.g += c[3].g * kernal[5];
r.g += c[4].g * kernal[4];
r.g += c[5].g * kernal[3];
r.g += c[6].g * kernal[2];
r.g += c[7].g * kernal[1];
r.g += c[8].g * kernal[0];
r.b = c[0].b * kernal[8;
r.b += c[1].b * kernal[7];
r.b += c[2].b * kernal[6];
r.b += c[3].b * kernal[5];
r.b += c[4].b * kernal[4];
r.b += c[5].b * kernal[3];
r.b += c[6].b * kernal[2];
r.b += c[7].b * kernal[1];
r.b += c[8].b * kernal[0];
r[3]=1; //alpha
return r;
}
fixed4 frag (v2f i) : SV_Target
{
float[9] kernal = float[9](0,0,0,0,1,0,0,0,0); //identity matrix
float3[9] pixels = GetMatrix(_MainTex, i.uv, _MainTex_TexelSize);
fixed4 c =Covolution(pixels,kernal);
return c;
}
ENDCG
}
}
}
