我目前正在尝试用 glsl (使用 SFML)编写一个简单的轮廓着色器。我是着色器编程的新手,所以如果问题很明显,请原谅我。 无论如何,着色器可以很好地检测纹理内的边缘,但无法检测纹理边缘的边界。
这是我的片段着色器的代码(我只有一个片段着色器)
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 transparent --> an edge is detected
if (4.0 * pixel.a - surroundingAlphaSum > 0.0)
pixel = vec4(outlineColor, 1.0);
else
pixel = vec4(0.0); // transparent
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)
// ...