如何检查片段是否位于纹理的边缘

问题描述 投票:0回答:1

我目前正在尝试用 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 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
之后被贬低,因此我们将非常感谢替代方案。

感谢您的帮助,

阿德里安

c++ glsl shader sfml outline
1个回答
0
投票

您是否尝试过对 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)

// ...
© www.soinside.com 2019 - 2024. All rights reserved.