Как я могу проверить, лежит ли фрагмент на краю текстуры

В настоящее время я пытаюсь написать простой контурный шейдер в glsl (используя SFML). Я новичок в программировании шейдеров, так что прости меня, если вопрос очевиден.
В любом случае, шейдер отлично работает для обнаружения краев в текстуре, но не может определить границы на краю текстуры.

Изображение рабочей схемы Shader
Изображение рабочей схемы Shader

Изображение контурного шейдера работает неправильно
Изображение контурного шейдера работает неправильно

Вот код моего фрагментного шейдера (у меня есть только фрагментный шейдер)

uniform sampler2D texture;
uniform float outlineThickness;
uniform vec2 textureSize;
uniform vec3 outlineColor;

void main()
{
vec2 offx = vec2(outlineThickness / textureSize.x, 0.0);
vec2 offy = vec2(0.0, outlineThickness / textureSize.y);

float surroundingAlphaSum = texture2D(texture, gl_TexCoord[0].xy + offx).a +
texture2D(texture, gl_TexCoord[0].xy - offx).a +
texture2D(texture, gl_TexCoord[0].xy + offy).a +
texture2D(texture, gl_TexCoord[0].xy - offy).a;

// This pixel
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);

// If one of the surrounding pixels is transparrent --> an edge is detected
if (4.0 * pixel.a - surroundingAlphaSum > 0.0)
pixel = vec4(outlineColor, 1.0);
else
pixel = vec4(0.0); // transparrent

gl_FragColor = pixel * gl_Color;
}

По сути, я ищу способ определить, принадлежит ли соседний пиксель к текстуре или нет.

КСТАТИ:
поскольку gl_TexCoord[0].xy кажется, лишены шейдерной модели #version 120альтернатива будет высоко ценится.

Спасибо за вашу помощь,

Адриан

1

Решение

Вы пробовали пробовать 8 текселей? Похоже, ваше ядро ​​несовершенно в некоторых случаях.

float surroundingAlphaSum = texture2D(texture, gl_TexCoord[0].xy + offx).a +
texture2D(texture, gl_TexCoord[0].xy - offx).a +
texture2D(texture, gl_TexCoord[0].xy + offy).a +
texture2D(texture, gl_TexCoord[0].xy - offy).a +
texture2D(texture, gl_TexCoord[0].xy + offx + offy).a +
texture2D(texture, gl_TexCoord[0].xy + offx - offy).a +
texture2D(texture, gl_TexCoord[0].xy - offx + offy).a +
texture2D(texture, gl_TexCoord[0].xy - offx - offy).a;

// ...

if (8.0 * pixel.a - surroundingAlphaSum > 0.0)

// ...
0

Другие решения

Есть несколько способов обнаружить края. К сожалению, я только что работал с ними в Matlab, но, возможно, ссылка поможет вам написать какую-то функцию.

Исходя из моего прошлого опыта, вы должны работать с матрицами, которые содержат изображение, а затем создать дополнительную матрицу, в которой вы будете вычислять для каждого пикселя, является ли он ребром или нет, с 0 или 1.

0

По вопросам рекламы [email protected]