2D 이미지에서 픽셀만으로 외각선을 찾기 위해서는 다양한 컨벌루션이 존재하지만 소벨 연산자를 이용한다면 아래의 행렬을 사용했을때 결과가 0이면 외곽선이 없다는 뜻이다.
픽셀 셰이더에서 다음과 같이해서 찾는다.
struct PS_INPUT
{
float2 mUV : TEXCOORD0;
};
sampler2D SceneSampler;
float3x3 Kx = { -1, 0, 1,
-2, 0, 2,
-1, 0, 1};
float3x3 Ky = { 1, 2, 1,
0, 0, 0,
-1, -2, -1};
float2 gPixelOffset;
float4 ps_main(PS_INPUT Input) : COLOR0
{
float Lx = 0;
float Ly = 0;
for(int y = -1; y <= 1; ++y)
{
for(int x = -1; x <= 1; ++x)
{
float2 offset = float2(x,y) * gPixelOffset;
float3 tex = tex2D(SceneSampler, Input.mUV + offset).rgb;
float luminance = dot(tex, float3(0.3f, 0.59f, 0.11f));
Lx += luminance * Kx[y+1][x+1];
Ly += luminance * Ky[y+1][x+1];
}
}
float L = sqrt((Lx*Lx) + (Ly*Ly));
return float4(L.xxx, 1);
}
struct PS_INPUT
{
float2 mUV : TEXCOORD0;
};
sampler2D SceneSampler;
float3x3 K = { -2, -1, 0,
-1, 0, 1,
0, 1, 2};
float2 gPixelOffset;
float4 ps_main(PS_INPUT Input) : COLOR0
{
float res = 0;
for(int y = -1; y <= 1; ++y)
{
for(int x = -1; x <=1; ++x)
{
float2 offset = float2(x,y) * gPixelOffset;
float3 tex = tex2D(SceneSampler, Input.mUV + offset).rgb;
float luminance = dot(tex, float3(0.3f, 0.59f, 0.11f));
res += luminance * K[y+1][x+1];
}
}
res += 0.5f;
return float4(res.xxx, 1);
}