Libgdx 片段着色器绘制意外的边界线

Libgdx 片段着色器绘制意外的边界线,libgdx,shader,fragment-shader,Libgdx,Shader,Fragment Shader,我有一个着色器程序,它将使边界线取决于每个像素周围的alpha值。我希望沿图像添加一条黄色边界线,如下所示: 然而,它并没有给我预期的答案。我最不能理解的是,为什么在图像的边界一侧总是有一条边界线 我的片段着色器代码: varying vec4 v_color; varying vec2 v_texCoords; uniform sampler2D u_texture; uniform vec2 u_imageSize; uniform vec4 u_borderColor; un

我有一个着色器程序,它将使边界线取决于每个像素周围的alpha值。我希望沿图像添加一条黄色边界线,如下所示:

然而,它并没有给我预期的答案。我最不能理解的是,为什么在图像的边界一侧总是有一条边界线

我的片段着色器代码:

varying vec4 v_color; 
varying vec2 v_texCoords;

uniform sampler2D u_texture;

uniform vec2  u_imageSize;
uniform vec4  u_borderColor; 
uniform float u_borderSize;

void main() {
    vec4 color = texture2D(u_texture, v_texCoords);
    vec2 pixelToTextureCoords = 1. / u_imageSize;
    bool isInteriorPoint = true;
    bool isExteriorPoint = true;

    for (float dx = -u_borderSize; dx < u_borderSize; dx++)     
    {
        for (float dy = -u_borderSize; dy < u_borderSize; dy++){
            vec2 point = v_texCoords + vec2(dx,dy) * pixelToTextureCoords;
            float alpha = texture2D(u_texture, point).a;
            if ( alpha < 0.5 )
                isInteriorPoint = false;
            if ( alpha > 0.5 )
                isExteriorPoint = false;
        }
    }

    if (!isInteriorPoint && !isExteriorPoint && color.a < 0.5)
        gl_FragColor = u_borderColor;    
        else
        gl_FragColor = v_color * color;
}
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

varying vec4 v_color;
varying vec2 v_texCoords;

uniform mat4 u_projTrans;
uniform vec2 u_viewportInverse;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}
我的定义代码:

shaderProgram.setUniformf( "u_imageSize", new Vector2(getWidth(), getHeight()) );
                shaderProgram.setUniformf( "u_borderColor", Color.YELLOW );
                shaderProgram.setUniformf( "u_borderSize", 1 );
结果图像(上面的形状没有着色器,下面的形状有着色器):


请为我提供任何类型的指南。

问题是由循环中的纹理坐标分别变为<0.0>1.0引起的。因此,纹理被查找为“出界”。这种情况下发生的情况取决于包裹参数(请参阅。在坐标不在[0.0,1.0]范围内时,向循环中添加范围检查并跳过查找),以解决此问题:

for(float dx=-u\u borderSize;dx1.0 | |点y<0.0 | |点y>1.0)
持续
浮点alpha=纹理2d(u_纹理,点)。a;
如果(α<0.5)
isInteriorPoint=false;
如果(α>0.5)
isExteriorPoint=false;
}
}

我不完全理解您想要达到的目的。您能上传一张所需结果的图片吗?@Nadir抱歉信息不完整。我已在问题中添加了所需图像。请查看。感谢您的帮助。我尝试添加范围检查,但在我的情况下没有什么不同:(除此之外,我还添加了一些额外的信息。请看一下。