В настоящее время я пытаюсь написать простой контурный шейдер в glsl (используя SFML). Я новичок в программировании шейдеров, так что прости меня, если вопрос очевиден.
В любом случае, шейдер отлично работает для обнаружения краев в текстуре, но не может определить границы на краю текстуры.
Изображение рабочей схемы 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
альтернатива будет высоко ценится.
Спасибо за вашу помощь,
Адриан
Вы пробовали пробовать 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)
// ...
Есть несколько способов обнаружить края. К сожалению, я только что работал с ними в Matlab, но, возможно, ссылка поможет вам написать какую-то функцию.
Исходя из моего прошлого опыта, вы должны работать с матрицами, которые содержат изображение, а затем создать дополнительную матрицу, в которой вы будете вычислять для каждого пикселя, является ли он ребром или нет, с 0 или 1.