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

时间:2019-07-18 07:55:40

标签: libgdx shader fragment-shader

我有一个着色器程序,它将使边界线取决于围绕每个像素的alpha值。我希望像这样在图像上添加黄色边框:

image

但是,它没有给我期望的答案。我最不明白的是,为什么在图像的一个边界侧总会有一条边界线。

我的片段着色器代码:

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 );

结果图像(上面的形状没有着色器,下面的形状具有着色器):

image

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

1 个答案:

答案 0 :(得分:1)

引起该问题的原因是,循环中的纹理坐标分别变为 <0.0 > 1.0 。因此,“超出范围”查找纹理。在这种情况下会发生什么情况取决于换行参数(请参见glTexParameter。将坐标添加到循环中,并在坐标不在[0.0,1.0]范围内时跳过查找,以解决此问题:

userId